继承中构造方法的调用与方法重写

继承中构造方法的调用

 


 

在构造方法里面进行初始化的时候,有时如果我们一个一个去初始化,会显得比较麻烦,特别是当在某一个方法里对一些变量初始化,然后以另外一种方式写这个方法的时候,又需要重新对同样的变量初始化时,会毫无意义地增加代码行数,因此,我们可以把子类里面的变量的初始化写在一个方法里,这样一来,以后如果再需要初始化,直接调用这个方法即可。下面来看代码:

 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的,那么是允许的。最后,如果放在一个变量前面,那么这个变量就变成了一个常量,在第一次被初始化之后,就不能再次初始化了。

 

posted @ 2021-01-28 21:42  EvanTheBoy  阅读(210)  评论(0)    收藏  举报