继承:
继承需要我们学习的点:
- 什么是继承,继承的好处
- 继承的特点
- 子类到底能继承父类的那些内容?
- 继承中:成员变量的访问特点
- 继承中:成员方法的访问特点
- 继承中:构造方法的特点
- This,super使用总结
什么是继承,继承的好处:
继承是面向对象的三大特征之一,可以让类跟类之间产生子父关系,可以把多个子类重复的代码抽取到父类。
继承的格式:
Public class 子类 extends 父类{}
构造方法一定是不能被继承的,应为构造方法和类的名字是一样的,但是继承的子类的名字不可能和父类一致,所以构造方法是不能被继承的
和文件名一致的类才能被public修饰,其他的不写修饰词就行了。
成员变量是可以直接使用的。对于公有的变量(我们把这个变量看成一本书),子类相当于直接复制了一份,而对于私有的变量,父类里面装的还是书,而子类继承的是一个带有保险箱的书,我们需要使用get或者set来打开这个保险箱然后拿到这里面的书
对于方法只有虚方法才能被继承下来:哪些是虚方法?第一没有被static修饰的,第二没有被private修饰的,第三没有被final修饰的,这些方法才能被调用。
继承中:成员变量的访问特点:就近原则
在这里打印的就是ziShow,如果我们把Sring name = “ziShow”给删除那么就赋值为Zi,如果name都删掉就会报错。
如果我们使用this就会在本类里面去找name 如果是super就会在父类里面去找
在这里打印的就是ziShow,如果我们把Sring name = “ziShow”给删除那么就赋值为Zi,如果name都删掉就会报错。
如果我们使用this就会在本类里面去找name 如果是super就会在父类里面去找
继承中:成员方法的访问特点:
也是就近原则
也是就近原则,我觉得这个书上讲得比较好
这个继承相当于延深,拓展的意思当this就是指定当前类,super就是指定前面一个类
继承中构造方法的使用特点:
如果我们想要使用父类中的有参构造就可以使用super(参数1,参数2)
This super使用总结
多态
多态的应用场景就是注册场景,老师和学生都要进行注册,但是总不能写两个注册的方法吧,只能是使用多态将老师和学生的父类作为注册方法里面的变量
多态调用成员变量和成员方法的区别:
首先创建一个多态对象: person zi = new student();
假设里面有一个String类型的name(这个name子类里面有父类里面也有) 和 成员方法show当我们调用name的时候,这个name的值是父类里面的值,当我们调用成员方法时候调用的是子类里面的成员方法
调用成员变量的时候:编译看左边,运行看左边
调用成员方法的时候:编译看左边,运行看右边
多态的弊端:当子类里面含有父类里面没有的方法是,我们调用这个多态对象中的特有方法,就会报错。
解决方法:我们可以使用强制类型转化,将一个范围更大的多态类型转换为范围更小的子类对象。
我们使用强制类型转换的时候不能瞎转:
Person man = new student();
Student a = (student) man;
这样就是合法的
但是如果我们是这样的:
Person man = new student();
Cat a = (cat) man;
这样子进行转化就会报错
所以当我们在写创建注册页面的时候,我们可以先用多态的方式将各个成员先接收下来 然后使用 (对象)intanceof(类):这个对象是不是这个类,如果是就强制类型转换,然后就可以使用子类里面的特有方法。
这个强制类型转换可以些简单一点
(对象)intanceof(类) b(这个b是我们要强制类型转换的对象名)
public class map {public static void main(String[] args) {Animal a = new Dog();a.show();if(a instanceof Dog b){b.ha();}}
}
class Animal{public void show(){System.out.println("吃饭");}
}
class Dog extends Animal{public void show(){System.out.println("在吃骨头");}public void ha(){System.out.println("狗在笑");}
}
class Cat extends Animal{public void show(){System.out.println("在吃鱼");}public void sad(){System.out.println("猫在哭");}}
包:
Final关键字:它能够修饰方法 类 变量
如果final修饰的是一个方法:表明这个方法是最终方法,不能被重写
如果final修饰的是一个类:表明这个类是最终类,不能被继承
如果final修饰的是一个变量:那么这个变量就不叫变量,就叫常量了,只能被赋值一次
值得注意的是最后一点:当我们使用final修饰一个引用数据类型的时候我们是可以改变里面的属性的,但是我们不能改变这个引用数据类型的地址值,其实就是不能使用new一个新的引用数据类型
权限修饰符:
代码块:
局部代码块的功能就是节约内存:减少摸一个变量的使用寿命周期,或者一个语句的使用寿命
静态代码块:
静态代码块的格式:
Static{我们想要执行的语句}
执行时机:随着类的加载而加载,并且只执行一次,这句话换个意思:只有当我们创建第一个对象的时候才会调用静态代码块里面的内容,之后我们再创建对象的时候就不会执行静态代码块里面的内容了,这就是随着类的加载而加载
抽象类:
就是为了让那种模棱两可的方法在继承子类的时候必须重写,为什么要这么做呢?假设我们要写一个类 名字叫人了,然后人类中都必须工作,在学生这个群体中工作是学习,而在老师这个群体中工作就是教书,那我们在写这个方法的时候我们必须要重写,为了提醒程序员要重写,所以我们呢需要写一个抽象方法,含有抽象方法的类就叫做抽象类。
抽象类不能创建对象
那种@加上什么的,这个就是在提醒你这个方法是要重写的,从父类继承的方法是一个抽象类方法
强制子类必须要按照程序员的思路来写
接口可以理解为一种规则
这张图可以帮助我们很好的理解什么叫接口