初始面向对象
类和对象的关系
类:对对象向上抽取出像的部分、公共的部分以此形成类,类就相当于一个模版。
对象:在某个模版下的具体的产物可以理解为对象,对象就是一个一个具体的实例,就相当于这个模版下具体的产品,万事万物皆对象。
总的来说类是抽象的,对象是具体的。
注意:在开发过程中,先写类,再写对象!
面相过程与面相对象
面向过程是以事件为中心,按照我们编写的代码是根据完成一个步骤的过程来进行。
面相对象是以对象为中心,先把要完成的功能封装成一个一个的对象,通过调用对象的方法或属性来完成功能。
例如:把大象放入冰箱
面相过程思想:
- 打开冰箱门
- 把大象放入冰箱
- 关闭冰箱门
代码实现:
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后面会讲)