继承中构造方法的调用与方法重写
继承中构造方法的调用
在构造方法里面进行初始化的时候,有时如果我们一个一个去初始化,会显得比较麻烦,特别是当在某一个方法里对一些变量初始化,然后以另外一种方式写这个方法的时候,又需要重新对同样的变量初始化时,会毫无意义地增加代码行数,因此,我们可以把子类里面的变量的初始化写在一个方法里,这样一来,以后如果再需要初始化,直接调用这个方法即可。下面来看代码:
1 package com.hw.static0127;
2 class People{
3 private String name;
4 private int age;
5 public People(String name,int age){
6 this.name = name;
7 this.age = age;
8 }
9 public String getName(){
10 return name;
11 }
12 public void eat(){
13 System.out.println(getName()+"在吃饭");
14 }
15 }
16
17 class Student extends People{
18 private double score;
19 private int rankNum;
20
21 public Student(String name,int age,double score,int rankNum){
22 super(name,age);
23 init(score,rankNum);
24 }
25 private void init(double score,int rankNum){
26 this.score = score;
27 this.rankNum = rankNum;
28 }
29 public void setscore(double score){
30 this.score = score;
31 }
32 public double getscore(){
33 return score;
34 }
35 public int getRankNum(){
36 return rankNum;
37 }
38 public void show(){
39 System.out.println("学生的名字是:"+getName()+",排名是:"+getRankNum());
40 }
41 }
42
43 class Teacher extends People{
44 private double salary;
45 private int level;
46 public Teacher(String name,int age,double salary,int level){
47 super(name,age);
48 init(salary,level); //初始化时直接调用这个方法
49 }
50 private void init(double salary,int level){ //把初始化写在一个专门的方法里
51 this.salary = salary;
52 this.level = level;
53 }
54 public void setSalary(double salary){
55 this.salary = salary;
56 }
57 public double getSalary(){
58 return salary;
59 }
60 public void setLevel(int level){
61 this.level = level;
62 }
63 public int getLevel(){
64 return level;
65 }
66 public void show(){
67 System.out.println("老师的名字是:"+getName()+",等级是:"+getLevel());
68 }
69 }
70
71 public class Explanation {
72 public static void main(String[] args){
73 Student stu = new Student("敕勒川",20,100,1);
74 stu.show();
75 stu.eat();
76 System.out.println(stu.getName()+"的分数是:"+stu.getscore());
77 stu.setscore(98);
78 System.out.println(stu.getName()+"现在的分数是:"+stu.getscore());
79 Teacher tch = new Teacher("阴山下",25,5000,7);
80 tch.show();
81 tch.eat();
82 System.out.println(tch.getName()+"的薪水是:"+tch.getSalary());
83 tch.setSalary(6000);
84 System.out.println(tch.getName()+"现在的薪水是:"+tch.getSalary());
85 }
86 }
来看下运行效果:

完全正常!
方法重写:
我们在People类里面定义了一个eat方法,但是,实际生活中由于某些需要,我们在具体到是学生类还是老师类的时候,这个行为肯定是有区别的。因此,我们需要在子类中重写方法。一般地,当子类中的方法名、参数和返回值与父类相同的时候,就是方法重写(也叫方法覆盖)。其意义是:子类和父类拥有同样的功能,但子类有自己的特定内容和特定实现方式,可以定义一个不同的名字方法,但为了见名知意,保持父类名字,自己重新实现方法体。还是上面那个程序,我们来看看重写方法eat方法后的代码:
1 package com.hw.static0127;
2 class People{
3 private String name;
4 private int age;
5 public People(String name,int age){
6 this.name = name;
7 this.age = age;
8 }
9 public String getName(){
10 return name;
11 }
12 public void eat(){
13 System.out.println(getName()+"在吃饭");
14 }
15 }
16
17 class Student extends People{
18 private double score;
19 private int rankNum;
20
21 public Student(String name,int age,double score,int rankNum){
22 super(name,age);
23 init(score,rankNum);
24 }
25 private void init(double score,int rankNum){
26 this.score = score;
27 this.rankNum = rankNum;
28 }
29 public void setscore(double score){
30 this.score = score;
31 }
32 public double getscore(){
33 return score;
34 }
35 public int getRankNum(){
36 return rankNum;
37 }
38 public void show(){
39 System.out.println("学生的名字是:"+getName()+",排名是:"+getRankNum());
40 }
41 public void eat(){ //方法的重写
42 System.out.println("先刷校园卡");
43 System.out.println(getName()+"在吃饭");
44 }
45 }
46
47 class Teacher extends People{
48 private double salary;
49 private int level;
50 public Teacher(String name,int age,double salary,int level){
51 super(name,age);
52 init(salary,level); //初始化时直接调用这个方法
53 }
54 private void init(double salary,int level){ //把初始化写在一个专门的方法里
55 this.salary = salary;
56 this.level = level;
57 }
58 public void setSalary(double salary){
59 this.salary = salary;
60 }
61 public double getSalary(){
62 return salary;
63 }
64 public void setLevel(int level){
65 this.level = level;
66 }
67 public int getLevel(){
68 return level;
69 }
70 public void show(){
71 System.out.println("老师的名字是:"+getName()+",等级是:"+getLevel());
72 }
73 public void eat(){ //方法的重写
74 System.out.println("先出示教师证");
75 System.out.println(getName()+"在吃饭");
76 }
77 }
78
79 public class Explanation {
80 public static void main(String[] args){
81 Student stu = new Student("敕勒川",20,100,1);
82 stu.show();
83 stu.eat();
84 System.out.println(stu.getName()+"的分数是:"+stu.getscore());
85 stu.setscore(98);
86 System.out.println(stu.getName()+"现在的分数是:"+stu.getscore());
87 Teacher tch = new Teacher("阴山下",25,5000,7);
88 tch.show();
89 tch.eat();
90 System.out.println(tch.getName()+"的薪水是:"+tch.getSalary());
91 tch.setSalary(6000);
92 System.out.println(tch.getName()+"现在的薪水是:"+tch.getSalary());
93 }
94 }
运行效果:

要注意一点:重写的时候,访问权限不能更低!可以把一个private的方法重写成public的方法,但不能把一个public的方法重写成private的方法!
另外需注意:

最后,来看看final关键字:

意思是:放到上面的代码中,如果我们写成final class People,那么这个People是不能被继承的!其次,如果上面的代码中,父类中的eat方法我们写成public final void eat(),那么在子类中是不允许被重写的。但是!如果父类中的这个eat方法是private的,那么是允许的。最后,如果放在一个变量前面,那么这个变量就变成了一个常量,在第一次被初始化之后,就不能再次初始化了。

浙公网安备 33010602011771号