• java面向对象(下)-- 类的继承、方法的重写、super关键字、final关键字


    继承的概念

      在现实生活中,继承一般是指子女继承父类的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。

      例如:猫和狗都属于动物,程序中便可以描述为猫和狗都继承自动物,同理,波斯猫和巴厘猫继承自猫,而沙皮狗和斑点狗继承自狗,这些动物之间会形成一个继承体系,如图:

      

    继承的特性

    • 子类拥有父类非 private 的属性、方法。

    • 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。

    • 子类可以用自己的方式实现父类的方法。

    • Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。

    • 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。

     

      在java中,类的继承是指在一个现有类的继承上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法。在程序中,如果想声明一个类继承另一个类,需要使用extends关键字。

     1 //定义Animal类
     2  class Animal {
     3     String name;//定义name属性
     4        //定义动物叫的方法
     5        void shout() {
     6          System.out.println("动物发出了叫声!");
     7     }
     8 }
     9 //Dog类继承Animal类
    10 class Dog extends Animal{
    11      //定义一个定义name的方法
    12     public void printName(){
    13         System.out.println("name = " + name);
    14     }
    15 }
    16 //定义测试类
    17 class Example {
    18     public static void main(String[] args) {
    19         Dog dog = new Dog(); //创建一个Dog类的实例对象
    20         dog.name ="沙皮狗"; //为Dog类的属性name赋值
    21         dog.printName();    //调用Dog的printName()方法
    22         dog.shout();    //调用Dog继承来的shout()方法
    23     }
    24  }

    运行结果:

     

       Dog通过extends关键字继承了Animal类,这样Dog便是Animal类的子类。子类虽然没有定义name属性和shout()方法,但是却能访问者两个成员,也就是说,子类在继承父类的时候,会自动拥有父类所有的成员。

     注意:

      1.在java中,类只支持单继承,不允许多次继承,也就是说一个类只能有一个直接父类。

       2.多个类可以继承一个父类,下面的情况是允许的

     

       3.在java中,多层继承是可以的,即一个类的父类可以再去继承另外的父类。

       4.在java中,子类和父类是一种相对的概念,也就是说一个类是某个类父类的同时,也可以是另一个类的子类。

    方法的重写

       在继承关系中,子类会自动继承父类中定义的方法,但有时在子类中需要对继承的方法进行一些修改,即对父类的方法进行重写。在子类中重写的方法需要和父类被重写的方法具有相同的方法名、参数列表以及返回值类型

      在前面的例子中,Dog从Animal类继承了shout()方法,但是太抽象,这显然不能描述一种具体动物的叫声,为了解决这个问题,可以在Dog中重写父类Animal中的shout()方法,以满足需求。

     1 //定义Animal类
     2  class Animal {
     3        //定义动物叫的方法
     4        void shout() {
     5          System.out.println("动物发出了叫声!");
     6     }
     7 }
     8 //Dog类继承Animal类
     9 class Dog extends Animal{
    10      //定义狗叫的方法
    11     void shout(){
    12         System.out.println("汪汪汪......");
    13     }
    14 }
    15 //定义测试类
    16 class Example {
    17     public static void main(String[] args) {
    18         Dog dog = new Dog(); //创建一个Dog类的实例对象
    19         dog.shout();    //调用Dog的shout()方法
    20     }
    21  }

    运行结果:

       子类对父类的方法进行重写后,只会调用子类重写的方法,并不会调用父类的方法

     注意:子类重写父类方法时,不能使用比父类中被重写的方法更严格的访问权限,如父类中的方法时public,子类的方法就不能是private的。

    super关键字

      当子类重写父类的方法后,子类对象将无法访问父类被重写的方法,为了解决这个问题,在java中专门提供了一个super关键字用于访问父类的成员,例如访问父类的成员变量、成员方法和构造方法。

      1.使用super关键字调用父类的成员变量和成员方法。

      语法格式:super.成员变量 

           super.成员方法([参数1,参数2····])

     1 //定义Animal类
     2  class Animal {
     3      String name = "动物";
     4        //定义动物叫的方法
     5        void shout() {
     6          System.out.println("动物发出了叫声!");
     7     }
     8 }
     9 //Dog类继承Animal类
    10 class Dog extends Animal{
    11      String name = "沙皮狗";
    12      //重写父类的shout()方法
    13     void shout(){
    14         super.shout();
    15     }
    16     //调用打印name的方法
    17     void printName(){
    18         System.out.println("name  = " +super.name);//访问父类的成员变量
    19     }
    20 }
    21 //定义测试类
    22 class Example {
    23     public static void main(String[] args) {
    24         Dog dog = new Dog(); //创建一个Dog类的实例对象
    25         dog.shout();    //调用Dog对象重写的shout()方法
    26         dog.printName();//调用Dog对象的printName()方法
    27     }
    28  }

    运行结果:

       在子类Dog的shout()方法使用"super.shout()"调用了父类被重写的方法,在printName()方法中使用''super.name''访问的是父类的成员变量。

      2.使用super关键字调用父类的构造方法。

        语法格式:super([参数1,参数2·····])

     1 //定义Animal类
     2  class Animal {
     3     public Animal(String name) {
     4         System.out.println("我是一只"+name);
     5     }
     6 }
     7 //Dog类继承Animal类
     8 class Dog extends Animal{
     9     public Dog() {
    10         super("沙皮狗");
    11     }
    12 }
    13 //定义测试类
    14 class Example {
    15     public static void main(String[] args) {
    16         Dog dog = new Dog(); //实例化Dog对象
    17 
    18     }
    19  }

    运行结果:

       在实例化Dog对象时一定会调用Dog的构造方法,Dog类的构造方法被调用时父类的构造方法也被调用了。需要注意的是,通过super调用父类的构造方法的代码必须位于子类构造方法的第一行,并且只能出现一次。

      在子类的构造方法中通过super指定调用父类的哪个构造方法,如果没有指定,在实例化类对象时,会自动调用父类无参的构造方法,如果没特殊要求,尽量在类中定义一个无参的构造方法,避免被继承时出现错误。

      

    super 与 this 关键字

    super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。

    this关键字:指向自己的引用。

    final关键字

     final关键字可用于修饰类、变量和方法,它有“这是无法改变的”或者“最终”的含义,因此被final修饰的类、变量和方法将具有以下特性:

    • final修饰的类不能被继承。
    • final修饰的方法不能被子类重写。
    • final修饰的变量(成员变量和局部变量)是常量,只能赋值一次

    注意:

    无论属性是基本类型还是引用类型,作用都是变量里面存放的“值”不可变

    经常和static关键字一起使用,作为常量

    • 基本类型,变量放的是实实在在的值,如1,“abc”等

    • 引用类型,变量放的是个地址,所以用final修饰引用类型变量指的是它里面的地址不能变,即它只能指向初始时指向的那个对象,而不关心指向的对象内容的变化

    所以修饰的变量必须被初始化

      

     

  • 相关阅读:
    HTTp状态详解
    考虑实现一个web报表制作工具
    UCML编译型应用框架快速开发工具体系介绍
    SQL Server 2000 SP4发布
    有几个mywallop的邀请,想要看看的给我留言吧
    写给刚接触Web Service的朋友
    国内完全免费的电子书籍下载,大家可以上去淘淘宝
    c#高性能在WEB端产生验证图片
    在.net中使用xmlhttp组件读取网页源码
    Oracle经典书籍介绍
  • 原文地址:https://www.cnblogs.com/wx60079/p/13403013.html
Copyright © 2020-2023  润新知