文章目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 class Father {

String name;
int age;

public void test() {
System.out.println("我是父类的test()方法");
System.out.println("父类姓名=" + this.name + " 父类年龄=" + this.age);
}

}

public class Son extends Father {
public void test() {
super.test();
System.out.println("我是子类的test()方法");
System.out.println("子类姓名=" + this.name + " 子类年龄=" + this.age);
}

public static void main(String[] args) {
Son son = new Son();
son.name = "test";
son.age = 18;
son.test();
}

}

理解1:

1)我觉得super.test()只是在说调用父类中的test方法,并不是说用父类对象来调用父类的test方法。而你使用son子对象来调用子类的test方法,此时虽然子类test中有父类的test方法,但是你此时是使用son子对象来调用父类的test方法的,所以父类的test方法里面的this指的是调用该方法的son子对象

2)这里面的super关键词,我觉得就是作为一个对于父类的方法的指示。参考Java核心卷;有些人认为 super 与 this 引用是类似的概念, 实际上,这样比较并不太恰当。这是因为 super 不是一个对象的引用, 不能将 super 赋给另一个对象变量, 它只是一个指示编译器调用超类方法的特殊关键字.

理解2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class Servlets {
public void service(String req,String resp){
System.out.println("Servlets:service:(1)");
if(req.equals("doGet")){
doGet();
}else if(resp.equals("doPost")){
doPost();
}
}
public void doGet(){
System.out.println("Servlets.doGet:(2)");
int i=1/0;
}
public void doPost() {
System.out.println("Servlets.doPost:(3)");
int i=1/0;
}
}

public class Son extends Servlets{

@Override
public void service(String req, String resp) {
// TODO Auto-generated method stub
System.out.println("Son.service:(4)");
super.service(req, resp);
}

@Override
public void doGet() {
// TODO Auto-generated method stub
System.out.println("Son.doGet:(5)");
super.doGet();
}

@Override
public void doPost() {
// TODO Auto-generated method stub
System.out.println("Son.doPost(6)");
super.doPost();
}

}
//测试类
public class Test {
public static void main(String[] args) {
Son son=new Son();
son.service("doGet","");
}
}

打印结果:

1
2
3
4
5
6
7
8
9
10
Son.service:(4)
Exception in thread "main" java.lang.ArithmeticException: / by zero
Servlets:service:(1)
Son.doGet:(5)
Servlets.doGet:(2)
at com.servlet_source_test.Servlets.doGet(Servlets.java:14)
at com.servlet_source_test.Son.doGet(Son.java:16)
at com.servlet_source_test.Servlets.service(Servlets.java:7)
at com.servlet_source_test.Son.service(Son.java:9)
at com.servlet_source_test.Test.main(Test.java:6)

分析:son对象调用service,service中调用super.service(),父类的service中调用this.doGet()方法,很明显调用的是子类的doGet()方法,该this是son对象, super只是一个指示编译器调用超类方法的特殊关键字.

文章目录