1.类、超类、子类
1.1 继承层次
1.2 多态
1.3 动态绑定
至此,编译器已获得所有可能被调用的候选方法。
(2)接下来,编译器将查看调用方法时提供的参数类型。 如果在所有名为f的方法中存在一个与提供的参数类型完全匹配就选择这个方法。这个过程被称为重载解析(overloading resolution)。例如对于调用x.f("hello"),编译器将会挑选f(String),而不是f(int)。由于允许类型转换(int 可以转换成 double,Manager可以转换成Employee),所以这个过程可能很复杂。如果编译器没有找到与参数类型匹配的方法,或者发现经过类型转换后有多个方法与之匹配,就会报告一个错误。
至此,编译器已获得需要调用的方法名字和参数类型。
(3)如果是 private 方法,static 方法,final 方法 或构造器,那么编译器将可以准确地知道应该调用哪个方法,我们将这种调用方式称为静态绑定(static binding)。与此对应的是,调用的方法依赖于隐式参数的实际类型,并且在运行时实现动态绑定。在上面个列举的示例中,编译器采用动态绑定的方式生成一条调用f(String)的指令。
(4)当程序运行,并且采用动态绑定调用方法时,虚拟机一定调用与x所引用对象的实际类型最合适的那个类的方法。假设x的实际类型是D,它是C类的子类,如果D类定义了方法f(String),就直接调用它;否则,将在D类的超类中寻找f(String),以此类推。
每次调用方法都要进行搜索,时间开销相当大。因此,虚拟机预先为每个类创建了一个方法表(method table),其中列出了所有方法的签名和实际调用的方法。这样一来,在真正调用方法的时候,虚拟机仅仅查找这个表就可以了。在前面的示例中,虚拟机搜索D类的方法表,以便寻找与调用f(String)相匹配的方法。这个方法既有可能是D.f(String),也有可能是X.f(String),这里的X是D的超类。这里需要提醒一点,如果调用 super.f(param),编译器将对隐式参数超类的方法表进行搜索。
1.4 阻止继承:final类和方法
1.5 强制类型转换
if (staff[1] instanceof Manager){
boss = (Manager) staff[1];
...
}
1.6 抽象类
1.7 受保护访问
2.Object:所有类的超类
1.自反性:对于任何非空引用x,x.equals(x)应该返回 true
2.对称性:对于任何引用x和y,当且仅当y.equals(x)返回 true,x.equals(y)也应该返回 true
3.传递性:如果x.equals(y)返回 true,y.equals(z)返回 true,则x.equals(z)也应该返回 true
4.一致性:如果x和y引用的对象没有发生变化,反复调用x.equals(y)返回同样的结果
5.对于任意非空引用x,x.equals(null)应该返回 false
1.显式参数命名为otherObject,稍后需要将它转换成另一个叫做other的变量。
2.检测 this 与 otherObject是否引用同一个对象。
3.泛型数组列表
4.对象包装器和自动装箱
5.参数数量可变的方法
//printf定义
public class PrintStream{
public PrintStream printf(String fmt,Object... args){
return format(fmt,args);
}
}
这里的...是java代码的一部分,它表明这个方法可以接受任意数量的对象。
6.枚举类
package enums;
import java.util.Scanner;
public class EnumTest
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
System.out.print("Enter a size: (SMALL, MEDIUM, LARGE, EXTRA_LARGE) ");
String input = in.next().toUpperCase();
Size size = Enum.valueOf(Size.class, input);
System.out.println("size = " + size);
System.out.println("ordinal = " + size.ordinal());
System.out.println("abbreviation = " + size.getAbbreviation());
if (size == Size.EXTRA_LARGE)
System.out.println("Good job--you paid attention to the ");
}
}
enum Size
{
SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");
private Size(String abbreviation) { this.abbreviation = abbreviation; }
public String getAbbreviation() { return abbreviation; }
private String abbreviation;
}