zoukankan      html  css  js  c++  java
  • 面向对象的三大特性之二——继承(含super的使用)

    1.继承的语法:class 子类 extends 父类

    1

     1 class Person
     2 {
     3     int age;
     4     String name;
     5     public void print1()
     6     {
     7         System.out.println("我叫"+name+",今年"+age+"岁。");
     8     }
     9 }
    10 class Student extends Person
    11 {
    12     String school;
    13     Student(int age,String name,String school)
    14     {
    15         this.age=age;
    16         this.name=name;
    17         this.school=school;
    18     }
    19     public void print2()
    20     {
    21         System.out.println("我在"+school+"读书。");
    22     }
    23 }
    24 public class T02
    25 {
    26     public static void main(String[] args)
    27     {
    28         Student s = new Student(21,"Mary","黑龙江科技大学");
    29         s.print1();
    30         s.print2();
    31     }
    32 }

    2.Java中是单继承的,不允许多重继承,但可以使用多层继承。

      即:一个类C只能有一个父类B,类C对类B是单继承的;而类B只有一个父类A,那么类C对类A就是多层继承。

    class A
    {}
    class B extends A
    {}
    class C extends B
    {}

    3.Java继承只能直接继承父类中的公有属性和公有方法,而隐含的继承了私有属性或私有方法。

    修改例1,得到例2

     1 class Person
     2 {
     3     private int age;
     4     String name;
     5     public void setAge(int age)
     6     {
     7         this.age=age;
     8     }
     9     public int getAge()
    10     {
    11         return age;
    12     }
    13     public void print1()
    14     {
    15         System.out.println("我叫"+name+",今年"+age+"岁。");
    16     }
    17 }
    18 class Student extends Person
    19 {
    20     String school;
    21     Student(String name,String school)
    22     {
    23          //setAge(21);//也可以出现在这里,道理同下
    24         this.name=name;
    25         this.school=school;
    26     }
    27     public void print2()
    28     {
    29         print1();
    30         System.out.println("我在"+school+"读书。");
    31     }
    32 }
    33 public class T02
    34 {
    35     public static void main(String[] args)
    36     {
    37         Student s = new Student("Mary","黑龙江科技大学");
    38         s.setAge(21);
    39         s.print2();
    40     }
    41 }

       从上面例子看出,子类对父类中私有属性的调用,要借助setter()getter()方法。即,我们可以通过父类的公有方法(包括构造方法)来访问父类的私有数据成员。

    4.final修饰的类不能被继承。

    5.super关键字的使用。

    在上述例1的继承中,在初始化对象的时候,会默认先调用父类的无参构造方法,然后再调用子类的构造方法。事实上是子类构造方法的首行隐含了一个“super();”语句。下面调用父类有参构造函数来体现super的使用:

     1 class Person
     2 {
     3     int age;
     4     String name;
     5     Person(int age,String name)
     6     {
     7         this.age=age;
     8         this.name=name;
     9     }
    10     public void print1()
    11     {
    12         System.out.println("我叫"+name+",今年"+age+"岁。");
    13     }
    14 }
    15 class Student extends Person
    16 {
    17     String school;
    18     Student(int age,String name,String school)
    19     {
    20         super(age,name);//必须写在第一行,否则不能编译通过
    21         this.school=school;
    22     }
    23     public void print2()
    24     {
    25         System.out.println("我在"+school+"读书。");
    26     }
    27 }
    28 public class T02
    29 {
    30     public static void main(String[] args)
    31     {
    32         Student s = new Student(21,"Mary","黑龙江科技大学");
    33         s.print1();
    34         s.print2();
    35     }
    36 }

    事实上,super关键字的作用就是调用父类中的属性和方法(包含构造方法)。除特殊需求外,大多数情况是隐式使用,有时候作为和this共同出现区别子类属性(方法)和父类属性(方法)。

    Student(int age,String name,String school)
    {
        super.age=age;//父类属性
        super.name=name;//父类属性
        this.school=school;//子类属性
    }

    6.方法的重写:子类中的方法和父类中的方法的名称、参数个数和类型、返回值类型等都完全一致时,就称子类中的方法重写了父类中的方法。

     1 class Father
     2 {
     3     public void speak()
     4     {
     5         System.out.println("我叫Tom,我是Alan的父亲。");
     6     }
     7 }
     8 class Son extends Father
     9 {
    10     public void speak()
    11     {
    12         System.out.println("我叫Alan,我是Tom的儿子。");
    13     }
    14 }
    15 public class T02
    16 {
    17     public static void main(String[] args)
    18     {
    19         Son p = new Son();
    20         p.speak();
    21     }
    22 }

    输出结果:我叫Alan,我是Tom的儿子。

    重写中需要注意的问题:被重写的方法不能为static;子类的访问权限要大于等于父类。

    看似简单的知识背后,承载的是收获和成长!
  • 相关阅读:
    团体程序设计天梯赛-练习集L1-002. 打印沙漏
    团体程序设计天梯赛-练习集L1-001. Hello World
    腾讯的一笔画游戏
    Educational Codeforces Round 11
    POJ 1149 PIGS
    POJ 3422 Kaka's Matrix Travels
    POJ 2914 Minimum Cut
    POJ 1815 Friendship
    POJ 1966 Cable TV Network
    BZOJ 1797: [Ahoi2009]Mincut 最小割
  • 原文地址:https://www.cnblogs.com/wxywxy/p/6710735.html
Copyright © 2011-2022 走看看