1 Static - 静态变量
1.1 static-静态变量
如果想要多个对象都共享同一个值那我只需要在public后面添加static
public static String teacherName;
只需要对s1进行复制,前面添加static之后也可以用类名进行调用赋值
1.2 static-静态方法和工具类
JavaBean类:
工具类:
测试类:
静态的东西,一般都是共享的,所以跟某一个对象是没有什么关系的 ,所以在静态方法中就没this关键字
了解即可,以前键盘输入方式,现在可以用Scanner,不需要用
2 继承
2.1 继承的概述
子类可以在父类的基础上再次添加方法
2.2 继承的特点和继承体系的设计
Java只支持单继承,不支持多继承,但支持多层继承
单继承:一个子类只能继承一个父类。(一个儿子只有一个爸爸)
不支持多继承:子类不能同时继承多个父类。(一个儿子不能有多个爸爸)
Java只支持单继承、不支持多继承、但支持多层继承
多层继承:子类A继承父类B,父类B可以继承父类C(儿子->爸爸->爷爷)
产生如下问题,多继承就会产生,子类不知道调用两个父类中的哪个方法
子类只能访问父类中非私有的成员
2.3 子类到底能继承父类中的哪些内容
误区1:父类私有的东西,子类就无法继承
误区2:父类中非私有的成员,就被子类继承下来了
父类的构造方法不能被子类继承(父类的构造方法的类名跟子类根本不相同)
虽然子类继承了父类的成员变量但是父类私有的成员变量子类不能直接调用(get/set)
2.4 继承中成员变量和成员方法的访问特点
继承中:成员变量的访问特点
继承中成员变量的访问特点 : 就近原则:谁离我近,我就用谁
继承中:成员方法的访问特点
方法的重写(覆盖):当父类的方法不能满足子类现在的需求,需要进行方法重写
方法的重载跟重写不同,必须保证方法名和参数一致,其他无所谓
继承中:构造方法的访问特点
父类中的构造方法不能被子类继承
子类构造方法中隐藏的super()去访问父类的无参构造
带参构造方法:
this、super关键字
、
3 多态
3.1 认识多态
3.2 多态中调用成员的特点
调用成员变量:编译看左边,运行也看左边
- 编译看左边:javac编译代码的时候,会看左边的父类中有没有在这个成员变量,如果有,编译成功,如果没有编译失败。
- 运行也看左边:java运行代码的时候,实际获取的就是左边父类中成员变量的值
调用成员方法:编译看左边,运行看右边
- 编译看左边:javac编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功,如果没有编译失败。
- 运行看右边:java运行代码的时候,实际上运行的是子类中的方法
3.3 多态的优势和弊端
解决上述问题:只需要变回子类类型就可以了
3.4 多态的综合练习
多态改写如下
4 包和final
4.1 包
4.2 final
final最终的,不可改变的
重新赋值S = new Student()报错,不能改变地址值
常量记录的数据是不能发生改变的,引用数据类型的记录的地址不能发生改变,内部的属性值还是可以改变的。String地址和数值都不能改变(private + final 又没有提供get+set方法)
5 权限修饰符和代码块
5.1 权限修饰符
private 修饰只能在同一个类中去用,不能在同一个包下的其他类去使用(要想用只能用get和set方法) 空着不写 同一个类中或者同一个包下的其他类都可以使用 protected 同一个类,同一个包其他类,不同包下的子类都可以,但是不同包下的无关类不给
5.2 代码块
3.6.2.1 局部代码块
3.6.2.2 构造代码块
3.6.2.3 静态代码块
6 抽象类和抽象方法
虽然抽象类不能实例化也就是不能创建对象,那么要构造方法的作用是什么呢?作用就是子类创建对象时调用super,给子类的属性进行赋值的。
7 接口
7.1 接口
7.2 接口的细节:成员特点和接口的各种关系
实现类实现了最下面的子接口,需要重写这个体系的所有抽象方法Inter1、Inter2是被Inter3继承的,所有Inter3需要实现继承Inter1、Inter2的所有接口
8 接口和抽象类的综合案例
主要原因是创建Person类没有意义,所以定义为抽象类
多学三招:接口中新增方法,接口应用和适配器设计模式
JDK8以后接口中新增的方法
因为如果不重写,在接口的实现类中,就不知道是哪个接口当中的方法,重写之后调用的一定是重写之后的show方法。
接口里面的静态方法不用重写,也不允许重写,只允许通过接口去调用方法
JDK9新增的方法
复习:静态方法只能调用静态方法
适配器设计模式
如果接口中方法很多,实现类只需要使用接口中的某个方法,但是还是得对接口的所有方法进行重写,这样就会非常麻烦,所以我们建立一个适配器对接口中的方法进行空实现,然后实现类继承这个适配器在对方法进行重写即可
因为适配器只是对方法进行空实现,外界创建这个对象没有任何意义,所以加上abstract
9 内部类
9.1 初识内部类
单独存在无意义