一、面向对象编程三大特征
1.1 基本介绍
面向对象编程有三大特征:封装、继承和多态。
二、面向对象编程-封装
2.1 封装介绍
2.2 封装的理解和好处
2.3封装的实现步骤 (三步)
2.4 快速入门案例
class Person {
public String name; //名字公开
private int age; //age 私有化
private double salary; //..
//构造器 alt+insert
public Person() {
}
//自己写 setXxx 和 getXxx 太慢,我们使用快捷键 alt+insert
//然后根据要求来完善我们的代码.
public String getName() {
return name;
}
public void setName(String name) {
//加入对数据的校验,相当于增加了业务逻辑
if(name.length() >= 2 && name.length() <=6 ) {
this.name = name;
}else {
System.out.println("名字的长度不对,需要(2-6)个字符,默认名字");
this.name = "无名人";
}
}
public int getAge() {
return age;
}
public void setAge(int age) {
//判断
if(age >= 1 && age <= 120) {
//如果是合理范围
this.age = age;
} else {
System.out.println("你设置年龄不对,需要在 (1-120), 给默认年龄 18 ");
this.age = 18;//给一个默认年龄
}
}
public double getSalary() {
//可以这里增加对当前对象的权限判断
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
三、面向对象编程-继承
3.1 为什么需要继承
提高代码复用性。
3.2 继承基本介绍和示意图
继承可以解决代码复用,让我们的编程更加靠近人类思维.**当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,**在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过 extends 来声明继承父类即可。
3.3 继承的基本语法
3.4 快速入门案例
//父类,是 Pupil 和 Graduate 的父类
public class Student {
//共有属性
public String name;
public int age;
//私有属性
private double score;//成绩
//共有的方法
public void setScore(double score) {
this.score = score;
}
public void showInfo() {
System.out.println("学生名 " + name + " 年龄 " + age + " 成绩 " + score);
}
}
//子类
public class Pupil extends Student {
public void testing() {
System.out.println("小学生 " + name + "正在考小学数学..");
}
}
//子类
public class Graduate extends Student {
public void testing() {//和 Pupil 不一样
System.out.println("大学生 " + name + " 正在考大学数学..");
}
}
3.5 继承给编程带来的便利
- 代码的复用性提高了
- 代码的扩展性和维护性提高了
3.6 继承的深入讨论/细节问题
- 子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问, 但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问。
- 子类必须调用父类的构造器, 完成父类的初始化。
- 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过。
public Sub() {
//无参构造器
super(); //默认调用父类的无参构造器,可以不写
System.out.println("子类 Sub()构造器被调用....");
}
- 如果希望指定去调用父类的某个构造器,则显式的调用一下 : super(参数列表)。
//当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器 ,如果要修改使用super指定
public Sub(String name) {
super("tom", 30);//调用父类两个参数的构造器
//do nothing...
System.out.println("子类 Sub(String name)构造器被调用....");
}
- super 在使用时,必须放在构造器第一行(super 只能在构造器中使用)。
- super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器。
- java 所有类都是 Object 类的子类, Object 是所有类的基类。
- 父类构造器的调用不限于直接父类!将一直往上追溯直到 Object 类(顶级父类)。
- 子类最多只能继承一个父类(指直接继承),即 java 中是单继承机制。
思考:如何让A类继承B类和C类? 【A 继承 B, B继承C】 - 不能滥用继承,子类和父类之间必须满足 is-a 的逻辑关系。
3.7 继承的本质分析(重要)
/**
* 讲解继承的本质
*/
public class ExtendsTheory {
public static void main(String[] args) {
Son son = new Son();
//内存的布局
//?-> 这时请大家注意,要按照查找关系来返回信息
//(1) 首先看子类是否有该属性
//(2) 如果子类有这个属性,并且可以访问,则返回信息
//(3) 如果子类没有这个属性,就看父类有没有这个属性(如果父类有该属性,并且可以访问,就返回信息..)
//(4) 如果父类没有就按照(3)的规则,继续找上级父类,直到 Object...
System.out.println(son.name);//返回就是大头儿子
//System.out.println(son.age);//返回的就是 39
//System.out.println(son.getAge());//返回的就是 39
System.out.println(son.hobby);//返回的就是旅游
}
}
class GrandPa { //爷类
String name = "大头爷爷";
String hobby = "旅游";
}
class Father extends GrandPa {//父类
String name = "大头爸爸";
private int age = 39;
public int getAge() {
return age;
}
}
class Son extends Father { //子类
String name = "大头儿子";
}
四 super 关键字
4.1 基本介绍
super 代表父类的引用,用于访问父类的属性、方法、构造器
4.2 基本语法
//super 的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用 super 去访问爷爷类的成员;
// 如果多个基类(上级类)中都有同名的成员,使用 super 访问遵循就近原则。A->B->C
4.3super 给编程带来的便利/细节
4.4super 和 this 的比较
本博客引用韩顺平老师Java课程