子类可继承父类所有可被访问到的数据和方法,故私有的子类不能被继承。
1.(super)关键字的使用
(1)调用父类的构造方法
(2)调用父类的方法
2.构造方法链:
public A(){ public A(){
Super(); 必须作为第一条语句
} }
Public A(doublic d){ public A(){
//some statements super();
} //some statements
}
任何情况下,构造一个类的实例时,将会沿着继承链调用所有父类的构造方法,父类的构造方法在子类构造方法之前调用,这叫做“构造方法链”。
警告:如果一个类需要扩展,最好提供一个无参构造方法以避免编程错误。原因可类比c++。
(自定义了带参的构造函数,而未定义无参,则编译器将不会自动生成无参…,导致扩展类中构造方法调用失败)。
3.方法覆盖(method overriding)
注:实例方法仅当可访问时才能被覆盖。如果子类中定义的方法在父类中式私有的,那么这两个方法完全没有关系。
注:与实例方法一样,静态方法也能继承,但不能被覆盖。如父类中的静态方法被重新定义,则父类方法被隐藏。
4.重载与覆盖(略)
5.对象类object和它的toString()方法
熟悉object类提供的方法是非常重要的,这样才能在自己的类中使用它们。toString()方法的签名是:public String toString()。调用对象的toString()返回一个代表该对象的字符串。默认下,返回一个由该对象所属的类名,对符号(@)和该对象十六进制的散列码组成的字符串。
注:System.out.println(object)等价于System.out.println(object.toString())
6.多态性、动态绑定和一般程序设计
动态绑定工作机制如下:假设对象o是c1,c2,…,c(n-1),cn的实例,其中c1是c2的子类,c2是c3的子类,…,c(n-1)是cn的子类。即cn是最一般的类,c1是最特殊的类。在java中,cn是object类。若对象o调用一个方法P,java虚拟机依次在类c1,c2,…,c(n-1),cn中查找P的实现,直到找到为止。一旦找到一个实现,便停止并调用第一次找到的实现。
7.对象转换和instanceof运算符:
子类→父类即object o=new()是合法的(隐式类型转换)
父类→子类则需要显示转换。
注:一个好的习惯是,在进行转换时确保该对象是另一个对象的实例。这可利用instanceof完成。
注:对象成员访问运算符(.)优先于类型转换运算符。使用括号保证在点(.)运算符之前转换。例如:((Circle)object).getArea();
8.数组线性类表ArrayList类:用于存储不限个数的对象。
9.Protected数据和方法:
数据和方法的可见性
类中成员的修饰符 类内访问 包内访问 子类内访问 不同包间访问
public √ √ √ √
protected √ √ √ -
(default) √ √ - -
private √ - - -
注:子类可以覆盖父类的protected方法,并把它的可见性改为public。但是子类不能降低父类中定义的方法的可访问性。例:如一个方法在父类为public,在子类中必须也定义为public。
10.final类,方法和变量
final可以用来定义常量
修饰类时表明该类是终极的,不能做父类
修饰方法时定义为终极方法,终极方法不能被它的子类覆盖。
注:修饰符用在类和类成员(数据和方法)上,只有final修饰符还可以用在方法中的局部变量上。方法内的终极局部变量就是常量。
11.对象类object中的方法
(1)equals方法
注:“==”用来比较两个基本数据类型的值是否相等或者判断两个对象是否具有相同的引用值。如果想让equals方法能够判断两个对象是否具有相同的内容,应在定义它的对象类中进行修改。“==”强于equals方法,其中“==”判断两个引用变量是否指向相同的对象。
警告:在子类中,使用签名equals(someclassName obj)(例如:equal(Circle c))覆盖equals方法是一个常见的错误。应该使用equals(object obj)。
(2)hashCode方法
注:自己的类覆盖equals方法时,应该覆盖hashCode方法。根据约定,如果两个对象相等,它们的散列码一定相同。
(3)finalize方法
(4)Clone方法
要创建一个有单独内存空间的新对象,使用clone()方法。
如:newObject = someObject.clone();
注:不是所有的对象都可以克隆,要成为一个可克隆的对象,它的类必须实现java.lang.Cloneable接口。
(5)getclass方法(用到时再说)
<!--EndFragment-->