继承:基于已存在的类构造一个新类,继承已存在的类就是复用(继承)这些类的方法和域,在此基础上还可以添加新的方法和域。
反射:是指在程序运行期间发现更多的类一起属性的能力。
1.类、超类、子类
关键字extends表明正在构造的新类派生与一个已经存在的类。已存在的类称为:父类、基类、超类。新类称为子类、派生类、孩子类。子类比超类拥有更多的功能。super:子类调用超类的域或者方法时使用。
super.functionName();
Manager继承Employee类,不能够删除继承的任何域和方法。
public Manager(String n, double s, int year, int month, int day) {
super(n, s, year, month, day);
}
super(n, s, year, month, day):指调用超类中涉及相关域的构造器。
super关键字的用途:
- 调用超类的方法。
- 调用超类的构造器。
多态:一个Employee对象既可以引用Employee类对象,也可以引用Employee类的任何一个子类对象。
Manager boss =new Manager("Carl" , 80000,1987,12,15);
// boss.setBonus(5000);
Employee[] staff = new Employee[3];
staff[0] = new Manager("Carl" , 80000,1987,12,15);
// staff[0] = boss;
// boss = staff[0]; // Error
Manager boss = (Manager) staff[0]; // Right
staff[1] = new Employee("Harry" , 50000,1989,10,1);
staff[2] = new Employee("Tony", 40000, 1990, 3, 15);
for(Employee e : staff) {
System.out.println(e.getSalary());
} }
循环输出Employee数组时,作为子类的boss在输出时,能够自动调用自身的getSalary方法。一个对象变量(如e)可以指示多种实际类型的现象成为多态(用自己的话说就是:一个拥有子类的超类变量,能够表示这个超类本身,也可以指向自身的子类)。在运行时能够自动的选择调用哪种方法的现象称为动态绑定。
阻止继承:阻止某个类定义子类。不允许扩展的类称为final类。final修饰的方法不允许在子类中更改。
final class Executive extends Manager{
private String sex;
public Executive(String n, double s, int year, int month, int day) {
super(n, s, year, month, day);
// TODO Auto-generated constructor stub
}
public final String getSex() { // final 方法:子类不允许更改
return sex;
}
public final void setSex(String sex) {
this.sex = sex;
}
}
抽象类:当父类知道子类应该包含什么样的方法,但无法确定子类如何实现这些方法;在分析事物时,会发现事物的共性,将共性抽取出,实现的时候,就会有这样的情况:方法功能声明相同,但方法功能主体不同,这时,将方法声明抽取出,那么,此方法就是一个抽象方法。
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
修饰符:
- 仅对本类可见-private。
- 对所有类可见-public。
- 对本包和所有子类可见-protected。
Object:所有类的超类
在java中,只有基本类型不是对象,其余如对象数组‘基本类型的数组都扩展于Object类。
equals方法:用于检测一个对象是否等于另一个对象。在Object中,是判断两个对象是否具有相同的引用。
equals特性:
- 自反性 : 对于任何非空引用 x , x.equals(x) 应该返回 true。
- 对称性 : 对于任何引用 x 和 y , 当且仅当 y.equals (x) 返回 true , x.equals (y) 也应该返
回 true。 - 传递性 : 对于任何引用 x 、y 和 z , 如果 x.equals (y) 返回true, y.equals (z) 返回true ,x.equals (z) 也应该返回 true 。
- 一致性 : 如果 x 和 y 引用的对象没有发生变化, 反复调用 x.equals (y) 应该返回同样
的结果。 - 对于任意非空引用 x , x.equals (null) 应该返回 false 。
散列码:(在网上看到的一个很通俗的解释)就是吧一堆对象散列到各自的队列里去的一种标识符。例子:一年365天从1开始编号(1-365),定义一种编码方法,把每一个人的生日看成一个编号,通过生日编号对应到每个人自己的标识码。这种编码方式在处理一些特殊的问题时具有较好的效率,如请所有单号的人站在一起,双号的人站一起,在找比那好为单号的某一个人时,我们就只需要在单号的队列中去寻找。编码方法就是散列码算法,加之合适的存储机制,我们就能够实现高校的存储管理。
反射
编译期:把源码交给编译器编译成计算机可以执行的文件的过程。在 Java 中也就是把 Java 代码编成 class 文件的过程。编译期只是做了一些翻译功能,并没有把代码放在内存中运行起来,而只是把代码当成文本进行操作,比如检查错误。
运行期:把编译后的文件交给计算机执行,直到程序运行结束。所谓运行期就把在磁盘中的代码放到内存中执行起来。
java反射机制:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的反射机制。简单来说,反射机制指的是程序在运行时能够获取自身的信息。在 Java 中,只要给定类的名字,就可以通过反射机制来获得类的所有信息。
反射方式和正常方式:
Java 反射机制主要提供了以下功能,这些功能都位于java.lang.reflect
包。
- 在运行时判断任意一个对象所属的类。
- 在运行时构造任意一个类的对象。
- 在运行时判断任意一个类所具有的成员变量和方法。
- 在运行时调用任意一个对象的方法。
- 生成动态代理。
java.lang.Class 类
java.lang.Class 类是实现反射的关键所在,Class 类的一个实例表示 Java 的一种数据类型,包括类、接口、枚举、注解(Annotation)、数组、基本数据类型和 void。Class 没有公有的构造方法,Class 实例是由 JVM 在类加载时自动创建的。
// 获得Class实例
// 1.通过类型class静态变量
Class clz1 = String.class;
String str = "Hello";
// 2.通过对象的getClass()方法
Class clz2 = str.getClass();
// 获得int类型Class实例
Class clz3 = int.class;
// 获得Integer类型Class实例
Class clz4 = Integer.class;
System.out.println("clz2类名称:" + clz2.getName());
System.out.println("clz2是否为接口:" + clz2.isInterface());
System.out.println("clz2是否为数组对象:" + clz2.isArray());
System.out.println("clz2父类名称:" + clz2.getSuperclass().getName());
System.out.println("clz2是否为基本类型:" + clz2.isPrimitive());
System.out.println("clz3是否为基本类型:" + clz3.isPrimitive());
System.out.println("clz4是否为基本类型:" + clz4.isPrimitive());
//输出:
//clz2类名称:java.lang.String
//clz2是否为接口:false
//clz2是否为数组对象:false
//clz2父类名称:java.lang.Object
//clz2是否为基本类型:false
//clz3是否为基本类型:true
//clz4是否为基本类型:false
java.lang.reflect 包
java.lang.reflect 包提供了反射中用到类,主要的类说明如下:
- Constructor 类:提供类的构造方法信息。
- Field 类:提供类或接口中成员变量信息。
- Method 类:提供类或接口成员方法信息。
- Array 类:提供了动态创建和访问 Java 数组的方法。
- Modifier 类:提供类和成员访问修饰符信息。