java 继承总结

来源:互联网 发布:网络营销策划是it吗 编辑:程序博客网 时间:2024/06/06 14:09

1、构造函数  

1、 如果父类有无参数的构造函数(也可以有有参数的构造函数),子类构造函数无需要显示调用,系统会自动调用父类的无参数构造函数;

父类

public class Father {public Father(){System.out.println("父类的无参数构造函数");}public Father(String str) {System.out.println("父类的有参数构造函数1");}public Father(int  number) {System.out.println("父类的有参数构造函数2");}}


子类

<span style="font-size:14px;">public class Child extends Father {public Child() {//              super();      在这里会默认调用无参数的父类构造函数System.out.println("子类的无参数构造函数");}}</span>
运行

<span style="font-size:14px;">public class Test extends Father {public static void main(String[] args) {   new Child();}}</span><span style="font-size:18px;"></span>
结果:

父类的无参数构造函数

子类的无参数构造函数
2、 如果父类只有有参数的构造函数,子类构造函数必须显示调用,否则会编译出错;

父类

public class Father {public Father(String str) {System.out.println("父类的构造函数");}public Father(int  number) {System.out.println("父类的构造函数");}}
子类

public class Child extends Father {public Child() {super(5);//父类没有无参的构造函数,必须调用有参的构造函数,调用哪个构造函数都可System.out.println("子类的无参数构造函数");} }

2、方法覆盖

1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
3、子类的静态方法不能覆盖同名的父类实例方法,会编译出错   4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖


3、成员覆盖

public class Father {public int number;public Father(){System.out.println("父类的无参数构造函数");}public Father(String str) {this.number=0;System.out.println("父类的构造函数");}public Father(int  number) {this.number=number;System.out.println("父类的构造函数");}  public int getNumber() {          number++;          System.out.println("我是父类");        return number;      }  {System.out.println("父类的非静态代码块");}static {System.out.println("父类的静态代码块");}public void FPrint() {System.out.println("父类的方法F");}public void Print() {System.out.println("父类的方法P");}}
子类

public class Child extends Father {public Child() {             super();     // 在这里会默认调用无参数的父类构造函数//super(5);//父类没有无参的构造函数,必须调用有参的构造函数System.out.println("子类的无参数构造函数");}{System.out.println("子类的非静态代码块");}static {System.out.println("子类的静态代码块");}public   void CPrint(){super.FPrint();System.out.println("子类的方法");}public void Print(){ System.out.println("子类的覆盖");}}
test

public class Test extends Father {public int number;          public  Test(int number) {          super(number);      }          public int getNumber() {              System.out.println("我是子类的"+number);        number++;          return number;      }  public static void main(String[] args) {//   new Child();//new Out.inner().innerprint();Father f=new Test(17);System.out.println(f.getNumber());}}
运行结果:

我是子类的0
1

把子类的getNumber方法注释掉

public class Test extends Father {public int number;          public  Test(int number) {          super(number);      }      //    public int getNumber() {  //    //        System.out.println("我是子类的"+number);//        number++;  ////        return number;  //    }  public static void main(String[] args) {Father f=new Test(17);System.out.println(f.getNumber());}}
运行结果:

我是父类
18

下面看一种特殊情况

public class Test extends Father {public  int number;          public  Test(int number) {          super(number);      }          public int getNumber() {              System.out.println("我是子类的"+number);        number++;          return number;      }  public static void main(String[] args) {Father f=new Test(17);System.out.println("类别是Father的变量覆盖"+f.number);Test t=new Test(17);System.out.println("类别是Test的变量覆盖"+t.number);}}
运行结果是:

父类的静态代码块
父类的非静态代码块
父类的构造函数
类别是Father的变量覆盖17      //这里没有
父类的非静态代码块
父类的构造函数
类别是Test的变量覆盖0

总结:属性的值取父类还是子类并不取决于我们创建对象的类型,而是取决于我们定义的变
量的类型。除了方法获取变量(
当子类覆盖父类的成员变量时,父类方法使用的是父类的成员变量,子类方法使用的是子类的成员变量)。

下面转载一份博客:详细分析一下





0 0
原创粉丝点击