java 对象 构造器super()问题
关注:260 答案:3 mip版
解决时间 2021-01-27 10:52
提问者夜灬零乱花寂
2021-01-27 00:01
class Book{
private String id;
private String name;
private String author;
private String description;
public Book() {
super();
// TODO Auto-generated constructor stub
}
public Book(String id, String name, String author, String description) {
super();
this.id = id;
this.name = name;
this.author = author;
this.description = description;
}
.........
.........
.........
}
这是普通的一个book类,有参构造器和无参构造器为什么都要带一个super()?我以前看书说这个是父类限定符。但这个Book类也没有继承父类。在这里的super()是啥意思?
最佳答案
二级知识专家啾一口软脸
2021-01-27 01:03
Book的父类是Object。super()表示调用父类构造。这句话可以去掉不写。默认也会去调用、
全部回答
1楼选择重头再来
2021-01-27 03:05
一、this
java关键字this只能用于方法方法体内。当一个对象创建后,java虚拟机(jvm)就会给这个对象分配一个引用自身的指针,这个指针的名字就是this。因此,this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this,这在“java关键字static、final使用总结”一文中给出了明确解释。并且this只和特定的对象关联,而不和类关联,同一个类的不同对象有不同的this。下面给出一个使用this的综合实例,以便说明问题:
package org.leizhimin;
public class test6 {
private int number;
private string username;
private string password;
private int x = 100;
public test6(int n) {
number = n; // 这个还可以写为: this.number=n;
}
public test6(int i, string username, string password) {
// 成员变量和参数同名,成员变量被屏蔽,用"this.成员变量"的方式访问成员变量.
this.username = username;
this.password = password;
}
// 默认不带参数的构造方法
public test6() {
this(0, "未知", "空"); // 通过this调用另一个构造方法
}
public test6(string name) {
this(1, name, "空"); // 通过this调用另一个构造方法
}
public static void main(string args[]) {
test6 t1 = new test6();
test6 t2 = new test6("游客");
t1.outinfo(t1);
t2.outinfo(t2);
}
private void outinfo(test6 t) {
system.out.println("-----------");
system.out.println(t.number);
system.out.println(t.username);
system.out.println(t.password);
f(); // 这个可以写为: this.f();
}
private void f() {
// 局部变量与成员变量同名,成员变量被屏蔽,用"this.成员变量"的方式访问成员变量.
int x;
x = this.x++;
system.out.println(x);
system.out.println(this.x);
}
//返回当前实例的引用
private test6 getself() {
return this;
}
}
运行结果如下:
-----------
0
未知
空
100
101
-----------
0
游客
空
100
101
看着上面的例子,说明在什么情况下需要用到this:
第一、通过this调用另一个构造方法,用发是this(参数列表),这个仅仅在类的构造方法中,别的地方不能这么用。
第二、函数参数或者函数中的局部变量和成员变量同名的情况下,成员变量被屏蔽,此时要访问成员变量则需要用“this.成员变量名”的方式来引用成员变量。当然,在没有同名的情况下,可以直接用成员变量的名字,而不用this,用了也不为错,呵呵。
第三、在函数中,需要引用该函所属类的当前对象时候,直接用this。
其实这些用法总结都是从对“this是指向对象本身的一个指针”这句话的更深入的理解而来的,死记不然容易忘记而且容易搞错,要理解!
二、super
super关键和this作用类似,是被屏蔽的成员变量或者成员方法或变为可见,或者说用来引用被屏蔽的成员变量和成员成员方法。
不过super是用在子类中,目的是访问直接父类中被屏蔽的成员,注意是直接父类(就是类之上最近的超类)。下面是一个综合运用super的例子,有两个类:一个father类,一个father类的子类son,通过这两个类完全演示了super的用法,一下是代码:
package org.leizhimin;
public class father {
public string v="father";
public string x="输出了father类的public成员变量x!!!";
public father() {
system.out.println("father构造方法被调用!");
}
public father(string v){
this.v="father类的带参数构造方法!运行了.";
}
public void outinfo(){
system.out.println("father的outinfo方法被调用");
}
public static void main(string[] args) {
// todo 自动生成方法存根
}
}
package org.leizhimin;
public class son extends father{
public string v="son";
public son() {
super(); //调用超类的构造方法,只能放到第一行.
system.out.println("son无参数构造方法被调用!");
//super(); //错误的,必须放到构造方法体的最前面.
}
public son(string str){
super(str);
system.out.println("son带参数构造方法被调用!");
}
//覆盖了超类成员方法outinfo()
public void outinfo(){
system.out.println("son的outinfo()方法被调用");
}
public void test(){
string v="哈哈哈哈!"; //局部变量v覆盖了成员变量v和超类变量v
system.out.println("------1-----");
system.out.println(v); //输出局部变量v
system.out.println(this.v); //输出(子类)成员变量v
system.out.println(super.v); //输出超类成员变量v
system.out.println("------2-----");
system.out.println(x); //输出超类成员变量v,子类继承而来
system.out.println(super.x); //输出超类成员变量v
system.out.println("------3-----");
outinfo(); //调用子类的outinfo()方法
this.outinfo(); //调用子类的outinfo()方法
super.outinfo(); //调用父类的outinfo()方法
}
public static void main(string[] args) {
new son().test();
}
}
2楼戒烟戒酒戒粗口
2021-01-27 01:29
因为一旦用了继承
实例化子类的时候,必须先实例化父类。就如同没有老爸 怎么会有儿子
所以super() 是必须的,就算你没写,编译器也会自动加上去
我要举报
如以上问答内容为低俗/色情/暴力/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!
→点此我要举报以上信息!←
推荐资讯
大家都在看