在java中有super和this这2个关键字,我有时候对super有一些疑惑,我甚至认为我对super和this这2个关键字还没理解!大家请看下面的代码,帮我解惑一些呗!谢谢
package com.jiongmeng;
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() {
/**
在Son类的test()方法中的super.test();这行代码的意思是调用父类的test()方法,我对这行代码有点疑
惑,super代表父对象,那么很明显,就是去调用Father类中的test()方法,那么此时,在执
行到Father类中的test()方
法中的System.out.println("父类姓名=" + this.name + " 父类年龄=" + this.age);这行代码的时候,这
行代码中的this表示的是父对象还是子对象(我们都知道this表示的是当前对象,我就想知
道此时this表示的当前对象到底是父类对象还是子类对象),知道的人请帮忙解答下?谢谢!
*/
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 = "杨过";
son.age = 12;
son.test();
}
}
在Son类的test()方法中的super.test();这行代码的意思是调用父类的test()方法,我对这行代码有点疑惑,super代表父对象,那么很明显,就是去调用Father类中的test()方法,那么此时,在执行到Father类中的test()方法中的System.out.println("父类姓名=" + this.name + " 父类年龄=" + this.age);这行代码的时候,这行代码中的this表示的是父对象还是子对象(我们都知道this表示的是当前对象,我就想知道此时this表示的当前对象到底是父类对象还是子类对象),知道的人请帮忙解答下?谢谢!说一下你们是怎么理解这里的super和this的,解释下原因和你们对这里的理解!
两个层面的东西:
super是父类——类
this是当前实例(对象)——对象
当调用this的时候,当前有且仅有一个对象,这个对象的name、age等属性也只有一个值,不分子类、父类。
super 是直接父类对象的引用是一个隐式参数。通常在构造方法里面,第一句话总是super();如果你在构造方法里面第一句不写这句话,编译器会帮你默认添加,这句话。所以无论怎样,构造器里的第一句话还是super();
this也是隐式参数,调用当前类方法。类的方法调用时,系统自动传递一个this的参数给方法。this主要在对象初始化里用的比较多,也是在构造函数里用的多。希望有用。
首先告诉你答案:此时的this代表父类对象。
原因:this代表当前对象,换言之,谁调用我,我就代表谁。
我表示:this关键字
第一个谁:谁调用的?super.test()调用的!
第二个谁:this就代表父类对象执行test方法。
此时super就表示调用父类中的方法,而在父类方法中,this就代表父类对象。
^_^
学再多理论知识也需要实践。你把代码跑一下就知道结果了
个人理解,Fahter中的this肯定指的是Father类的对象,this可以省略。
this代表的都是当前类对象。这段代码中明细表示的是父类类对象,能通过跟代码的自己跟代码解决
Father类中this就是Father类对象,Son类中this就是Son类对象
this关键字,无疑指的是当前对象;
super关键字,是指调用父类的方法,或者可继承的成员变量等;
再有就是,代码都在这儿摆着了,看不明白的话跑一下就明了了。
day day up!
你的输出结果应该是:
我是父类的test()方法
父类姓名=杨过 父类年龄=12
我是子类的test()方法
子类姓名=杨过 子类年龄=12
首先题主没有搞清楚对象是什么!
对象是实例化后的类,也就是说是一个具体变量。那么this就好理解了,针对你的对象son,不管父类的this还是子类的this都是son。
super只是指定要调用父类的方法,严格来说它不是一个对象,只是一个关键字用来指定调用父类方法,其作用类似C++中的Father::test()。
你的这个例子用C++写如下:
class Father {
String name;
int age;
public void test() {
printf("我是父类的test()方法\n");
printf("父类姓名=%s 父类年龄=%d\n", this.name , this.age);
}
}
class Son:public Father {
public void test() {
Father::test();
printf("我是子类的test()方法\n");
printf("子类姓名=%s 子类年龄=%d\n", this.name , this.age);
}
}
super表示要使用父类的方法,比如可以调用父类构造方法、调用父类一般方法、父类的属性
this 表示的当前对象
就你所列出的代码来说 this 的解释要看你的对象,正如如下的代码,你的的对象是 son,那么执行了 super.test() 时, this 被识别为 son
Son son = new Son();
son.name = "杨过";
son.age = 12;
son.test();
希望对你有所帮助
package b;
class Father {
String name="小龙女";
int age=11;
/*这里给name,age赋上值就简单明了了,如果调用super.test()后,这里的this代表当前类,那么输出的就是小龙女,11,
}
public class Son extends Father {
public void test() {
super.test();
/*这里调用super.test(),父类中的this就是代表当前类Son的,所以还是输出杨过,12*/
System.out.println("我是子类的test()方法");
System.out.println("子类姓名=" + this.name + " 子类年龄=" + this.age);
}
public static void main(String[] args) {
Son son = new Son();
son.name = "杨过";
son.age = 12;
son.test();
}
}
求采纳啊
子类的name和age 属性继承自父类,本身是没有这两个属性的 此时的this.name 指向的是父类,赋值时自然给父类赋值。你在子类中加上name和age属性,这时候this.age则指向的是自身。
this代表当前类的实例对象,可以调用当前类所有的属性和方法。
super代表所继承的类的对象,也就是父类的对象,可以调用父类的属性和方法。
this始终指当期实例对象,注意是已经实例化的对象,子类实例化时并没有实例化父类,所以指代的还是子类的对象; super用于调用父类的方法,不是一个对象而是一个特殊关键字吧,个人理解
当调用父类的test()方法的时候this.name和this.age就被赋值为“杨过”和12了,你下面输出的this.name和this.age跟上面的一样
我们拓展一下,看下面的代码?我们把Father类中的成员属性或者叫成员变量吧,把name和age这2个成员变量都赋上值,看看最终会打印什么?
class Father {
String name = "小龙女";
int age = 16;
public void test() {
System.out.println("我是父类的test()方法");
System.out.println("父类姓名=" + this.name + " 父类年龄=" + this.age);
}
}
public class Son extends Father {
//public String address = "江西省赣州市于都县";
public void test() {
/**
* 在Son类的test()方法中的super.test();这行代码的意思是调用父类的test()方法,我对这行代码有点疑
* 惑,super代表父对象,那么很明显,就是去调用Father类中的test()方法,那么此时,在执
* 行到Father类中的test()方
* 法中的System.out.println("父类姓名=" + this.name + " 父类年龄=" + this.age);这行代码的时候,这
* 行代码中的this表示的是父对象还是子对象(我们都知道this表示的是当前对象,我就想知
* 道此时this表示的当前对象到底是父类对象还是子类对象),知道的人请帮忙解答下?谢谢!
*
*/
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 = "杨过";
son.age = 12;
son.test();
}
}
大家猜下打印的结果会是什么?
Father类中this就是Father类对象,问本类的name
子对象 我的理解如下:
你用Son类的对象(son) 去调用Son.test()方法 this所代表的就是当前对象son
但在Son的test 方法中 你用的是super调用Father.test(); 本来这个this应该指的是调用这个Father.test();的father类对象 但是变成了super
super不能当做当前对象 所以只能向上传 用this 指向调用super.test()的这个对象 就还是son
总的来说就是 super 没能力 ,this 不能指向他 就找之前的对象 这样理解起来应该比较容易
public class F {
public int i = 1;
public void foo() {
System.out.println(this.i);
}
}
class S extends F {
public int i = 2;
@Override
public void foo() {
super.foo();
System.out.println(this.i);
}
public static void main(String[] args) {
S s = new S();
s.foo();
}
}
运行完这段代码,都不需要解释了。this就是自己,在哪都是自己。注意创建子类对象时,会把前面的所有父类都创建一个对象,他们都是相互独立的。
你可以在father这种的test方法中输出this,结果显示的是son的地址值,
this就是指的当前对象;
你当前在执行father类中的函数,this就是指father类;
你当前在执行son类中的函数,this就是指son类;
谁调用的方法,this就代表谁,正常实参如果想要赋值的话,就必须new对象,然后对象.name , this就是为了代表这个对象,省去了你在方法里在重新写一遍对象的构造
调用的父类的属性
this表示当前对象实例,也包含从父类继承的属性。
super是父类。
this点 就是调用自己的成员变量
this() 调用自己的空参构造方法
this(有参) 就是调用自己的有参构造
super就是调用父类的
super 存在的意义 就是为了 Java 语言 “继承”特点的落实。
继承 就是为了提高资源利用率,从类的加载过程中看,子类要想加载,还是得先加载父类,所以我们假想,每个子类对象中 都包含着一个父类对象,
但 事实上,并没有两个对象,而是 涉及到一个对象转换,,我们都知道 Integer 和 int 的包装与转换, 其实 在子父类这儿 也可以这样理解。
题中 只有一个对象,就是 Son对象, 调用 super.test() 也是Son对象 执行的, 而进入父类方法中之后的 this,其实代表的还是 Son对象,this 只是代表 当前对象,谁跑进来了 谁就是 this。
你可以把this当作指向new Son()的指针,即没有new Son()的时候 this是不存在的。
由上图可以看出,this并非类所包含的属性,即非实例方法是不可以使用this的。
从字节码角度来看
int addTwo(int i, int j) {
return i + j;
}
编译后为
Method int addTwo(int,int)
0 iload_1 // Push value of local variable 1 (i) 此处iload入栈位置为1,因为第0个局部变量用来存储该实例方法所在对象的引用即this
1 iload_2 // Push value of local variable 2 (j)
2 iadd // Add; leave int result on operand stack
3 ireturn // Return int result
类方法
static int addTwoStatic(int i, int j) {
return i + j;
}
编译后如下
Method int addTwoStatic(int,int)
0 iload_0 // 此时iload入栈位置为0,而不是1,因为他不属于实例方法,所以第0个局部变量不是this
1 iload_1
2 iadd
3 ireturn
super代表父类,super关键字调用父类的属性和方法
this代表自己当前类,调用自己的属性和方法
当你调用父类方法时,进入父类对象,this也代表的父类实例
this:谁来调用我,我就代表谁
this关键字代表的当前类对象,题中所问的this代表的是Son对象
分别在打印出son和super和this的class字节码你能发现都指的是son,super虽然指的是父类,但这里只是引用父类的方法实现,本身还是自身初始化的test方法,实际上son的test方法就成了类似
public void test() {
f_test();
System.out.println("我是子类的test()方法");
System.out.println("子类姓名=" + this.name + " 子类年龄=" + this.age);
}
f_test(){
System.out.println("我是父类的test()方法");
System.out.println("父类姓名=" + this.name + " 父类年龄=" + this.age);
}
只是表达自己的观点,并不确认这就一定是对的
结论:在子类中使用super调用父类实例方法,被调用方法入栈后,局部变量表中this将指向子类实例对象。即:super调用后,内部this指向子类实例。
如果你不小心,在子类中声明了和父类中同名的实例变量,可能问题变得更具有迷惑性。
注意:父子类中存在隐藏问题。(例如:父子类中都声明了实例属性user。在子类中使用this.user,这时这个user是子类自己定义的;在父类中即使this指向子类实例对象,但是此时this.user,这个user是从父类继承的属性。也就是说父类的同名变量在子类中被隐藏了,无法简单访问到,但是在父类中却是可见的,不过子类自身定义的同名属性在父类中被隐藏,无法简单访问)。
super 指的是父类对象 this指的是当前类对象
说一点 java是面向对象 得语言 ,所以提供了 封装 继承 和多态的特性, 如果父类和子类有相同的名称和参数的方法,new子类对象按照多态的特性 是重写 ,父类是不应该执行该方法的哈,而你又像调用和执行父类的相同方法 那怎么办,java提供了super关键字,就可以调用执行;要不然按照继承的特性,你用什么super 和this呀 直接使用方法不是挺好的么,这里还有一点 对于private 子类 就算用super也没法访问哈。 从这上面去理解他
super是父类——类
this是当前实例(对象)——对象
super是代表调用父类的方法,this是当前实例,也就是当前对象
super.test()调用的this,所以this就代表父类对象执行test方法。
此时super就表示调用父类中的方法,而在父类方法中,this就代表父类对象。
this是指当前的类,super是调用父类!比如说你在子类当中要用到负累饿的时候,就用 super.名称就可以调用到了
this表示当前对象本身,super表示父级对象,创建了一个子类继承了父类,super.test()调用的就是父类中的方法,那么你创建一个子类对象,并赋值,首先会去找子类的方法,而子类中又有super指向父类,那么就会先去找父类的方法,等父类的方法执行完才会执行子类的方法
调用supper的时候 this是被包含在父类里面的
先进去son的test方法里面分析,首先就是super调用自己的test方法。进去了super方法里面再找调用这个方法的对象,那就是super, 就是父对象啊
试了一下,无论是this还是super,调用时都是指的son对象,你可以在子父类方法中把this打印出来就知道是啥了
super可调用父类方法 this调用当前类方法
个人认为,this关键字代表当前对象