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;子类的访问权限要大于等于父类。