关于super

csdnTimePeriod 2009-10-23 03:55:06
代码如下,有点不理解super的意思
class A
{ class B
{
}
}

class C extends A.B
{
C(A a)
{
a.super
}
public static void main(String[] args)
{
A a=new A();
C(a);
}
}
这里a.super()是个啥意思呀?如果说调用父类构造函数,可是class A并没有父类呀?代码不是我写的,是我看到的,这段代码有错吗?
...全文
152 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
jkf19711 2009-10-23
  • 打赏
  • 举报
回复
好好学习!!!
zhongcheng60 2009-10-23
  • 打赏
  • 举报
回复
这是 继承非 static 内部类的 特殊语法

class A{
class A_A{

}

}

class B extends A.A_A{

public B(A a){
//首先 B的父类 是 A_A它是 A的 内部类(并且是非静态的)
//非static内部类 需要 它的外部类对象 通过 .new 语法来创建
//首先 我们在new B 对象时 编译器会自动为我们先创建 它的父类对象
//也就是 A_A 的对象 但是 A_A对象必须要通过 它的外部类对象
//也就是 A 的对象 .new 创建 和它动态的关联起来
//你现在 继承A_A 编译器 怎么知道它跟哪个 外部类对象 关联呢?
//所以要通过 特殊的语法 构造器里传进来的参数 就是 与之动态关联的
a.super();//这个 绝对不是什么调用 父类的构造器 super();才是调用父类的构造器 这只是特殊的语//法表示 B的父类对象与a 动态关联起来

}
public B(){
// new A().super 11楼说的这种语法 我没有试过 不过应该也能行吧 原理是一样的
}

public static void main(String[] args){
new B(new A());
//楼主 应该先好好理解 内部类 然后再回头 想想 继承 内部类 就很清楚这样的语法了
//haojia0716 已经说的很清楚了
}
}

zmbaby112 2009-10-23
  • 打赏
  • 举报
回复
学习...
zhangzhongke007 2009-10-23
  • 打赏
  • 举报
回复
恩,学习。
haojia0716 2009-10-23
  • 打赏
  • 举报
回复
如果想知道语法为什么定成这样 可以自己反编译查看指令调用情况
haojia0716 2009-10-23
  • 打赏
  • 举报
回复
回楼上 这和super关键字没有关系



多说几句 这是继承内部类的特殊语法 但是

在实际开发中不要这么写 这会打破封装

而且 关于内部类设计的合理性问题 是不是该使用的问题 也一直在争论 不要轻易使用内部类

如果使用内部类 最好定成private的 作为私有成员使用
sforiz 2009-10-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sforiz 的回复:]
调用其类的构造方法,super关键字就那几个作用,调用其类的构造方法或其中的属性、方法、、、、
[/Quote]

写错了,其类改成基类
sforiz 2009-10-23
  • 打赏
  • 举报
回复
调用其类的构造方法,super关键字就那几个作用,调用其类的构造方法或其中的属性、方法、、、、
haojia0716 2009-10-23
  • 打赏
  • 举报
回复
除了6楼说的靠谱 其他说的全是废话

看代码

class A {
A() {
System.out.println("A被构造");
}

class B {
B() {
System.out.println("B被构造");
}
}
}

class C extends A.B {
C(A a) {
a.super();
System.out.println("C被构造");
}

public static void main(String[] args) {
A a = new A();
new C(a);
}
}


这是一个类继承另一个类的内部类的写法 请注意C的构造器写法 也可以写成如下形式


class C extends A.B {
C() {
new A().super();
System.out.println("C被构造");
}

public static void main(String[] args) {
A a = new A();
new C();
}
}


自己体会
hui94781674 2009-10-23
  • 打赏
  • 举报
回复
object是超级爸爸
xiaodenger 2009-10-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zlllyk110 的回复:]
你的代码就是错的 
main函数里面直接  C(a)  这个算是什么东西

再说一下,super是每个类都会有的成员常量,引用的是这个对象的父类对象
除了super外,还有个this,引用的是对象自身
[/Quote]
只说自己知道的!
super 不是引用!
liumingwei2009 2009-10-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 longds7 的回复:]
引用 1 楼 amdgaming 的回复:
object类是大家都爸爸。。。
形象
[/Quote]

不够形象,你这样说不是乱套了,因为Object的儿子下面还有自己的儿子。应该说Object是大家的祖宗更好吧。
xiandulina 2009-10-23
  • 打赏
  • 举报
回复
jf
liumingwei2009 2009-10-23
  • 打赏
  • 举报
回复
class  A	//定义一个类
{ class B //注意这个类是在A内部的一个类,相当于是在类A中定义了一种数据类型,它的作用范围只在A的类体中
{
}
}

class C extends A.B //A.B表示它继承的是A类中的一个局部类B,跟调用类的属性是一样的道理
{
C(A a)//构造方法输入参数是类A的对象
{
a.super();//super 就是代表父类,你调用父类的构造方法格式应该是a.super()
}
public static void main(String[] args)
{
A a=new A(); //创建类A的一个对象a
C(a); //这里有语法错误,因为构造方法是创建类的对象时使用的
}
}
zlllyk110 2009-10-23
  • 打赏
  • 举报
回复
你的代码就是错的
main函数里面直接 C(a) 这个算是什么东西

再说一下,super是每个类都会有的成员常量,引用的是这个对象的父类对象
除了super外,还有个this,引用的是对象自身
longds7 2009-10-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 amdgaming 的回复:]
object类是大家都爸爸。。。
[/Quote]形象
liumingwei2009 2009-10-23
  • 打赏
  • 举报
回复
class  A 
{ class B {}
}

class C extends A.B
{
C(A a)
{
a.super();
}
public static void main(String[] args)
{
A a=new A();

}
}
liumingwei2009 2009-10-23
  • 打赏
  • 举报
回复
每个类都有默认的构造函数
C(A a) //方法c输入参数是A类型的 a是类A的对象
{
a.super //???这里是什么我还不清楚啊,反正有错误的
}
amdgaming 2009-10-23
  • 打赏
  • 举报
回复
object类是大家都爸爸。。。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧