一、基础概念
(一)super关键字
super关键字的用法和this相似。this代表的是当前对象。super代表的是父类中内存空间。
子父类中是不会出现同名属性的情况。
(二)继承中、成员变量问题
当成员变量中出现了同名的局部变量,用关键字 this来区分。当父类中出现了同名的成员变量,用关键字 super来区分
(三)继承中,成员函数问题
1、子父类中出现一样的方法(返回值类型、函数名、参数列表等都一样),创建子类对象调用该方法时,运行的是子类中的方法。
2、这种情况称之为函数的另一个特性----(override)覆盖、重写、复写。
3、注意:
子类覆盖父类权限必须大于等于父类的权限。
覆盖中,静态只能覆盖静态,或者被静态覆盖。
(四)继承中,构造函数问题
1、创建子类对象,父类中的构造函数也会运行的原因:子类的所有构造函数中的第一行,都有一个默认访问父类中空参数的构造函数super();
2、调用本类中的构造函数使用this([实参列表])语句。调用父类中的构造函数用super([实参列表])语句。
3、子类实例化的过程,必须先执行父类中的初始化的原因:子类继承了父类中的内容,所以子类在实例化时,必须要先执行父类中的内容。
4、注意:
如果父类中没有空参数的构造函数时,子类的构造函数必须通过super语句指定要访问的父类中的构造函数。
this()语句和super()语句都必须出现在构造函数的第一行。因为初始化的动作要先执行。所以this()语句和super()语句只能存在一个。
二、实例代码(一)
1 class Fu //默认继承 object 2 { 3 int num = 4; 4 public void show() 5 { 6 System.out.println("父类中的成员函数show ......" ); 7 } 8 Fu() 9 { 10 //默认存在语句superz(); 11 //显示初始化。 12 //构造代码块初始化。 13 System.out.println("父类中的构造函数Fu ......"); 14 } 15 Fu(int x) 16 { 17 //默认存在语句super(); 18 System.out.println("父类中的构造函数Fu ......"+x); 19 } 20 } 21 class Zi extends Fu 22 { 23 //子类和父类的成员变量一样的情况 24 int num = 5; 25 //子类和父类的成员函数一样的情况,进行了覆盖 26 public void show() 27 { 28 //局部变量与成员变量也一样的情况 29 int num = 6; 30 System.out.println("子类中的成员函数show ...... "); 31 32 System.out.println("num = "+num);//输出子类中局部变量num的值 33 System.out.println("num = "+this.num);//输出子类中成员变量num的值 34 System.out.println("num = "+super.num);//输出父类中成员变量num的值 35 } 36 //子类和父类的构造函数一样的情况。子类和父类的语句都执行。 37 Zi() 38 { 39 //默认存在语句super(); 40 41 System.out.println("子类中的构造函数zi ......" ); 42 } 43 Zi(int x) 44 { 45 //默认存在语句super(); 46 super(8);//显示指定super的方式来访问父类中的构造函数。必须定义在第一行 47 System.out.println("子类中的构造函数Zi ......"+x); 48 } 49 } 50 class SuperDemo 51 { 52 public static void main(String[] args) 53 { 54 Zi z1 = new Zi(); 55 z1.show(); 56 Zi z2 = new Zi(5); 57 z2.show(); 58 } 59 }
代码运行
(三)、实例代码(二)
1 class Person 2 { 3 private String name; 4 private int age; 5 6 //父类Person的构造函数 7 Person(String name,int age) 8 { 9 this.name = name; 10 this.age = age; 11 } 12 public void setName(String name) 13 { 14 this.name = name; 15 } 16 public void setAge(int age) 17 { 18 this.age = age; 19 } 20 public String getName() 21 { 22 return name; 23 } 24 public int getAge() 25 { 26 return age; 27 } 28 } 29 //Student继承Person 30 class Student extends Person 31 { 32 Student(String name,int age) 33 { 34 super(name,age);//用super调用父类Person的构造函数。 35 } 36 public void study() 37 { 38 System.out.println("name: "+this.getName()+" age: "+this.getAge()+" study ......"); 39 } 40 } 41 //Worker继承Person 42 class Worker extends Person 43 { 44 Worker (String name,int age) 45 { 46 super(name,age);////用super调用父类Person的构造函数。 47 } 48 public void work() 49 { 50 System.out.println("name: "+this.getName()+" age: "+this.getAge()+" work ......"); 51 } 52 } 53 class SuperDemo1 54 { 55 public static void main(String[] args) 56 { 57 Student p1 = new Student("xiaohong",18); 58 p1.study(); 59 Worker p2 = new Worker("xiaoming",32); 60 p2.work(); 61 } 62 }
代码运行