《Java黑皮书基础篇第10版》 第11章【笔记】

第十一章

11.1 引言

11.2 父类和子类

子类继承它的父类中所有可访问的数据域和方法(不包括private修饰符修饰的方法和构造方法)

11.3 使用super关键字

关键字super指代父类,用于调用父类中的普通方法和构造方法

对于调用构造方法:

必须使用super(), 而且这个调用必须是构造方法的第一条语句

构造方法链:在Java中,任何class的构造方法,第一行语句必须是调用父类的构造方法。如果没有明确地调用父类的构造方法,编译器会帮我们自动加一句super();。任何情况下,使用构造方法构造一个类的实例,在执行构造方法内的代码之前(this()除外,如果有this(),就先执行this,调用类内部的其他构造方法),会沿着继承链调用所有父类的构造方法,这就是构造方法链。调用到最后一个父类时,再按原路返回依次执行调用过的构造方法的方法体。

因此,一般情况下,最好能为每个类定义一个无参构造方法,避免错误

对于调用普通方法:

使用super.方法名(参数);

11.4 方法重写

要重写一个方法,需要在子类中使用和父类一样的签名(即方法名+参数列表)以及一样的返回值类型来对该方法进行定义。

不可以重写private修饰的方法

11.5 方法重写与重载

方法重写具有相同的返回值类型、方法名和参数列表;方法重载具有相同的返回值类型(通常情况下)和方法名,但是不同的参数列表

方法重写发生在通过继承的不同类中;方法重载可以发生在同一个类中,也可以发生在通过继承的不同类中。因此,我们使用@Override来判断其标注的方法是否重写了父类的一个方法,来判断这是不是一个合法的方法重写。

11.6 Object类及其toString()方法

Java中的所有类都继承自java.lang.Object类

在Object类中有一个toString()方法,默认情况下,它返回一个由该对象所属的类名 、@符号以及该对象十六进制形式的内存地址组成的字符串,例如Loan@15037e5。我们可以通过重写这个方法来获得更有意义的信息。

11.7 多态

Person p = new Student();

多态意味着父类型的变量可以引用子类型的对象。

11.8 动态绑定

Person p = new Student();

在Java中,实例方法的调用是基于运行时对对象类型(new Student();)的动态调用,并不是基于引用变量(Person p)的类型

11.9 对象转换和instanceof运算符

对象可以进行向上转型和向下转型

Person p1 = new Student(); // upcasting, ok
Person p2 = new Person();

//p1表示Student实例,可以转型
Student s1 = (Student) p1; // ok
//p2表示Person实例,不能把父类Person变成子类Student
Student s2 = (Student) p2; // runtime error! ClassCastException!

instanceof实际上判断一个变量所指向的实例是否是指定类型,或者这个类型的父类,例如

Person p = new Person();
//判断一个变量p所指向的实例new Person()是否是指定类型Person,或者是Person()的父类
System.out.println(p instanceof Person); // true
System.out.println(p instanceof Student); // false

Student s = new Student();
//判断一个变量s所指向的实例new Student()是否是指定类型Student,或者是Student()的父类Person
System.out.println(s instanceof Person); // true
System.out.println(s instanceof Student); // true

你可能会奇怪为什么必须进行类型转换。变量 myObject 被声明为 Object。声明类型 决定了在编译时匹配哪个方法。使用 myObject.getDiameter() 会引起一个编译错误,因为 Object类没有getDiameter方法。编译器无法找到和myObject.getDiameter()匹配的方法。 所以,有必要将 myObject 转换成 Circle 类型,来告诉编译器 myObject 也是 Circle 的一个 实例。

Object myObject = new Circle();

if (myobject instanceof Circle) {
    
    
	System.out.println("The circle diameter is " +
  	((Circle)myobject).getDiameter());
}

对象成员访问运算符(.)优先于类型转换运算符。使用圆括号保证在点运算符(•)之前进行类型转换,例如:

((Circle)object).getArea();

转换基本类型值创建一个新的值,而转换一个对象引用不会创建一个新的对象

int age = 45;
byte newAge = (byte)age; // A new value is assigned to newAge

Object o = new Circle();
Circle c = (Circle)o; // Refenerce Variable o and c point to the same object

11.10 Object 类的 equals 方法

如同toString()方法,equals(Object)方法是定义在Object类中的另外一个 有用的方法。

11.11 ArrayList 类

Java 提供 ArrayList 类来存储不限定个数的对象。

11.12 对于列表有用的方法

可以复制Array中的元素新建一个ArrayList,也可以把ArrayList中的元素复制到Array中

ArrayList提供了很多有用的方法,例如排序,打乱数组,算最大值最小值等

11.13 示例学习:自定义栈类

11.14 protected数据和方法

经常需要允许子类访问定义在父类中的数据域或方法,但不允许非子类访问这些数据域 和方法。可以使用关键字 Protected 完成该功能。

11.15 防止扩展和重写

一个被final修饰的类和方法都不能被扩展。被final修饰的数据域是一个常数。

猜你喜欢

转载自blog.csdn.net/weixin_40020256/article/details/130418442
今日推荐