java 构造器 super()_java 对象 构造器super()问题

java 对象 构造器super()问题

关注:260  答案:3  mip版

解决时间 2021-01-27 10:52

e6cb1a03ad541b3098697807b7bf1798.png

提问者夜灬零乱花寂

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()是啥意思?

最佳答案

e6cb1a03ad541b3098697807b7bf1798.png

二级知识专家啾一口软脸

2021-01-27 01:03

Book的父类是Object。super()表示调用父类构造。这句话可以去掉不写。默认也会去调用、

全部回答

e6cb1a03ad541b3098697807b7bf1798.png

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();

}

}

e6cb1a03ad541b3098697807b7bf1798.png

2楼戒烟戒酒戒粗口

2021-01-27 01:29

因为一旦用了继承

实例化子类的时候,必须先实例化父类。就如同没有老爸 怎么会有儿子

所以super() 是必须的,就算你没写,编译器也会自动加上去

我要举报

如以上问答内容为低俗/色情/暴力/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!

→点此我要举报以上信息!←

推荐资讯

大家都在看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值