1、类的继承中需要注意的问题
1)、在java中,类只支持单继承,不允许多重继承,也就是说一个类只能有一个直接父类,例如下面这种情况是不合法的。
class A {}
class B {}
class C extends A,B {} // C类不可以同时继承A类和B类
2)、多个类可以继承一个父类,例如下面这种情况是允许的。
class A {}
class B extends A {}
class C extends A {} //类B和类C都可以继承类A
3)、在java中,多层继承是可以的,即一个类的父类可以再去继承另外的父类,例如C类继承自B类,而B类又可以去继承A类,这时,C类也可以称作A类的子类, 下面这种情况是允许的。
class A {}
class B extends A {} //类B继承类A,类B是类A的子类
class C extends B {} //类C继承类B,类C是类B的子类,同时也是类A的子类
4)、在java中,子类和父类是一种相对概念,也就是说一个类是某个父类的同时,也可以是另一个类的子类。例如上面的示例中,B类是A类的子类,同时又是C类的父类。
2、重写父类方法
在子类中重写的方法需要和父类呗重写的方法具有相同的方法名,参数列表及返回值类型。子类重写父类方法时,不能使用比父类中被重写的方法更严格的访问权限,如父类中的方法是public的,子类的方法不能是private的。
3、super关键字
1)、使用super关键字调用父类的成员变量和成员方法。格式如下:
super.成员变量
super.成员方法([参数1,参数2...])
2)、使用super关键字调用父类的构造方法。格式如下:
super([参数1,参数2...])
例:
//定义父类
class A {
//定义父类有参的构造方法
public A(String name){
System.out.println(“我的名字是”+name);
}
}
//定义B类继承A类
class B extends A {
public B(){
super(“父类”); //调用父类有参的构造方法
}
}
//定义测试类
public class Text{
public static void main(String [ ] args){
B b = new B(); //实例化子类B对象
}
}
需要注意,通过super调用父类构造方法的代码必须位于子类方法的第一行,并且只能出现一次。
如果将super(“父类”); //调用父类有参的构造方法 这行代码去掉,再次编译就会报错,出错的原因是在子类的构造方法中一定会调用父类的某个构造方法。这时可
在子类的构造方法中通过super指定调用父类的哪个构造方法,如果没有指定,在实例化子类对象时,会自动调用父类无参的构造方法。未解决上述错误,可以在子类中
显示地调用父类中已有的构造方法,当然也可以选择在父类中定义无参的构造方法,修改上面代码:
//定义父类
class A {
//定义父类无参的构造方法
public A(){
System.out.println(“我的名字是父类”);
}
//定义父类有参的构造方法
public A(String name){
System.out.println(“我的名字是”+name);
}
}
//定义B类,继承自A类
class B extends A {
//定义B类无参的构造方法
public B(){
//方法中午代码
}
}
//定义测试类
public class Text{
public static void main(String [ ] args){
B b = new B(); //实例化子类B对象
}
}
运行上面代码就不会报错,可以看出子类在实例化时默认调用了父类无参的构造方法。通过这个可以知道,在定义一个类时,如果没有特殊要求,尽量在类中定义一个无
参的构造方法,避免被继承时出现错误。