java—基础篇——继承

来源:互联网 发布:qq飞车淘宝商城 编辑:程序博客网 时间:2024/06/12 21:34



                                                                       继承   简述二


一  继承的特点:


            1.  提高了代码的复用性

             2.  让类与类之间产生了关系

             3.  必须是类与类之间有所属关系才可以继承


二   如何判断两个类之间是否具有所属关系呢?


            例如:

         

  class  A            {                      void demo1(){}                      void demo2(){}              }           class B   extends  A             {                    void demo1(){}                }


       ***对于这两个类来说,如果类B中不具有类A中的demo2方法,那么他们之间就没有所属关系,就不存在继承关系。

          *** 先有父类,  后有子类 。


三   继承关系中  变量的调用:


       1.java语言中,只支持单继承,不支持多继承因为多继承容易带来安全隐患,当多个类中定义了相同的功能时,当功能内容不同时,子类对象不确定应该运行哪一个(java语言中支持多实现)。

       例如:

首先定义两个类

       

<pre name="code" class="java">class A{void show() {System.out.println("java");}}class B {void show() {System.out.println("worke");}}

定义类C来继承A  B

     

class C extends A,B{void show() {}}

建立测试类

     

class Test{public static void main(String[] args){C c = new C();c.show();// 此时子类对象不明确应该调用哪个类中的show方法}}


       2.java语言中支持多层继承


     例如:

     

class A{void show() {System.out.println("java");}}

   

class B extends A{void show() {System.out.println("worke");}}

class C extendsB{void show() {}}



      

      3.变量访问

         如果子类中出现非私有的同名成员变量时,子类要访问本类中的变量时使用thiss  ,要访问父类中的同名变量时  要使用super

例如:

     

class Fu{int number = 2;}

     

class Zi extends Fu{int number = 3;void show(){int number = 5;System.out.println(number); // 5System.out.println(this.number);// 3System.out.println(super.number);// 2}}

建立一个测试类

public class Test {public static void main(String[] args) {        Zis  z = new Zis();         z.show();}


输出结果为5,3,2

四  继承中函数的调用

     1. 重写(覆盖)

       当子类继承了父类,沿袭了父类的功能,到子类中,子类虽具备该功能,但是功能的内容却和父类不一样,这时,保留父类定义功能,重新定义内容;

 例如:————————

   

class Fu{void show(){System.out.println("haha");}}

     

class Zi extends Fu{void show(){System.out.println("000");}}


这个Zi类中就覆写了父类Fu中的show方法


       2.覆写的要求


      <1>子类要覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败


          <2> 静态类只能覆盖静态类


  例如:————————

class Fu{int show(){return null;}}


class Zi extends Fu{void show(){System.out.println("000");}}


     对于这个继承关系中,show方法没有被覆盖,也就是说类Zi中有两个show方法



例:————————

        

class Fu{private void show(){System.out.println("haha");}}


    

class Zi extends Fu{public void show(){System.out.println("000");}}


对于这个继承关系中,编译是可以通过的,因为子类的show方法权限(public)大于父类的show方法权限(private);



例:——————

     

class Fu{void show(){System.out.println("haha");}}

     

class Zi extends Fu{private void show(){System.out.println("000");}}

这种情况下的继承是不允许的,因为子类的show方法权限(private)小于父类中show方法的权限;


五  继承关系中的构造函数


      在子类对类进行初始化时,父类构造函数也会运行,是因为子类的构造函数前有一条隐式的语句 super();



例如:——————

父类

class Fu{Fu(){System.out.println("Fu class method");}}

子类
class Zi extends Fu{Zi(){System.out.println("zi class method");}}

建立测试类
class Test{public static void main(String[] args)       {             Zi    z  =  new Zi();            //输出结果将会是  Fu class method                         //Zi   class  method        }}

上面的这个例子也就是说明子类对象实例化过程中,会先执行一遍父类跌构造函数,



例:——————


父类

class Fu{Fu(){System.out.println("Fu class method");}Fu(int i){System.out.println("Fu class method" + i);}}

子类
class Zi extends Fu{Zi(){// super____Fu()System.out.println("zi class method");}Zi(int i){// super____Fu()System.out.println("zi class method" + i);}}

建立测试
class Test{public static void main(String[] args) {Zi z = new Zi();Zi z = new Zi(4);// 输出结果将会是 Fu class method// Zi class method// Fu class method// Zi class method 4}}






例——————

class Person{private String name;private int age;Person(String name){this.name = name;}void show() {}}class Student extends Person{Student(String name){super(name);// 这里可以直接使用父类方法}void method(){super.show();}}


六  子类实例化过程

     子类的所有构造函数,默认都会访问父类中的空参数的构造函数,因为子类的每一 个构造函数内的第一行都有一句隐式的super();


       当父类中没有空参数的构造函数时,子类必须手动通过super 语句形式来指定要访问父类中的构造函数;


      子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数,子类中至少有一个构造函数会访问父类空参数的构造函数




 



0 0
原创粉丝点击