您的位置:首页 > 编程语言 > Java开发

Java核心技术笔记-第5章

2017-02-21 16:35 316 查看

继承

1.子类在继承超类后,会继承超类所有的数据域和方法。

但是,如果在超类中数据域是私有的,那么在子类中就不能直接访问超类中的私有数据域,只能通过超类中提供的公有方法来访问。

2.(1)程序中出现超类对象的任何地方都可以用子类对象置换。例如,Manager类是Employee类的子类,那么可以Employee e = new Manager();

(2)但是不可以Manager m = new Employee();

(3)如果Manager类中重写了Employee中已有的方法,那么e在调用该方法时,会调用已经重写的方法。

(4)但是e不可以调用Manager类中有,而Employee类中没有的方法。

3.假设Manager是Employee类的子类,下面的代码会抛出ArrayStoreException异常。

因为最后一句将一个Employee对象存储在了一个Manager数组中

Manager[] managers = new Manager[10];   //数组创建类型为Manager
Employee[] employee = managers; //employee和managers指向同一个数组
Employee e = new Employee();
employee[0] = e;    //将一个超类对象存储在了子类对象数组中,引发异常。


为了不发生这种错误,要牢记数组的创建类型。


4.子类在覆盖父类的方法时,不能低于原有父类方法的访问权限。

5.阻止继承:final

(1)final class Executive 表示Executive类不能被继承。

(2)public final String getName() 表示方法不能被重写。

6.protected 本包和所有子类可见。使得子类可以直接接触继承的私有数据域,但是破坏了封装性原则。

(1)如果超类的数据域被声明为protected,那么在超类的子类中,就可以直接访问继承的该数据域。但是,仅限于子类访问自己继承的,而不能访问其他类(比如超类)的。

(2)如果超类的方法被声明为protected,那么只有子类可以使用该方法。

7.instanceof可以用来查看一个变量引用的对象是否属于某个类(或者超类)。

例如判断a是否属于A类:A a = new A(); a instanceof A 返回true

注意:当B是A的超类,a instanceof B也会返回true

8.equals方法

(1)本来是用来判断两个 对象 是否具有相同的引用。也就是看两个变量是不是引用的同一个对象。例如,

Employee e1 = new Employee("name");
Employee e2 = new Employee("name");


此时e1.equals(e2) 会返回false

(2)但是jdk类中有一些类覆盖了equals方法,用来判断两个对象的内容状态是否相同。这些类:java.io.file, java.util.Date, java.lang.string, 包装类(Integer,Double等)

(3)另外需要注意的是,确保调用equals方法的变量不要是空值,否则会抛出异常。不确定变量是否为空值时,可以使用Objects.equals(a,b)方法(a和b都是null时,返回true;只有一个为null时,返回false;两个都是不为null时,调用a.equals(b))来比较。

9.在重写equals方法时(特别是检测两个属于不同类的对象时),用getClass()还是instanceof检测两个对象是否属于同一个类?

(1)如果子类能够拥有自己的相等概念,则使用getClass()

(2)如果由超类决定相等的概念,那么就可以使用instanceof,这样可以在 子类与超类 或 不同子类 的对象之间进行相等的比较。

10.编写equals方法步骤(注意重写时equals方法的参数必须是Object类型,否则不是重写,而是定义了一个新方法)

(1)if(this==otherObject) return true;

(2)if(otherObject == null) return false;

(3)比较this和otherObject是否属于同一个类。如果equals的语义在每个子类中有所改变,就使用getClass();如果所有的子类拥有统一的定义,(一般在超类中使用)使用instanceof(只检测超类部分是否相同)。

(4)将otherObject转换为该类的类型变量。ClassName other = (ClassName)otherObject; 为第(5)步中的 另外 做铺垫。

(5)对域进行比较。另外,如果是在子类中重写equals方法,就要调用super.equals(other)。

11.Arrays.equals()方法用来比较两个数组是否相同。注意如果数组中存放的是引用类型,只有两个数组存储的是同一个对象时,才返回true。

12.(1)重新定义equals方法时,必须重新定义hashCode()方法(属于Object类,在没有重写时返回地址,String类已经重写)

(2)Objects.hashCode(type v)可以防止变量为空值。

(3)Objects.hash(v1,v2,v3…)可以生成变量组合的散列值。

(4)Arrays.hashCode(type[] a)生成数组的散列值。

(5)注意:equals与hashCode的定义必须一致。例如,equals以id为标准进行比较时,hashCode也只需将id进行散列。如果x.equals(y)返回true,那么x.hashCode()和y.hashCode()就必须返回相同的值。

13.toString()方法也属于Object类。没有被重写时,一个引用类型调用时,返回类名和散列值。

数组继承了Object类的toString()方法,数组调用toString()方法时,只会输出数组类型和散列值。

要想将数组转换为String类型,需要调用Arrays.toString(arrayName);

14.对象包装器类(Integer, Double…)是不可变的。也就是说一旦构造了包装器,就不能再改变包装在其中的值。

15.参数数量可变的方法。

下面这个max方法的参数个数是可变的,可以输入不定数量的参数。

public static double max(double... values){
//参数数量可变关键就在于double... values, 此时values相当于一个不定数量的数组。
double largest = Double.MIN_VALUE;
for(double d : values){
if(d>largest){
largest = d;
}
}
return largest;
}


16.枚举类。

enum Size {SMALL, MEDIUM, LARGE};

其中,SMALL, MEDIUM,LARGE都是属于Size类型的对象。 也就是说Size类已经定义好了三个对象,并且只有这三个对象。

17.反射

(1)

Employee e = new Employee();
Class c = e.getClass(); //此时c表示Employee类的属性(这里说的不是数据域)
String name = c.getName();//获取类名
Class cc = Class.forName(name);//与getName方法相反,forName方法可以根据类名返回Class


(2)e.getClass().newInstance()可以创建一个Employee类型的对象,创建时调用默认的没有参数的构造器,如果没有会抛出异常。

(3)用途。[1]在运行中分析类的能力,查看类的各种属性。[2]在运行中查看对象,比如编写任意类型对象的toString方法。[3]实现通用的数组代码操作,可以使函数返回想要的类型的对象。[4]使用Method的invoke方法调用任何方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 技术 继承 对象