java核心技术学习笔记-第五章-继承

来源:互联网 发布:视频剪辑软件排名 编辑:程序博客网 时间:2024/05/16 07:05

5.1 类、超类和子类

1)类的格式

class className extens superClassName{

//添加方法和域

}

5.1.1 继承层次

继承层次:由一个公共超类派生出来的所有类的集合。

继承链:在继承层次中,从某一个特定的类到其祖先的路径被被称为该类的继承链。

通常一个祖先类可以拥有多个子孙继承类。

5.1.2 多态

判断应否设计为继承关系的简单规则:"is - a"规则,即置换法则:程序里面出现超类的任何地方都可以用子类去替换。

5.1.3动态绑定

方法的签名:方法的名字和参数列表称为方法的签名。

调用对象方法的执行过程:

1)编译器查看对象声明类型和方法名,编译器一一列举出所有调用类和他的超类中指定方法名,这时编译器已获得所有可能被调用的候选方法。

2)接下来,编译器将查看调用方法时提供的参数类型。找到一个符合名字和参数类型完全匹配的方法,该过程称为重载解析。

3)  静态绑定:如果方法是private、static、final方法或者构造器,编译器将可以准确知道调用哪个方法。

4)  动态调用都会调用最适合的类,先找指定调用类,再找其超类。

为了节省方法调用时候的开销,虚拟机预先为每个类创建了一个方法表。

5.1.4  阻止继承:final类和方法

final类:不允许拓展到类。

final类其方法自动成为final,不过它的域不会final。

例如:

final class Executive extens Manager{

 ... ... 

}

类的特定方法也可以被声明为final。

final和内联能够提高效率。

5.1.5 强制类型转换

类型转换的原因:在暂时忽视对象的实际类型之后,适用对象的全部功能。

1)只能在继承层次内进行类型转换。

2)  在超类转换成自子类之前,应该使用instanceof 进行检查。

3)null instanceof Manager 的值为false。

5.1.6 抽象类

关键字:abstract

5.1.7 受保护访问

1)private -仅对本类可见

2)  public-对所有类可见

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

4)默认-对本包可见。


5.2所有类的超类:Object

java中如果没有明确指出超类,它的超类默认就是Object。

Object类型的变量可以引用任何类型的对象,不过如果要操作该对象需要转化成具体类型。

5.2.1 equals方法

首先调用超类比较方法,然后在比较子类的域。

5.2.2 相等检测与继承

equals方法的特性:

1)自反性 x.equals(x)为true,则x.equals(x),true

2)对称性 x.euqals(y),true,则y.equals.(x),true

3)传递性 x.equals(y),y.euqals(z)则x.equals(z)

4)一致性 

5)对于任一非空对象x,x.equals(null)为false。

Arrays.equals

Objects.equals

5.2.3hashcode方法

散列码是对象导出的一个整数值,没有规律,基本不会重复。

5.2.4toString方法

super.toString()+getClass+"["+域名+“]”;

Class getClass()返回包含类的信息

boolean equals(Object otherObject) 比较2个对象是否相同,如果2个对象覆盖同一内存,则返回true。在自定义类中,需要覆盖该方法。

String toString()

5.3泛型数组列表

定义:声明时候不需要确定数组大小。

ArrayList是一个采用类型参数的泛型类。

ArrayList<Employee> = new ArrayList<Emloyee>(); 

java中如果a和b是2个向量,a=b是a和b都引用同一个数组。

ArrayList<T>() 构造一个空数组列表。

ArrayList<T>(int initialCapacity) 用指定容量构造一个空数组列表。

boolean add(T obj) 在数组列表的尾端添加一个元素。

int size() 返回存储在数组列表中的当前元素数量。

void ensureCapacity(int capacity)确保数组列表在不重新分配存储空间的情况下就能保存给定数量的元素。

void trimToSize()将数组列表的存储容量削减到当前尺寸。

5.3.1 访问数组列表元素

set

get

add(可追加可中间插入,)

remove

数组插入和删除效率都比较低。

5.4 对象包装器与自动装箱

ArrayList<int> 不可以直接用需要用ArrayList<Integer>不过效率远低于int[]。

自动装箱:list.add(3) 将自动变换成 list.add(Integer.valueOf(3));

自动拆箱:int n = list.get(i);等价于 int n = list.get(i).intValue();

基本类型与他们对象包装器是不一样的,一个十几本来性一个是对象。

5.5参数数量可变的方法

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

double largest = Double.MIN_VALUE;

for(double v:values) if(v>largest) largest = v;

return largest;

}

5.6 枚举类

public enum Size{SAMLL,MEDIUM.LARGE,EXTRA_LARGE};

static Enum valueOf(Class enumClass,String name) 返回指定名字、给定类的枚举常量。

String toString() 返回枚举常量名字。

int ordinal()返回枚举常量在enum声明中的位置,位置从0开始计数。

int compareTo(E other)

5.7 反射

反射:能够分析类能力的程序。

反射的能力:

1)在运行中分析类的能力;

2)在运行中查看对象,例如,编写一个toString 方法所提供的

0 0
原创粉丝点击