Java复习笔记(5)——继承

本文介绍了面向对象编程的基本概念,包括类、超类、子类及其继承关系,详细讲解了如何使用关键字extends实现继承,以及子类如何重写超类的方法等内容。此外,还探讨了多态、动态绑定等高级主题,并提供了实用的设计建议。

类、超类和子类

1、用关键字extends表示继承。已存在的类称为:超类(superclass)、父类(parent class)、基类(base class),新类称为子类(subclass)、派生类(derived class)孩子类(child class)

class Manager extends Employee {

...;

}

2、相比父类,子类拥有的功能更加丰富,通过拓展超类定义子类时,只需要指出子类和超类的不同之处。

3、将通用方法放在超类中,将具有特殊用途的方法放在子类中。

4、子类不能直接访问超类的私有域

5、在子类中,可以利用super关键字可以调用超类的方法。

6、this关键字不同,super不是一个对象的引用,不能将super赋给另一个对象变量,它只是一个指示编译器调用超类方法的特殊关键字。

7、在子类中可以增加域、增加方法或是覆盖超类的方法,然而,绝对不能删除继承的任何域和方法。

8、利用super关键字可以调用超类的构造方法。此时,调用父类构造器的语句必须是子类构造函数实现的第一条语句。

super(n, s, year, month, day);

9、如果子类的构造器没有显式地调用超类的构造器,则将自动地调用超类默认(没有参数)的构造器,如果超类中没有不带参数的构造器,并且在子类构造器中又没有显式地调用超类的其他构造器,则Java编译器将报告错误

10、一个对象变量可以只是多种实际类型的现象称为多态(polymorphism)。在运行时能够自动地选择调用哪个方法的现象称为动态绑定(dynamic binding)

11、继承并不仅限于一个层次。有一个公共超类派生出来的所有类的集合被称为继承层次(inheritance hierachy),在继承层次中,某个特定的类到其祖先路径称为该类的继承链(inheritance chain)

12、一个祖先类可以拥有多个子孙继承链。

13、Java不支持多继承

14、有一个用来判断是否应该设计为继承关系的简单规则,就是is-a”规则,它表明子类的每个对象也是超类的对象。

15、可以用超类变量引用子类对象,不能用子类变量引用超类对象。

16、Java中子类数组的引用可以转换成超类数组的引用,而不需要采用强制类型转换,但是如果试图在数组中存储一个超类的对象引用,就可能会引发ArrayStoreExcepti -on异常

17、Java调用对象方法的过程:

(1) 查看对象的声明类型和方法名。查找声明类型以及其超类中的所有同名方法。找到所有可能会被调用的候选方法

(2) 重载解析,找到需要执行的方法。

(3) 如果是private方法、static方法、final方法或者构造器,此时编译器可以准确地知道要调用哪个方法,这种调用方式称为静态绑定(static binding)

(4) 当程序运行,并且采用动态绑定调用方法时,虚拟机一定调用与x所引用对象的实际类型最合适的那个类的方法。

18、虚拟机会预先为每个类创建一个方法表(method table),其中列出了所欲方法的签名和实际调用的方法。

19、在覆盖一个方法的时候,子类方法不能低于超类方法的可见性

20、利用final关键字可以定义不允许扩展的类。

21、在早期的Java中,为了避免动态绑定带来的系统开销而使用final关键字。如果一个方法没有被覆盖并且很短,编译器就能够对它进行优化处理,这个过程称为内联(inling)

22、使用instanceof运算符可以查看对象的实际类型。

23、如果试图在继承链上进行向下的类型转换,并且“谎报”有关对象包含的内容,那么就会跑出ClassCastException异常。

24、如果类型转换不可能成功,那么编译器就不会进行转换,产生编译错误。

25、如果对象引用x的值为null,那么对于任意的类型Cx instanceof C 的运算不会产生异常,只是返回false

26、使用abstract关键字定义抽象类抽象方法

27、抽象方法充当着占位的角色,他们的具体实现在子类中。扩展抽象类可以有两种选择。一种是在子类定义部分抽象方法或抽象方法也不定义,这样就必须将子类也定义为抽象类;另一种是定义全部的抽象方法,然后就不必将这个类定义为抽象类了。

28、抽象类不能被实例化,但是可以定义一个抽象类的对象变量。

29、将类中的域和方法声明为protect,就可以使得这些域和方法对于子类可见。

30、Java中的访问修饰符:

仅对本类可见——private

对所有类可见——public

对本包和所有子类可见——protected

对本包可见——默认,不需要修饰符
 

Object

1、Object 类是所有类的始祖,可以使用Object类型引用任何类型的对象。

2、Java中,只有基本类型不是对象,数组类型也是继承与Object类。

3、Object类的equals方法检测两个对象是否具有相同的引用。

4、在子类中定义equals方法时首先要调用超类的equals方法。

5、Java语言规定的equals方法的特性:

·自反性:对于任何非空引用xx.equals(x)应该返回true

·对称性:对于任何引用xy,当且仅当y.equals(x)返回truex.equals(y)也应该返回true

·传递性:对于任何引用xyz,如果x.equals(y)返回truey.equals(z)返回true,那么x.equals(z)也应该返回true

·一致性:如果xy引用的对象没有发生变化,反复调用x.equals(y)应该返回同样的结果。

·对于非空的任意引用xx.equals(null)应该返回false

6、不建议在equals方法中使用instanceof,无法处理子类的情况,也无法保证对称性。

7、关于equals方法的实现,可以从不同的情况考虑:

·如果自来能够拥有自己的相等概念,则对称性需求将轻质采用getClass进行检测。

·如果有超类决定相等的概念,那么就可以使用instanceof进行检测,这样可以在不同子类的对象之间进行相等的比较。此时,超类中的equals方法应设定为final

8、equals方法编写建议:

(1) 显式参数命名为otherObject,稍后需要将它转化成另一个叫做other的变量。

(2) 检测thisotherObject是否引用同一个对象:

if(this == otherObject) return true;

(3) 检测otherObject是否为null,如果为null返回false。这项检测是必要的。

if(otherObject == null) return false;

(4) 比较thisotherObject是否属于同一个类,如果equals的予以在每个子类中有所改变,就使用getClass检测。

if(getClass() != otherObject.getClass()) return false;

如果所有子类都拥有统一的定义,就使用instanceof检测:

if(!(otherObject instance of ClassName)) return false;

(5) otherObject转化为相应的类的类型变量:

ClassName other = (ClassName) otherObject;

(6) 对所有需要比较的字段进行比较,使用 == 比较基本类型域,使用equals比较对象域。如果素有的域都匹配,就返回true;否则返回false

(7) 如果在子类中重新定义equals,就要在其中包含调用super.equals

9、对于数组类型的域,可以使用静态的Arrays.equals方法检测相应的数组元素是否相等。

10、Object中的hashCode方法返回对象的存储地址。

11、如果重新定义equals方法,就必须重新定义hashCode方法,一遍用户可以将对象出入到散列表中。(equalshashCode方法的定义必须一致)

12、Objects类中包含null安全的方法Objects.hashCode。如果其参数为null,这个方法会返回0,否则返回对参数调用hashCode的结果。

13、toString方法返回表示对象值的字符串。通常格式为:类的名字,随后是一对方括号括起来的阈值。

14、只要对象与一个字符串通过操作符+”连接起来,Java编译器就会自动地调用toString方法,以便获得这个对象的字符串描述。

15、Object类中的toString方法输出对象所属的类名和散列码。

16、Arrays.toString  Arrays.deepToString(多维数组)可以打印数组。
 

泛型数组列表

1、ArrayList具有自动调节数组容量的功能,同时是一个采用类型参数的泛型类

2、使用add方法将元素添加到ArrayList中。

3、Java7中,可以省去构造方法中的类型参数:

ArrayList<Employee> staff = new ArrayList<>()

4、使用getset方法实现ArrayList中元素的访问和修改。

5、利用toArray方法可将ArrayList中的元素拷贝到数组中。
 

对象包装器与自动装箱

1、所有基本类型都有一个与之对应的类,这些类称为包装器(wraper)

2、JavaSE 5.0 的另一个改进使得添加数组元素的过程更加便捷:

ArrayList<Integer> list = new ArrayList<>();

list.add(3);

上面的代码将自动转换为:

list.add(Integer.valueOf(3));

这个过程称为自动装箱(autoboxing)

3、在两个包装器对象进行比较时,建议采用equals方法,用==结果不确定。

4、自动装箱规范要求booleanbytechar127、介于-128 ~ 127 之间的shortint被包装到固定的对象中。

5、包装器对象不可变。

6、包装器类中的常用方法:

·int intValue()

int形式返回Integer对象的值(Number类中覆盖了intValue方法)

·static String toString(int i)

以一个新的String对象的形式返回给定数值i的十进制表示。

·static String toString(int i , int radix)

返回数值i的基于给定radix参数的进制表示。

·static int parseInt(String s)

·static int parseInt(String s, int radix)

返回字符串s表示的整型数值,给定字符串表示的是十进制的整数(第一种方法),或者是radix参数进制的整数(第二种方法)

·static Integer valueOf(String s)

·static Integer valueOf(String s, int radix)

返回s表示的整型数值进行初始化后的一个新的Integer对象,给定字符串表示的是十进制的整数(第一种方法),或者是radix参数进制的整数(第二种方法)

参数数量可变的方法

1、JavaSE 5.0之后的版本提供了可变参数的方法:

public static double max(double... values) {

double largest = Double.MIN_VALUE;

for(double v : values) {

if(v > largest) largest = v;

}

}

2、允许将一个数组传递给可变阐述方法的最后一个参数。

3、可以将已经存在且最后一个参数是数组的方法重新定义为可变参数的方法,而不会破坏任何已经存在的代码。
 

枚举类

1、枚举类型的声明本质上是定义了一个类,但尽量不要构造新对象。

2、比较两个枚举类型的值,永远不需要调用equals,直接使用==就可以了。

3、可以在枚举类型中添加一些构造器、方法和域:

public enum Size {

SMALL(S), MEDIUM(M), LARGE(L), EXTRA_LARGE(XL);

private String abbreviation;

private Size(String abbreviation) {

this.abbreviation = abbreviation;

}

public String getAbbreviation() {

return abbreviation;

}

}

4、所有的枚举类型都是Enum类的子类。它们继承了这个类的许多防范。其中最有用的是toString,这个方法能够返回枚举常量名。

5、toString方法的逆方法是valueOf,可以用于设定枚举类型的值。

values方法返回包含全部枚举值的数组。

继承设计技巧

1、将公共操作和域放在超类。

2、不要使用受保护的域(protected)Java程序设计语言中,在同一个包中的素有类都可以访问protected域,而不管它是否为这个类的子类。

3、使用集成实现is-a”的关系。

4、除非所有集成的方法都有意义,否则不要使用继承。

5、在覆盖方法时,不要改变预期的行为。

6、使用多态,而非类型信息。

不要过多地使用反射。反射对于编写系统程序来说极其游泳,但是通常不适于编写应用程序。


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值