静态方法不具备多态因为它是与类,而非单个对象相关联的。
Java中除了final和static方法之外,其它所有的方法都是后期绑定的
构造函数中的虚函数是动态联编的,但在C++中是静态联编的 TIJ书 P163
子类不可改变基类中函数的可见性。若基类中某函数为public,在继承时该函数仍需为public
Java SE5 添加了返回类型,它允许子类在虚函数中返回基类的子类型。在实现protype设计模式时会用到该功能。
public class Grain
{
public Grain cloneObject()
{
return new Grain();
}
}
class Wheat extends Grain
{
public Wheat cloneObject()
{
return new Wheat();
}
}
向下转型:
Base b = new Derive();
((Derive)b).deriveClassFunction();
若转型失败就会返回一个ClassCastException异常
第九章 接口
abstract 抽象类或方法的关键字
interface 接口类的关键字,interface中的方法只能是public的,且只有原型没有实现。
interface 中的任何成员变量默认是 public static final的
基类和子类都共享基类的静态变量
抽象类与接口类的区别:
抽象类中可以有函数的定义,接口类不能有函数的定义
实现多个接口的语法:
Class Hero extends Human implements Fly, Swim,Fight{}
接口中的成员变量不能是空白final, 但可以被非常量表达式初始化
public interface Rand { int VAL = Rand.nextInt(10);}
第十章 内部类
在外部类的非静态方法中可以直接创建内部类对象,但在外部类的非静态方法之外只能通过外部的函数创建内部类。
例:
Outter out = new Outter();
Outter.Inner in = out.getInner();
.this .new
.this 在内部类的函数中返回外部类的引用
public class Outter{
public class Inner{
Outter getOutter(){ return Outter.this}
}
.new 通过外部类对象的引用创建内部类对象。
Outter out = new Outter();
Outter.Inner in = out.new Inner();
若inner是静态内部类,若内部类是静态类则可直接创建
Outter.Inner in = new Outter.Inner();
在作用域和方法内的类仅在作用域内可用,在作用域外不能访问。
内部类可以直接访问外部内的成员变量,但访问在外部定义的对象时,如外部类函数的参数,该参数必须声明为final
匿名类:
匿名类不能有构造函数,但可以通过实例初始化{}来初始化匿名类的成员变量
匿名类相当于new 后面的所指定的类的子类,return new Base(){ void BaseClassMethod(){} } 相当于返回了一个Base的子类对象。 详见书中练习12 P199
嵌套类:
将内部类声明为static.
它与内部类的区别:
1.内部类有一个指向外部类的引用,而嵌套类没有,所以嵌套类不可直接访问外部类的非静态成员或方法。
2.内部类不能有静态的成员或方法,但嵌套类可以有。
可以将测试代码放在嵌套类中, 在发布产品时将嵌套类的class文件删就可以了。如 Outter$inner.class
为什么需要内部类:
每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口)的实现,对于内部类都没有影响
内部类有效地实现了“多重继承”.