继承

作者: 妃雪 | 来源:发表于2017-06-15 10:49 被阅读5次

继承是面向对象的第二大特征,继承是在已有的代码结构上扩充新的功能。

例子:观察下面的代码

  class Student{ 
   private int age;
   private String name;
   public void setAge(int age){ 
     this.age=age;
   } 
   public void setName(String name){ 
     this.name=name;
   }
   public int getAge(){ 
     return this.age;
   } 
   public String getName(){ 
     return this.name;
   } 
   public  String getInfo(){ 
      return "名字是:"+this.name+", 年龄是:"+this.age;
   } 
   public void readBook(){ 
      System.out.println("我会读书!");
   } 
 } 
class Worker{ 
   private int age;
   private String name;
   public void setAge(int age){ 
     this.age=age;
   } 
   public void setName(String name){ 
     this.name=name;
   }
   public int getAge(){ 
     return this.age;
   } 
   public String getName(){ 
     return this.name;
   } 
   public  String getInfo(){ 
      return "名字是:"+this.name+", 年龄是:"+this.age;
   } 
   public void moveBrik(){ 
      System.out.println("我会搬砖!");
   } 
 } 
 public class Demo{ 
    public static void main(String[] args){ 
       Student stu=new Student();
       stu.readBook();
       Worker wrk=new Worker();
       wrk.moveBrik();
       
    } 
}

以上代码出现了两个类中都有age,name,而且有相同的setter和getter方法,此外还有getInfo()方法相同,那么这样代码形式就出现了大量重复代码,于是我们可以考虑将这些重复的信息定义到一个共公的类中,然后让子类去继承这个公共的类,就解决了代码的重复,这个公共的类有人叫做基类、父类、超类。子类有人叫做派生类。
那么要实现继承就要使用关键字extends来实现,基本的语法如下:

· class 子类 extends 父类{}

例子:继承的使用

class Person{ //定义一个父类
   private int age;
   private String name;
   public void setAge(int age){ 
     this.age=age;
   } 
   public void setName(String name){ 
     this.name=name;
   }
   public int getAge(){ 
     return this.age;
   } 
   public String getName(){ 
     return this.name;
   } 
   public  String getInfo(){ 
      return "名字是:"+this.name+", 年龄是:"+this.age;
   } 
 } 
//---------------------------子类-------------------------------
 class Student extends Person{  //子类
   public void readBook(){ 
      System.out.println("我会读书!");
   } 
 } 
//---------------------------子类-------------------------------
class Worker extends Person{  //子类
   public void moveBrik(){ 
      System.out.println("我会搬砖!");
   } 
 } 
 public class Demo{ 
    public static void main(String[] args){ 
       Student stu=new Student();
       stu.readBook();
       Worker wrk=new Worker();
       wrk.moveBrik();
    } 
}

二、继承的局限性

单继承局限,一个子类只能有一个父类,但是继承可以实现多重继承。

class A{} //顶级父类
class B extends A{} //B类具有A的所有操作
classs C extends B{} //C类具有B和A的所有操作。

例子:调用父类的无参构造方法

 class A{ 
    public A(){ 
      System.out.println("这是A无参数构造方法");
    } 
 }
 class B extends A{ 
   public B(){ 
      System.out.println("这是B无参数构造方法");
   } 
 } 
 class C extends B{ 
   public C(){ 
      System.out.println("这是C无参数构造方法");
   } 
 } 
 public class Demo{ 
    public static void main(String[] args){ 
       new C();//输出多少
    } 
}       

打印:
这是A无参数构造方法
这是B无参数构造方法
这是C无参数构造方法

**结果: 实例化子类的时候先调用父类的构造方法。

例子:去掉无参构造方法

 class A{   
//----------------------去掉父类的无参构造方法----------------------------------
    public A(String name){ 
      System.out.println("这是A无参数构造方法");
    } 
 }
 class B extends A{ 
//----------------------- 父类的无参构造方法取掉之后,此处会报错-----------------
   public B(){ 
      System.out.println("这是B无参数构造方法");
   } 
 } 
 class C extends B{ 
   public C(){ 
      System.out.println("这是C无参数构造方法");
   } 
 } 
 public class Demo{ 
    public static void main(String[] args){ 
       new C();//输出多少
    } 
}

结果: 证明了“在实例化子类对象的时候默认调用父类的无参数构造方法“。
调用有参数的构造方法 使用 super()来显示指定要调用的构造方法。

例子:调用有参的构造方法

 class A{   
    public A(){ 
      System.out.println("这是A无参数构造方法");
    } 
    public A(String name){ 
      System.out.println("这是A有一个参数构造方法");
    } 
    public A(String name,int age){ 
      System.out.println("这是A有2个参数构造方法");
    } 
 }
 class B extends A{ 
   public B(){ 
//-----------------------super 调用指定的构造方法---------------------------------

     super("阿萨德",123);//要放到构造方法中的第一行
      System.out.println("这是B无参数构造方法");
   } 
 } 
 class C extends B{ 
   public C(){ 
      System.out.println("这是C无参数构造方法");
   } 
 } 
 public class Demo{ 
    public static void main(String[] args){ 
       new C();//输出多少
    } 

打印:
这是A有2个参数构造方法 
这是B无参数构造方法
这是C无参数构造方法

三、私有属性的继承问题

疑问: private封装的属性是否可以被子类访问?是否可以被子类继承?怎么访问??

子类要访问父类的属性要使用 : “ super.属性名” 的方式实现

例子: 子类是否能访问父类的私有属性?

class Person{ //定义一个父类
   private int age=100;//这是私有属性
   public String name="阿强";//这是public修饰的属性
   public void setAge(int age){ 
     this.age=age;
   } 
   public void setName(String name){ 
     this.name=name;
   }
   public int getAge(){ 
     return this.age;
   } 
   public String getName(){ 
     return this.name;
   } 
   public  String getInfo(){ 
      return "名字是:"+this.name+", 年龄是:"+this.age;
   } 
 } 
 class Student extends Person{  
   public void readBook(){ 
      System.out.println("我会读书!");
//-----------------------子类访问父类的私有属性报错-----------------------------------
      System.out.println("访问父类中的属性:age="+super.age);  //
      System.out.println("访问父类中的属性:name="+super.name);
   } 
 } 
  
 public class demo{ 
    public static void main(String[] args){ 
       new Student().readBook();//输出多少
    } 
}

上面的例子中,子类访问父类的私有属性,报错。

结果: 父类的私有属性并不能被直接访问。

例子: 私有属性继承的问题

class Person{ //定义一个父类
   private int age=100;//这是私有属性
   private String name="阿强";//这是public修饰的属性
   public void setAge(int age){ 
     this.age=age;
   } 
   public void setName(String name){ 
     this.name=name;
   }
   public int getAge(){ 
     return this.age;
   } 
   public String getName(){ 
     return this.name;
   } 
   public  String getInfo(){ 
      return "名字是:"+this.name+", 年龄是:"+this.age;
   } 
 } 
 class Student extends Person{  
   public void readBook(){ 
      System.out.println("我会读书!"); 
   } 
 } 

 public class demo{ 
    public static void main(String[] args){ 
      Student stu=new Student();
//-------------------------------------------------------
      stu.setAge(123);  //如果不能被继承,那么123这一个值是不可能被保存的。
      System.out.println(stu.getAge());//看看有没有输出 123?
    } 
}

结果: 输出了123.

说明: 子类不能直接访问父类的私有属性
但是,子类可以继承父类的私有属性,称为隐式继承。

相关文章

  • 继承 继承

    属性拷贝 继承不单单能通过原型链实现,也能通过其他方式实现,属性拷贝就是其中一种方法。 通过属性拷贝也能实现继承子...

  • 继承(单继承,多继承)

    将共性的内容放在父类中,子类只需要关注自己特有的内容 python中所有的内容都是对象,所有的对象都直接或间接继承...

  • js继承方式

    类式继承 构造函数继承 组合继承 类式继承 + 构造函数继承 原型式继承 寄生式继承 寄生组合式继承 寄生式继承 ...

  • Python-学习之路-08 OOP -02

    单继承和多继承 单继承:每个类只能继承一个类 多继承:每个类可以继承多个类 单继承的多继承的优缺点 菱形继承/钻石...

  • 原型相关(二)

    1.继承 继承方式:接口继承(只继承方法签名)实现继承(继承实际的方法)ECMAScript只支持实现继承,并且主...

  • 继承

    继承的引入和概述 继承案例和继承的好处 继承的弊端 Java中继承的特点 继承的注意实现和什么时候使用继承 继承中...

  • Java面向对象三大特性之继承

    继承 一、继承的特点 Java只支持单继承单继承 多继承 单继承、多继承优缺点①单继承优点:提高了代码的复用性,让...

  • 7、面向对象的程序设计3(《JS高级》笔记)

    三、继承 许多OO语言都支持两种继承方式:接口继承和实现继承。接口继承只继承方法签名,而实现继承则继承实际方法。由...

  • 【重学前端】JavaScript中的继承

    JavaScript中继承主要分为六种:类式继承(原型链继承)、构造函数继承、组合继承、原型式继承、寄生式继承、寄...

  • js之继承

    文章主讲 JS 继承,包括原型链继承、构造函数继承、组合继承、寄生组合继承、原型式继承、 ES6 继承,以及 多继...

网友评论

      本文标题:继承

      本文链接:https://www.haomeiwen.com/subject/rwdyqxtx.html