zoukankan      html  css  js  c++  java
  • Java 类的继承详解

    /*文章中用到的代码只是一部分,需要完整代码的可通过邮箱联系我1978702969@qq.com*/

    在面向对象的语言中如C++和JAVA,都有一个比较重要的机制——类的继承。这里将对JAVA中的类的继承机制进行讨论。

    先提一个问题:为什么要使用继承(后面再解答)。

    1.首先是类继承的写法:

      继承的关键字:extends

      格式:
       public class 类名(子类、派生类、超类)  extends 类名(父类、基类) {
      
       }

      在C++中可以实现多继承,而在JAVA中存在局限,只能单继承(即一个子类只能继承一个父类)。

      而多层继承是C++和JAVA中都能实现的

      例如:

    1 class A {}
    2 class B extends A {}
    3 class C extends B {}

    2.子类能继承到父类的那些内容?

      子类能继承到父类的所有的属性和所有的普通方法,不能继承父类的构造方法。

      注意:

         1.尽管子类能继承到父类的所有的属性和所有的普通方法,但对于父类的私有属性是无法直接访问的,需要调用父类中非私有的操作来进行访问。(即对于所有的非私有(no private)操作属于显式继承(可以直接利用对象操作),而所有的私有操作属于隐式继承(间接完成))

         2.在继承关系之中,如果要实例化子类对象,会默认先调用父类构造,为父类之中的属性初始化,之后再调用子类构造,为子类之中的属性初始化,即:默认情况下,子类会找到父类之中的无参构造方法。(如需调用父类的其他构造方法,需使用super)

        

     1 class A {
     2     public A() {         // 父类无参构造
     3               System.out.println("*************************") ;
     4     }
     5 }
     6 class B extends A {
     7     public B() {         // 子类构造
     8               System.out.println("#########################");
     9     }
    10 }
    11 public class TestDemo {
    12     public static void main(String args[]) {
    13               B b = new B() ;   // 实例化子类对象
    14     }
    15 }
    16 
    17 
    18 //运行结果
    19 //*************************
    20 //#########################
    默认的
     1 class A {
     2     public A(String msg) { // 父类构造
     3         System.out.println("*************************");
     4     }
     5 }
     6 
     7 class B extends A {
     8     public B() { // 子类构造
     9         super("Hello"); // 调用父类构造
    10         System.out.println("#########################");
    11     }
    12 }
    13 
    14 public class TestDemo {
    15     public static void main(String args[]) {
    16         B b = new B(); // 实例化子类对象
    17     }
    18 }
    调用其他构造

    3.子类方法重写

      在C++中,可以在子类中写与父类具有相同函数名的函数实现覆盖。而在JAVA中,也可以通过相同的操作实现重写。但需要注意的是:private或final修饰的方法是不能被重写的。

      要求:  

        1、在子类中可以根据需要对从基类中继承来的方法进行重写。

        2、重写的方法和被重写的方法必须具有相同方法名称、参数列表和返回类型。

        3、重写方法不能使用比被重写的方法更严格的访问权限。

      这里还涉及到super这个关键字

         当子类重写方法时,方法中需要重复父类方法的内容,可以使用super,格式:super.方法名(参数值,...)

      

     1 public class Person {
     2     public void beAttack(Person per)
     3     {
     4         if(per.check())
     5             boold-=per.harm;
     6     }
     7 }
     8 
     9 public class Monstrous extends Person{
    10     public void beAttack(Person per)
    11     {
    12         super.beAttack(per);
    13         if(per.check())
    14             System.out.println(showName()+"受到"+per.showName()+"的攻击,减少"+per.showHarm()+"滴血,剩余血量"+boold);
    15         if(!check())
    16         {
    17             System.out.println(per.showName()+"胜利");
    18         }
    19     }
    20     
    21 }
    举个栗子

    4.转型

      自动转型:

          要使用自动转型,要求必须存在继承关系。

          格式:

            父类名  对象名A = new 子类构造方法(参数值,...);

      强制转型:

          如果一个对象可以被强制转型,那么肯定是在前面某个地方被自动转型过!!!

      对于转型的用法,这里可以想象一个场景——老师正在教大学生学习英语;那么这位老师是否可以教初中生学习?高中生?小学生?... 

          按照常理肯定是可以的,但是用代码需要如何实现???

            1.每个类重载一次(会不会觉得太麻烦?)

            2.自动转型

              考虑到大学生、初中生、高中生、小学生...都属于学生,那么可以通过一个学生的父类派生出这些类,然后在teacher类中写方法时括号内的参数就可以用student类,这样就可以通过自动转型来实现这个问题。(有没有感觉代码一下子少了很多?)

    讲到这里继承的大部分的基本内容也讲完了,那么再回到上面的问题——为什么要使用继承:1.提高代码的重用性;2.提高程序的扩展性。 

     1 public class Person {
     2         public void show(){
     3                 System.out.println(".....");
     4         }
     5 }
     6 public class Monstrous extends Person{
     7     public void show1(){
     8                 System.out.println("````");
     9         }  
    10 }
    11 public class Manager {
    12 
    13     public static void main(String[] args) {
    14         Person mon1 = new Monstrous();//自动转型
    15                 mon1.show();
    16                 mon1.show1();//错误
    17         Monstrous mon2 = (Monstrous)mon1;//强制转型
    18         mon2.show1();
    19 }        
    View Code
  • 相关阅读:
    bzoj4705: 棋盘游戏
    bzoj4709 [jsoi2011]柠檬
    51nod 1411 矩阵取数问题 V3
    51nod1258 序列求和V4
    51nod 1348 乘积之和
    PostgreSQL Replication之第九章 与pgpool一起工作(3)
    PostgreSQL Replication之第九章 与pgpool一起工作(2)
    PostgreSQL Replication之第九章 与pgpool一起工作(1)
    PostgreSQL Replication之第八章 与pgbouncer一起工作(5)
    PostgreSQL Replication之第八章 与pgbouncer一起工作(4)
  • 原文地址:https://www.cnblogs.com/csu-lmw/p/9247671.html
Copyright © 2011-2022 走看看