初始面向对象
类和对象的关系
类:对对象向上抽取出像的部分、公共的部分以此形成类,类就相当于一个模版。
对象:在某个模版下的具体的产物可以理解为对象,对象就是一个一个具体的实例,就相当于这个模版下具体的产品,万事万物皆对象。
总的来说类是抽象的,对象是具体的。
注意:在开发过程中,先写类,再写对象!
面相过程与面相对象
面向过程是以事件为中心,按照我们编写的代码是根据完成一个步骤的过程来进行。
面相对象是以对象为中心,先把要完成的功能封装成一个一个的对象,通过调用对象的方法或属性来完成功能。
例如:把大象放入冰箱
面相过程思想:
- 打开冰箱门
- 把大象放入冰箱
- 关闭冰箱门
代码实现:
public class Test01{public static void main(String[] args){openss();putIn();closes(); }public static void openss(){System.out.println("打开冰箱门");}public static void putIn(){System.out.println("把大象放进冰箱");}public static void closes(){System.out.println("关闭冰箱");} }
面向对象思想:
-
先找类(大象,冰箱,测试类)
-
找动作
- 冰箱:可以开门和关门
- 大象:可以进入冰箱
- 测试类:main方法
-
测试类:创建大象和冰箱的具体对象,调用其功能。
代码实现:
public class Test11{public static void main(String[] args){Refrigerator refrigerator = new Refrigerator();//创建冰箱对象Elephant elephant = new Elephant();//创建大象对象//调用方法refrigerator.openss();elephant.move();refrigerator.closes();}}class Refrigerator{public static void openss(){System.out.println("打开冰箱门");}public static void closes(){System.out.println("关闭冰箱");}}class Elephant{public static void move(){System.out.println("大象进入冰箱");}
}
类的编写
- 给类起一个见名知意的名字,将首字母大写并且遵循之前所讲到的驼峰命名原则。
- 类的特性编写,特性即类的属性部分。
- 类的功能编写,功能即类的方法部分。
代码实现:
public class Person {String name;char sex;int age;public void eat(){System.out.println("吃饭");}public void sleep() {System.out.println("睡觉");} public static void method() {System.out.println("静态方法");}
}
对象的创建和使用
-
创建格式:类名 对象名 = new 类名
-
给对象的属性赋值:对象名.属性名 = 值
-
调用对象的方法: [返回值类型名字 = ] 对象名.方法名(参数列表);
代码实现:
public class Test01 {public static void main(String[] args) {//创建对象Person p = new Person();//设置属性p.name = "胡歌";p.sex = '男';p.age = 41;//获取属性System.out.println(p.name);System.out.println(p.sex);System.out.println(p.age);//调用成员方法p.eat();p.sleep();//调用静态方法Person.method();}
}
对象的创建过程
- 在第一次遇到一个类的时候,对这个类要进行加载,只加载一次。
- 创建对象,在堆中开辟空间
- 对对象进行初始化操作,属性赋值都是默认的初始值。
- new关键字调用构造器,执行构造方法,在构造器中对属性重新进行赋值
内存分析
创建多个对象的内存分析:
public class Test01 {public static void main(String[] args) {Person p1 = new Person();p1.name = "胡歌";p1.sex = '男';p1.age = 41;System.out.println(p1.name);System.out.println(p1.sex);System.out.println(p1.age);p1.eat();p1.sleep();System.out.println("-----------------------------");Person p2 = new Person();p2.name = "迪丽热巴";p2.sex = '女';p2.age = 18;System.out.println(p2.name);System.out.println(p2.sex);System.out.println(p2.age);p2.eat();p2.sleep();}
}
内存分析:
注意:
- 类的class文件只加载1次
- 成员变量:每个对象独享一份
- 成员方法里的this表示调用该方法的对象(this后面会讲)