继承(extends)
父类(基类/超类) 子类(派生类)
格式: class 子类名 extends 父类名 {...}
注意事项: 1.Java支持多层继承 2.子类不能继承父类私有方法 3.通过super访问父类构造方法 4.子类中所有构造方法默认都会访问父类的无参构造方法 5.子类的每一个构造方法的第一条语句默认都是:super();
Java在运行过程中,首先加载class,static静态随之加载;随后进行初始化,创建成员变量和成员方法以及构造方法的分配地址值和内存空间 即:先加载类空壳,后初始化变量和方法
instanceof 测试它左边的对象是否是它右边的类的实例
方法重写
子类中出现了和父类中方法声明一模一样的方法,相当于子类覆盖了父类 方法重写作用:子类在继承父类的同时有自己特有的特点时使用方法重写
super
super代表父类存储空间的标识
注意: 1.子类中必须有一个访问父类的构造方法的入口 2.this和super语句必须出现在第一条语句上(否则父类会进行多次初始化) 3.子类构造方法中第一句之前默认有一个super();它仅仅表示分层初始化(先初始化父再子)
super和this区别:
super(访问父类) this(访问本类)
调用成员变量 super.成员变量 this.成员变量
调用构造方法 super(...) this(...)
调用成员方法 super.成员方法 this.成员方法
多态
同一个对象在不同时刻体现出来的不同状态,提高了代码的扩展性
前提
1.要有继承关系 2.要有方法重写 3.要有父类引用指向子类对象 父类 f = new 子类();
三种方式
具体类多态
抽象类多态
接口多态
成员访问特点
1.成员变量 编译看左边,执行看左边 (因为对象的类型是父类,调用父类变量) 2.构造方法 创建子类对象的时候,访问父类构造方法对父类进行初始化 3.成员方法 编译看左边,执行看右边 (成员方法存在方法重写,父类被子类覆盖,显示子类) 4.静态方法 编译看左边,执行看左边 (静态只和类相关,不算方法重写,仍是父类)
对象间的转型问题
多态中会存在无法使用子类特有功能的情况。若重新创建(new)子类,会增加内存空间并且在逻辑上不合理,此时可以采用转型
向上转型 Father f = new Son(); f顶着父类的帽子,看起来是父类实际是子类
向下转型 Son s = (Son) f; 摘下帽子,外表上(形式上)由父类化为子类,实际上一直是子类没变
内存空间分配
过程: 首先方法区依次加载所有类,随后静态main方法随之加载; 随后栈中加载引用类型Animal a,并在堆中分配地址值和内存空间,栈中的引用类型通过地址值指向堆中new Dog(); 随后执行Dog d =(Dog) a;,把a赋值(地址值)给d,将Dog d通过地址值指向堆中new Dog(); 随后执行a = new Cat();,首先创建Cat()的地址值和内存空间,再将新地址值赋给a;
最后Dog dd = (Dog) a; 会出现运行异常:ClassCastException, 即类型转换异常(不能猫转为狗),一般出现在向下转型中
接口
关键字:interface
类实现接口用implements表示: class 类名 implements 接口名 {}
特点
1.接口不能实例化,但是可通过多态的方式进行实例化 2.接口的子类一般是具体类(也可以是抽象类,但是意义不大),要重写接口中所有抽象方法
接口中成员特点: 变量 接口中的变量默认是常量,并且是静态的 默认修饰符:public static final 构造方法 没有构造方法,因为接口主要是用来扩展程序的,没有具体存在 所有的接口子类都继承自Object 成员方法 只能是抽象方法 默认修饰符:public abstract
类与接口
类与接口之间是实现关系,可以单或多实现,还可以在继承一个类的同时实现多个接口
接口与接口之间是继承关系,可以多继承
抽象类定义共性功能;接口定义扩展功能



