文章目录
简介
- 本文是2021/03/25晚上整理的笔记
- 赘述可能有点多,还请各位朋友耐心阅读
- 本人的内容和答案不一定是最好最正确的,欢迎各位朋友评论区指正改进。
显示继承与隐式继承
- 子类继承父类时,会继承父类所有的成员变量(包括私有变量)和成员方法
- 显式继承:子类继承父类后,可以执行的所有非私有操作都是显示继承。
- 隐式继承:子类继承父类后,不可以直接进行私有操作,例如无法直接访问私有变量,此时需要借助Getter and Setter方法
继承的重点
- 继承的作用:代码复用 对父类进行扩展
- 私有属性也可以被继承,但是不能直接访问,需要通过
继承与构造方法
- 子类无法继承父类的构造方法。
- 如果父类提供了无参构造方法,子类会隐含的存在一句super();
- 如果父类没有提供无参构造方法,而是提供了有参构造方法,需在子类的构造方法中显式调用
继承的优点和缺点
- 优点:继承可以对类进行共性抽取,实现代码复用
- 缺点:提高了类与类间的耦合性,使得代码间依赖性强,代码独立性差。用多米诺骨牌来举例,容易造成一错百错的情况。
final关键字
- 修饰类,该类无法被继承
- 修饰方法,该方法无法被重写
- 修饰变量,该变量无法被改变
多重继承时构造方法的执行情况(C是孙子 B是儿子 A是自己)
- C继承B B继承A
public class A {
public A() {
System.out.println("A类无参构造方法被执行");
}
}
public class B extends A{
public B() {
System.out.println("B类无参构造方法被执行");
}
}
public class C extends B{
public C() {
System.out.println("C类无参构造方法被执行");
}
}
public class Test {
public static void main(String[] args) {
C c = new C();
}
}
程序运行结果
A类无参构造方法被执行
B类无参构造方法被执行
C类无参构造方法被执行
- 代码解释:
- new 创建C类对象时,先调用C类对象的构造方法,由于C类继承了B类,C类构造方法中有super( )关键字,调用了B类构造方法。
- B类构造方法执行,由于B类继承了A类,B类构造方法中有super( )关键字,调用了A类构造方法。
- A类构造方法执行。
- 故程序运行结果是如上所写的。
- Object类是所有类的父类,开玩笑地说,Object类是祖宗类。
封装继承多态的描述
- 封装:将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信
息的访问和操作。 - 继承:继承就是子类继承父类的成员变量(属性)和行为(方法),使得子类对象(实例)具有父类的成员变量和方
法,或子类从父类继承方法,使得子类具有父类相同的行为。 - 多态:
- 多态是同一个行为具有多个不同表现形式或形态的能力。
- 多态就是同一个接口,使用不同的实例而执行不同操作
- 多态在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法
方法重写的要求
- 子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表
- 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型
- 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限
子类不能重写父类中声明为private权限的方法 - 子类方法抛出的异常不能大于父类被重写方法的异常
注意:
子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为static的
(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法。
对象类型转换
- 向上造型:向上造型就是父类的引用(栈中)指向子类的对象(堆中)
public class Animal {
String name ;
public void eat(){
System.out.println("动物吃东西");
}
}
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
public class Test {
public static void main(String[] args) {
Animal dog = new Dog();
dog.eat();
}
}
程序运行结果
狗吃骨头
- 向下造型:对象在满足条件的情况下也能进行向下造型,即显式的将父类引用指向的对象转换为子类类型
向下造型的要求是:进行向下造型的对象的运行期类型必须是子类或以子类为根的继承树中的其他类型
public class Animal {
}
public class Dog extends Animal {
}
public class Test {
public static void main(String[] args) {
Animal animal = new Dog();
Dog dog = (Dog)animal;
}
}
编译期类型与运行期类型
- 我们用个例子来说明 父类是Animal 子类是Dog
- Animal animal = new Dog();
- 等号左侧用来声明引用的父类是编译期类型
- 等号右侧用来创建实例对象的子类是运行期类型
静态绑定和动态绑定
- 类的成员变量都是静态绑定的
- 类的成员方法调用时是动态绑定的
instanceof 运算符
- 语法:对象 instanceof 类
- 该表达式为一个boolean表达式,如果对象的类型是后面提供的类或其子类,则返回true,反之返回false
- instanceof看对象运行期的类型进行判断
打印语句会自动调用 toString方法
- System.out.println();是我们常用的打印语句
- 其实这个语句调用了Object类中的toString方法。
- 我们可以通过重写Object类的toString方法来实现我们想要的功能
如图所示,我们得知Object类的toString方法返回值类型为String,参数列表为空
public class Test {
public static void main(String[] args) {
Test test = new Test();
System.out.println(test);
}
@Override
public String toString(){
return "toString方法被调用了";
}
}
程序运行结果
toString方法被调用了
toString方法没有被静态关键字static修饰,不是静态方法,不能直接通过类调用,必须创建对象才可以调用。
在很多类中重写了toString方法,通过哪个对象调用,就使用哪个toString方法,没有则向本类的父类中寻找。