类和对象
类的成员
1字段/属性/成员变量
初始化方法:就地初始化、构造方法、代码块
2方法:普通方法、静态方法
3代码块:普通代码块、实例代码块、静态代码块
4内部类
5接口
执行顺序:静态方法 -> 静态代码块 - > 普通方法 -> 普通/实例代码块 -> 构造方法
注:静态代码块只能初始化静态变量
关键字
1.final
1.1修饰变量
表示常量,无法修改
1.2修饰类
该类无法被继承
2.static 脱离对象,与类相关
2.1修饰属性
同一个类的不同对象共用一个静态属性
2.2修饰方法
静态方法可以访问静态数据成员,并可以更改静态数据成员的值
静态方法不能使用非静态数据成员,和调用非静态方法
this和super不能在静态上下文使用
注:只要跟实例相关 ,静态方法不能use。
2.3修饰代码块即静态代码块
功能:初始化静态成员属性
不管生成多少对象,静态代码块只执行一次,并且最先执行的
3.super
获取到父类对象的引用
3.1调用父类构造器
super() 必须写在子类构造方法的第一行,否则编译不通过
3.2调用父类的普通方法
4.abstract
4.1修饰类
抽象类不能被实例化,目的是被继承(抽象类可以有非抽象方法)
4.2修饰方法
抽象方法没有方法体,目的是被覆写
面向对象的特性
包
静态导入包中的静态方法和字段,更方便的写代码
继承 is-a
范围 | private | default | protected | public |
---|---|---|---|---|
同一个包中的同一个类 | √ | √ | √ | √ |
同一个包中的不同类 | √ | √ | √ | |
不同包的子类 | √ | √ | ||
不同包的非子类 | √ |
组合 has-a
多态
向上转型:父类引用指向子类的实例
直接赋值
方法传参
方法返回
补:向下转型:子类引用指向父类对象
动态绑定
当子类和父类存在同名方法时,程序运行时确定调用子类还是父类的方法
方法重写override
子类实现父类的同名方法,并且参数的类型和个数和返回值类型完全相同。
抽象
抽象类不能被实例化,目的是被继承(抽象类可以有非抽象方法)
抽象方法没有方法体,目的是被覆写(权限不能是private)
public abstract class AbstractTest {
//成员变量
private int a;
int b;
protected int c;
public int d;
//构造方法
public AbstractTest() {
}
//抽象方法
public abstract void method1();
//普通方法
public void method2() {
}
}
接口
只能包含public的抽象方法,静态常量
接口不能被单独实例化
接口可以继承(extends)多个父接口
public interface InterfaceTest {
//成员变量->静态常量,权限只有public
int A = 0;
//没有构造方法
//只有抽象方法 故public abstract可省略
void method1();
//没有普通方法
}
抽象和接口的区别
抽象可以包含普通字段和方法,子类不需重写
接口的子类必须重写接口的所有抽象方法
抽象类可以实现多个接口,接口不能继承抽象类