面向对象的三大特性之二——继承(含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;子类的访问权限要大于等于父类。

posted @ 2017-04-14 20:27  王醒燕  阅读(1542)  评论(0编辑  收藏  举报