Java入门-第六章继承和嵌入类-读书笔记

第六章

继承:子类继承超类的成员变量和方法(类的静态初始化块,实例初始化块和构造方法都不是成员不会被继承)
嵌入类:指在其他类的内部定义的类,包含嵌入类的类可称为外围类。嵌入类可细分为静态成员类、非静态成员类、局部类和匿名类4种。

6.1 继承

直接超类
直接子类

6.1.1 extends短语

通常把一个类A称为另一个类C的子类,是指满足下面条件之一者:

  • 类A是类C的直接子类。
  • 存在一个类B,类A是类B的子类,类B是类C的子类。

在类的定义中,如果缺省extends短语,则object类被称为当前定义类的直接超类。
Java不支持多重继承,extends只能指定一个类。被指定的类必须是非final的,一个final类不能有子类。

6.1.2 类成员

1、变量和方法被称为类的成员,可通过类或类实例访问或调用。
2、类中静态初始化块,实例化块,构造方法只能在装入或实例创建时由系统隐含调用。
3、被声明为privte的成员不会被子类继承,若超类和子类不在同一个包内,,则类中没有用public 、protected修饰的成员不会被子类继承。

6.1.4 成员变量隐藏

成员变量隐藏:是指在子类中定义了一个直接超类中的某个成员变量同名的成员变量,从而使直接超类中的那个成员变量不能被子类继承。

1、当出现成员变量隐藏时,在超类类体代码中用简单变量名访问的一定是超类中的成员变量,而在子类类体代码中用简单变量名访问的则一定是定义在子类中的成员变量。
2、可以用下列格式访问超类中被隐藏的成员变量。
super.<变量名> //在子类类体类,访问直接超类中被隐藏的成员变量。
((<超类名>)<子类实例引用>).<变量名>。//访问指定超类中被隐藏的成员变量
<超类名>.<变量名> // 访问指定超类中被隐藏的类变量
3、super 和 this 都表示对当前对象的引用。区别: this编译器的类型为方法体所在的类,super的编译器类型则为当前类的直接超类。super和this都应该在列的实例方法中使用。

6.1.5 方法覆盖

指在子类中定义了一个与直接超类中的某个实例方法是有相同方法签名的实例方法,从而使直接超类中的那个方法不能被子类继承。要求覆盖方法与被覆盖方法之间:
1、返回类型相同
2、访问级别不能低
3、不能抛出更多的受检查例外的类型。
4、方法覆盖 与成员变量隐藏的区别
1⃣️在子类中访问直接超类中被覆盖的方法,可以使用包含关键字super的方法访问表达式,即super.<方法名>([实参表]),除此之外,无法通过提升实例引用类型来访问超类中被覆盖的方法。
2⃣️当采用((<超类名>)<子类实例引用>).<方法名>([<实参表>])的格式调用方法,系统首先会在编译时检查嗲用方法是否为指定超类的成员。在运行时,系统则调用子类中相应的成员方法。
也就是说,如果存在方法覆盖,改革是实际调用的还是子类中定义的覆盖方法而不是超类中的覆盖方法。
需要看课本的例子理解比较清晰,p136【例6-4】

6.1.6 构造方法

6.1.7 扩展抽象类

1、一个抽象类的任何非抽象子类必须提供该抽象类的所有抽象方法的实现。
2、一个类只有覆盖实现其超类中的所有的abstract方法才能被定义为非抽象类,否则也只能被定义为抽象类。
3、抽象类中的抽象方法不允许被定义为private,因为这样的方法不能被任何子咧继承并覆盖实现。
4、抽象咧被看作是对其所有子类的共同行为的描述。

6.2 嵌入类

又称内部类,只在其他类的内部定义的类。包含嵌入类的类称为外围类。
分为:静态成员类,非静态成员类,局部类和匿名类4种。

6.2.1 静态成员类

1、静态成员类可以用修饰符private、protected、public、或默认指明其访问级别。静态成员类不能访问外围类中的非静态数据和方法
2、调用类的static方法不需要类的实例存在。创建静态成员类的实例不需要外围类的实例存在。
3、静态成员类只能定义顶层类或者其他静态成员类,不能定义非静态成员类。

6.2.2 非静态成员类

1、非静态成员类可以用修饰符private、protected、public、或默认指明其访问级别。非静态成员类可以访问外围类中所有数据和方法(包括私有数据和方法)
2、与静态成员类一样,只是不用static修饰。
3、非静态成员变量可以定义静态有名常量,不可以定义静态变量,静态方法和静态成员类。
4、区别 创建静态成员类的实例,首先要求存在一个它所在的外围类的实例。外围类的实例对象时创建和访问非静态成员类实例的必要上下文。

6.2.3局部类

又称为方法中的内部类,仅能在外围方法中被使用。
作用域:从它定义的位置至它所在的块语句的结尾处。
不能有访问修饰符,也不能用static修饰。
可以访问外围方法中已经定义和复制的有名常量(final局部变量),不能访问其他局部变量。
可访问外围类中所有数据和方法,但如果局部类定义于静态方法中,那么局部类仅能访问外围类中的静态数据和方法。

6.2.4 匿名类

属于一种方法中的匿名类。所有局部类的特性也适用于匿名类。
区别: 匿名类必须扩展某个超类或实现某个接口,两者选择其一,不能同时发生。
语法: new<超类或接口名>([<实参表>]){<成员定义>}
不能定义自己的构造方法,系统提供。
p147

6.3 object类

1.equals(Object obj) 是否为统一对象。
Object类中的equals方法只是简单的使用 == 运算符测试两个引用值是否相等。
在定义子类时,通常会重新定义equals方法,以测试孩子类的两个实例是否具有相同或相似的状态。
2、clone() 赋值运算可以将对象引用赋给另一个变量。
obj2 = obj1;复制运算并没有产生新的对象,仅赋值对象引用值的操作被称为对象的引用拷贝。
与对象引用拷贝不同,clone方法将产生一个与当前对象内容完全相同的对象,并返回新对象的引用。
在调用一个clone对象时,如果对象的类没有实现Cloneable接口,那么方法会抛出CloneNotSupportException例外(Object类没有实现Cloneable接口,因此调用Object类的实例的clone方法就会抛出该例外)
clone方法时protected的所以需要对其进行覆盖,将其定义成public。

class MyClass implements Cloneable{
...
public Object clone() throws CloneNotSupportedException{
	return super.clone();
}
...
}

clone方法返回的类型为Object,所以在进行对象复制时通常需要一个类型转换,例如

MyClass object = new MyClass();
MyClass copy = (MyClass) object.clone();

3、 finalize() 在对对象进行垃圾收集前,垃圾收集器会自动调用对象的finalize方法。
4、 toString() Object类定义的toString方法返回当前对象的一个字符串表示。该字符串包含当前对象的类名和当前对象的散列码。

小结

发布了35 篇原创文章 · 获赞 10 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_34358193/article/details/104325731