类与对象

对象

每个可以进行研究的任何事物都可以当作一个对象,如整数、棋盘、沙发、狗、飞机...,每个对象都有自己的行为状态,比如他家的狗的状态有颜色、品种、名字;行为有吃、睡觉、玩耍

通过观察现实的种种事物,把具有共同特征的一类事物抽象出来得到一个类;比如金毛犬、比特犬、田园犬都是狗,是狗类,再抽象一点就是动物类,可以称狗类是动物类的子类。

用类描述这类事物的共同特征(行为和状态),如狗都有名字、年龄、品种,都会玩耍、吃饭;用属性代替状态,方法代替行为

class Dog{//这类的名字是狗,简称狗类
//3个属性
int age;//狗的年龄
String sex;//狗的性别
String color;//狗的颜色
String breed;//狗的品种

//吃饭的方法
void eat(){
System.out.println("狗边吃饭边打tom猫");
}
//睡觉的方法
void sleep(){
System.out.println("狗满足的打起了瞌睡");
}

//通过构造方法创造不同的狗对象(暂时不用懂)
public Dog(int age,String sex,String breed,String color){
this.age = age;
this.sex = sex;
this.breed = bredd;
this.color = color;
}
}


实例化

既然类描述了某类事物的共同特征,那么可以把类当成模板,只需要创建时指定不同的参数,如年龄、品种,就可以用来创建不同的对象,这个过程就叫实例化

例:金毛、比特都是狗,甚至同一种品种的狗,但不同的狗性别、年龄、习惯各有不同。可以把dog类当作模板,使用new关键字调用构造方法传进参数创建不同的对象

public static void main(String[] args){
//创建一个3岁、性别为公、品种为金毛犬、颜色为黄色的狗对象
Dog dog1 = new Dog(3,"公","金毛犬","黄色");

//创建一个1岁、性别为母、品种为比特犬、颜色为灰色的狗对象
Dog dog2 = new Dog(1,"母","比特犬","灰色");

//金毛犬品种的这个狗开始在睡觉
dog1.sleep();
}

面向对象_实例化

面向过程与面向对象

面向过程

碰到了一个问题,需要解决。面向过程是分析出解决问题所需要的步骤,先做什么,再做什么...然后用方法把这个步骤一步一步实现,使用时依次调用就可以了(自顶而下、逐步求精)

例:新学期学生到校注册流程

面向对象_javase_02

假如这些信息要存到txt文件中,按照以上步骤解决问题,如第一步把学生的年龄、身份证号等写入文件中,编写一个方法实现它,需要的时候再调用(若某一步太过繁杂,难度很大,可以将此步再次细分)

public static void main(String[]args){
addInformation(12,"420425201209099090","阿衰");
transaction(9000);
addStudent(12,"420425201209099090");
}
public void addInformation(int age,String idNumber){
//把年龄和身份证号写入登记表文件中...略
}
public void transaction(int money){
//减去学生银行卡号的钱,增加学校的钱...略
}
public void addStudent(int age,String idNumber){
//把认证过的人信息添加到班级中,成为学生
}


面向对象

不再针对解决问题的先后步骤,而是先从问题中分析出完成事件的有哪些要素和参与对象,设计好模板(类),创建出对象,描述出各个对象在整个过程中发生的动作与行为、与其他对象的交互

例:上述有学生、老师、学校、班级,可以先定义类描述共同特征,通过实例化创建对象,让这些对象去执行相应的动作完成学生的注册

public class Student{
int age;
String idNumber;
String name;

public Student(int age,String idNumber,String name){
this.age = age;
this.idNumber = idNumber;
this.name = name;
}

public void decrease(int money){
//扣阿衰的钱...略
//1.获取阿衰的银行卡号
//2.卡-money
}
}


其余的类略,省去判断环节(if,else)

public static void main(String[]args){
//创建对象(实例化)
Student aShuai = new Student(12,"420425201209099090","阿衰");
School school = new School("怕踢中学");
Teacher jinChengWu = new Teacher("金乘五","班主任","初二3班");
Class c = new Class("初二3班",39);
school.addTeacher(jinChengWu);
school.addClass(c);

//怕踢中学添加阿衰的信息
school.addStudent(aShuai);

//阿衰交钱,学校加钱
int money = 9000;
aShuai.decrease(money);
school.increase(money);

//班级添加阿衰信息
c.addStudent(aShuai);
}


面向过程与面向对象的区别

面向过程

优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。

缺点:没有面向对象易维护、易复用、易扩展

面向对象

优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护

缺点:性能比面向过程低

当逻辑比较简单时,使用面向过程能够更快的实现功能,而面向对象要设计出需要的类,考虑需要的属性和方法,很麻烦;

当逻辑比较复杂时,采用面向对象的思维方式更贴近生活,更容易维护,在使用了配置文件和接口后,基本不修改原有代码,就可以新增功能,而面向过程一环扣一环,每一步过程的结果都是下一步的前提条件,有了新的需求,又要全盘修改

面向对象并不与面向过程对立,面向过程的程序设计是面向对象的基础,而从全局的角度来看采用面向对象,但对象调用的方法内部仍是面向过程思想来设计的,如阿衰扣钱的方法里内部使用面向过程的方法解决