java中面向对象贯穿整个java体系,是非常重要的,一下为我自己对面向对象一些知识点的总结,
内容是针对进阶学习的,可能不太适用于初学者
构造器
名必须和类名一致/不能定义返回值类型
This
不能用于 static 方法中
普通的直接引用this是指向当前对象本身
形参与成员名字重名,用this来区分:
引用构造函数必须位于构造方法的第一句
super
普通的直接引用super是指向当前对象的父类,用super.xxx来引用父类的成员
子类中的成员变量或方法与父类中的成员变量或方法同名
引用构造函数必须位于构造方法的第一句
instanceof 运算符是二元运算符
左边对象,右边类,判断对象是否是其本类或子类
方法重写
访问权限:子类大于等于父类
返回值类型和声明异常类型:子类小于等于父类
Final
变量不可变,类不能继承,方法只能重载不能重写
Static
在 static 方法中不可直接访问非 static 的成员
在类载入时被初始化,静态变量只能初始化一次且只有一份
静态代码块
若一段代码想在使用某个类时就运行且只运行一次, 就可以写在静态代码块
构造代码块实例代码块
不能创建对象
先于构造方法执行,每次创建对象前都会被调用,用于初始化实例成员的默认值
局部代码块
里面定义的变量方法不能用于外面
用于方法内部,执行顺序由出现的位置决定
继承extends
Java 只有单继承
可以得到父类的全部属性和方法(除了构造器),但未必能用
没有调用 extends默认父类是:java.lang.Object
组合
将父类对象作为子类的属性,就是创建对象
封装
修饰符 同一个类 同一个包中 子类 所有类
private ☆
default ☆ ☆
protected ☆ ☆ ☆
public ☆ ☆ ☆ ☆
关于 protected 的两个细节
若父类和子类在同一个包中,子类可访问父类的 protected 成员,也可访问父类对象的 protected 成员
若子类和父类不在同一个包中,子类可访问父类的 protected 成员,不能访问父类对象 的 protected 成员
多态
出现多态的3个必要条件继承/方法重写/向上转型
对象转型(避免类型转换异常可使用 instanceof 运算符)
接口interface implements
抽象方法
使用 abstract 修饰的方法,没有方法体
抽象类
包含抽象方法的类就是抽象类
定义
JDK8前,接口只能有静态常量/抽象方法
JDK8后,接口可有默认方法(扩展方法)/静态方法
接口的多继承
interface 接口名 [extends 父接口 1,父接口 2…]
内部类
内部类可直接访问外部类的私有属性,但外部类不能访问内部类的内部属性
内部类只是一个编译时概念,一旦编译成功,就会成为完全不同的两个类外部类内部类的成员变量/方法名可以相同
非静态内部类
静态内部类
静态内部类只可访问外部类的静态属性/方法
匿名内部类(也可以用lambda表达式代替)
适合只需使用一次的类
用匿名内部类对接口做实现