Java核心技术:卷1笔记[3] 继承

 

1.子类无法直接访问其超类中的私有字段,要访问这些字段必须和其他方法一样使用公有接口。

2.super不同于this,它不是一个对对象的引用(不能把super赋给另一个对象变量),而是指示编译器调用超类方法的专用关键字。

3.一个对象变量可以指向多种实际类型的现象被称为“多态”。而在运行时自动选择正确的方法进行调用的现象称为“动态绑定”。动态绑定有一个非常重要的特性:它使程序无需重新编译已有代码就能获得可扩展性。

4.在Java中不需要把方法声明为虚拟的,默认情况就是动态绑定。如果不想让一个方法称为虚拟方法,可以把它标记为final。

5.不允许扩展的类称为final类,final class xxx extends…final类中的所有方法都自动是final的(但字段不是)。把方法或类设为final主要有两个原因:效率、安全。

6.在进行类型转换(从超类到子类类型的转换)之前最好先用instanceof操作符判断它是否能成功。

7.具有一个或多个抽象方法的类本身也必须声明为抽象的。除了抽象方法外,抽象类还可以有具体数据和具体方法。即使不含抽象方法,类也可以被声明为抽象类。

8.抽象类不能被实例化,但是仍然可以创建抽象类的对象变量,只是这个变量必须指向它的非抽象子类的对象。

9.Java中的受保护字段和方法既可以被子类访问,还可以被同一包中的其他类访问。

10.访问修饰符小结:

       1)private:只对本类可见;

       2)public:对一切可见;

       3)protected:对所有子类和本包可见;

       4)默认值:对本包可见。

11.Object类中的equals方法用于测试某个对象是否同另一个对象相等。在Object中的实现是判断两个对象是否指向同一块内存区域。如果想测试对象是否相等则需要覆盖equals方法进行更有意义的比较。

12.按照Java语言规范要求编写equals方法的建议:

       1)显式参数命名为otherObject;

       2)测试this同otherObject是否是同一对象:

              if(this==otherObject) return true;

       3)测试otherObject是否为null,如果是,就返回false,这项测试是必须的。

              if(otherObject==null) return false;

       4)测试this和otherObject是否属于同一个类,这项测试是“对称性规则”所要求的。

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

       5)把otherObject的类型转换成所需的类型:

              ClassName other=(ClassName)otherObject;

       6)比较所有的字段,使用==比较基本类型字段,使用equals比较对象字段。如果所有字段都匹配,则返回true,否则返回false。

       遵循以上规则定义一个类的equals方法,则在定义其子类的equals方法时,首先调用超类的equals方法。如果这项测试不能通过,对象也就不可能相等。如果超类字段相等,那么需要比较子类的实例字段。

13.无论何时用+操作符将对象和字符串进行相连接Java编译器都会自动调用toString方法获得对象的字符串表示。

14.所有的数组类型,不管它是对象数组还是基本类型数组,都是从Object派生出来的类类型。只能把对象数组转换成Object[]数组,而不能把int[]数组转换成Object[]数组,不过两种数组都可以转换成Object。

15.所有基本类型都有着与之对应的类,这种类通常被称为对象包装器。包装器类是final的,也不能改变存储在对象包装器内的值。

16.程序运行时,Java运行时系统一直对所有的对象进行运行时类型识别。这项信息记录了每个对象所属的类。虚拟机通常使用运行时类型信息选择正确的方法去执行。用来保存这些信息的类就是Class类。

17.获取Class类型对象的三种方法:

       1)调用Object类中的getClass方法;

       2)使用Class类的静态方法forName获得与字符串对应的Class对象:

              String className=”Manager”;

              Class c1=Class.forName(className);

       3)如果T是一个Java类型,那么T.class就代表了匹配的类对象:

              Class cl1=Manager.class;

              Class cl2=int.class;

              Class cl3=Double[].class;

       注意的是,Class对象实际上描述的只是类型,而这类型未必是类。

18.可以利用newInstance()方法为类创建一个实例,如e.getClass().newInstance();创建了一个同e一个类型的新实例。newInstance方法调用默认构造器(无参数构造器)初始化新建对象。

19.使用反射分析类的功能:java.lang.reflect包中的三个类Field、Method、Constructor类分别描述类的字段、方法和构造器。它们都有一个getName方法。Field类有个getType方法,返回一个用来描述字段类型的Class对象。而Method和Constructor类都有报告这些方法的返回类型和参数类型的方法(一系列get方法)。三个类都有一个getModifiers方法,它返回一个整数,其不同位的设置描述了所使用的修饰符。可以使用Modifier类的静态方法来分析getModifiers返回的整数。

20.在运行时使用反射分析对象:如果f是一个Field类型的对象,且obj是f字段所属类的对象,那么f.get(obj)会返回一个对象,它的值是obj中该字段的当前值。也可以通过f.set(obj,value)把obj对象的f字段设为新值。但是,只能使用get方法获取可访问字段的值。除非具有访问权限,Java安全机制允许你找出任意对象有哪些字段,但它不会允许你读取那些字段的值。(可以通过setAccessible方法屏蔽访问控制)

21.方法指针:Method类有一个invoke方法允许调用包装在当前Method对象中的方法。方法原型:

       Object invoke(Object obj,Object[] args)

       第一个参数是隐式参数,对象数组提供了显式参数。对于静态方法来说,第一个参数会被忽略,可以设为null。如果方法没有显式参数,则可以为args参数传递一个null或一个长度为0的数组。

22.不要滥用反射:反射机制通过在运行时探查字段和方法,从而可以帮助写出通用性很好的程序。这项能力对系统编程来说特别有用,但它不适合于应用编程。而且反射是脆弱的,编译器不能帮助你发现编程错误,任何错误在运行时被发现都会导致异常。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值