java继承细节问题
一.继承的概念
- 基于已有类产生新类的机制
- 是指新的类可以获得已有类(称为超类、基类或父类)的属性和行为,称新类为已有类的子类(也称为派生类);
- 在继承过程中子类继承了超类的特性,包括方法和实例变量;
- 子类也可修改继承的方法或增加新的方法;
- 有助于解决软件的可重用性问题,使程序结构清晰,降低了编码和维护的工作量。
- 单继承
- —个子类只有单一的直接超类。
- 多继承
- 一个子类可以有一个以上的直接超类。
- Java语言仅支持单继承。
二.继承的细节
1.子类不会继承父类的构造方法.单可以通过super去调用其父类的构造方法.
public class Test4{
public int i;
Test4 void(){}
Test4 void(int i){
this.i=i;
}
}
class Test4_1 extends Test4{
Test4_1 void(int i){
super(i);
}
}
class main{
public static void main(String[] args) {
Test4_1 t1=new Test4_1(5);//如果Test4_1不写构造方法会报错,证明构造方法不会被继承
}
}
super细节第二点(本质上是调用父类的构造方法,众所周知,当对象被实例化时会先在为子类对象开辟的空间中先构建一个父类对象再构建子类对象。所以当子类出现与父类同名的实例变量时,调用super更改的是子类对象开辟的空间中的这个父类对象的变量值)
public class Test4{
public int i;
Test4 void(){}
Test4 void(int i){
this.i=i;
}
}
class Test4_1 extends Test4{
public int i;//出现同名实例变量
Test4_1 void(int i){
super(i);//只会给子类对象开辟的空间中的这个父类对象赋值
//如果想给自己的同名i赋值,请用this.i=i
}
public void test(){
System.out.println(super.i);
}
}
class main{
public static void main(String[] args) {
Test4_1 t1=new Test4_1(5);
System.out.println(t1.i);//输出0
t1.test();//输出5
}
}
2.关于继承中static变量的一些细节
因为static变量随着类的初始化而初始化,它是被存在方法区中的。那么我们改变一个子类中继承过来的static值,
它就相当于改变了父类的static变量,会影响到这个父类和其子类的该static变量(如果子类中有同名的该static变
量,那么你用类名.变量名修改的就会是子类的该static变量,不会影响到父类)
public class Test4{
public static int i=10;
}
//子类1
class Test4_1 extends Test4{
//没有同名成员变量
}
//子类2
class Test4_2 extends Test4{
public static int i=20;//与父类同名的静态变量
}
class main{
public static void main(String[] args) {
System.out.println(Test4.i);//输出10
System.out.println(Test4_1.i);//输出10
System.out.println(Test4_2.i);//输出20
Test4_1.i=30;//通过没有同名成员变量的子类改变i,影响到了父类
Test4_2.i=50//通过有同名成员变量的子类改变i,不会影响到了父类
System.out.println(Test4.i);//输出30
System.out.println(Test4_1.i);//输出30
System.out.println(Test4_2.i);//输出50
}
}
3.关于继承中方法重写的一些细节
1.子类中重写方法方法签名==父类中被重写的方法
-
方法的返回值类型为基本数据类型要求->完全相等
引用数据类型>子类中重写方法的返回值类型<=父类中被重写方法的返回值类型
class Test5_1{ public Test5_1 test(){ return null; } } class Test5_3 extends Test5_1{ public Test5_3 test(){ return null; } }
-
子类中重写方法的权限修饰符>=父类中被重写方法的权限修饰符
class Test5_1{ private Test5_1 test(){ return null; } } class Test5_3 extends Test5_1{ public Test5_3 test(){ return null; } }
-
被final修饰的方法不能被重写
-
静态方法不能被重写
当子类中出现于父类静态方法同名的方法,要求子类中的这个同名方法也要被static修饰
4.关于继承中同名的总结
当没有同名的变量时,会优先调用其父类的变量
也就是说实例变量没有同名的变量时,你用对象.变量赋的是子类对象开辟的空间中的这个父类对象的变量值
静态变量没有同名的变量时,你用对象.变量或者子类.变量更改的是你父类的静态变量,等于说影响到了其他子类
所继承的这个静态变量。
子类如果有同名于父类的静态方法,你用子类调用该方法就不会调用父类的静态方法,而是调用自己的这个静态方法。