面向对象(OOP)
1、什么是面向对象?
-
面向对象编程(Object-Oriented Programming)
-
本质:以类的方式组织代码,以对象的组织(封装)数据
-
三大特征:封装、继承、多态
-
从认知的角度,先有对象后有类(把一堆老师抽象成教师类)
-
从代码的角度,先有类后有对象(在教师类中new出来老师)
2、创建与初始化对象
public class Application {
public static void main(String[] args) {
//类是抽象的,需要实例化
Student student1 = new Student();
Student student2 = new Student();
student1.name = "小明";
student2.name = "小红";
student1.age = 3;
student2.age = 3;
System.out.println(student1.name);
System.out.println(student2.name);
System.out.println(student1.age);
System.out.println(student2.age);
student1.study();
student2.study();
}
}
public class Student {
//属性
String name;
int age;
//方法
public void study(){
System.out.println(this.name + "在学习");
}
}
3、构造器详解
一个类即使什么都不写,他也会存在一个方法
类中的构造器也称为构造方法,实在进行创建对象的时候必须要调用的。并且有以下两个特点
- 必须和类的名字相同
- 必须没有返回类型,也不能写void
注:1、一旦定义了有参构造,无参就必须显示定义
生成构造方法的快捷键为 ALT + INS
public class Application {
public static void main(String[] args) {
//Person类中即使什么都不写,也能new出来一个对象,这是因为类中存在编译器送的无参构造
Person person = new Person(); // 调用无参构造
System.out.println(person.name);
Person person1 = new Person("小红"); // 调用有参构造
System.out.println(person1.name);
}
}
public class Person {
String name;
//无参构造
//作用:1、使用new关键字,本质是在调用构造器(必须要有构造器)
// 2、实例化初始值
public Person(){
this.name = "小明";
}
//有参构造 :一旦定义了有参构造,无参就必须显示定义
public Person(String name){
this.name = name;
}
//ALT + INS (快捷键构造)
//都选中为有参构造,什么都不选为无参构造
}
4、创建对象的内存分析
1)代码:
public class Application {
public static void main(String[] args) {
Student student1 = new Student();
student1.name = "小明";
student1.age = 3;
student1.study();
System.out.println(student1.name);
System.out.println(student1.age);
Student student2 = new Student();
}
}
public class Student {
String name;
int age;
public void study(){
System.out.println(this.name + "在学习");
}
}
2)内存图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QdauyJN8-1626619829348)(C:\Users\宸\AppData\Roaming\Typora\typora-user-images\image-20210717130004161.png)]
3)分析:
public class Application {
public static void main(String[] args) {
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wHsKX6RL-1626619829350)(C:\Users\宸\AppData\Roaming\Typora\typora-user-images\image-20210717131137740.png)]
Student student1 = new Student();
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jm5ISSUa-1626619829352)(C:\Users\宸\AppData\Roaming\Typora\typora-user-images\image-20210717132331557.png)]
student1.name = "小明";
student1.age = 3;
student1.study();
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LYWO7q4w-1626619829354)(C:\Users\宸\AppData\Roaming\Typora\typora-user-images\image-20210717132529995.png)]
Student student2 = new Student();
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1eEGRE8f-1626619829355)(C:\Users\宸\AppData\Roaming\Typora\typora-user-images\image-20210717132956049.png)]
5、封装
-
我们的程序追求 “高内聚,低耦合”; 高内聚:类内部数据的操作细节由自己完成,不允许外部干涉; 低耦合:尽量暴露少量的方法给外部使用
-
封装就是数据的隐藏
-
关于封装只需要记住:私有属性,getter/ setter
-
ALT + INS 快捷键可以快速生产 getter/setter 方法
6、继承
-
继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模
-
JAVA中类只有单继承,没有多继承(一个son只能有一个father)
-
JAVA中所有的类都直接或间接继承 Object 类
-
CTRL + H 快捷键可以打开继承关系树,查看所有的继承关系
-
super / this
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WZT8kNEW-1626619829356)(C:\Users\宸\AppData\Roaming\Typora\typora-user-images\image-20210718221202921.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M2AM0q2U-1626619829357)(C:\Users\宸\AppData\Roaming\Typora\typora-user-images\image-20210718220812593.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sj4fYne0-1626619829357)(C:\Users\宸\AppData\Roaming\Typora\typora-user-images\image-20210718220937562.png)]
-
注:1、父类中私有的属性或方法无法在子类中用super继承 . 2、父类中没有无参构造,则子类中也无法存在无参构造 . 3、super 和 this 不能同时调用构造方法,因为两者都必须在第一行
-
方法的重写
-
重写都是方法的重写,和属性无关
-
ALT + INS 快捷键可以快速重写方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FY5zavd2-1626619829358)(C:\Users\宸\AppData\Roaming\Typora\typora-user-images\image-20210718223150474.png)]
-
总结:1. 重写需要有继承关系,子类重写父类的方法!子类的方法必须和父类的一致!!方法体不同!!!
2.参数列表必须相同
3.修饰符的范围可以扩大,但不能缩小 e.g. 父类是public,子类不能是private (public->protected->default->private)
4.抛出的异常的范围,可以被缩小,不能被扩大
-
为什么要重写:
- 父类的功能,子类不一定需要,或者不一定满足
-