class Out
{
class In
{
public void test()
{
System.out.println("In的test方法");
}
}
class A extends In
{}
}
class OutTest extends Out.In
{
public static void main(String[] args)
{
System.out.println("Hello World");
}
OutTest()
{
new Out().super();
}
}
{
class In
{
public void test()
{
System.out.println("In的test方法");
}
}
class A extends In
{}
}
class OutTest extends Out.In
{
public static void main(String[] args)
{
System.out.println("Hello World");
}
OutTest()
{
new Out().super();
}
}
解决方案 »
- 各位路过的大侠都来看看啊~在线等答案,大作业~~~~(>_<)~~~~
- 一个基本的数据库更新的问题
- Propertise p=System.getProperties().list(System.out)为何有错?
- SWT问题:请问如何控制talbe的标题居中,请高手指教一下
- 请高手解释:抽象类中的方法声明,带有“abstract”和不带有“abstract”的区别。
- 如何注册监听
- 如和在dos下只打java或appletviewer反正就是bin文件夹中的程序就运行
- 各位请帮忙,那里可以下载visibroker for java?
- 请高手们给菜鸟指点一下,多谢了定加分!!!!
- 请问高手如何去掉JList的边框?
- excel导出数据
- 用java写坦克大战游戏,加上游戏得分之后界面显示就卡了一下
{
class In
{以为In 是Out 的内部类 所以想用In类的话必须先创建Out类的对象!!!
new Out()产生Out指针,可是Out并不能调用super构造函数啊
疯狂java的解释是
调用In的构造函数并传入Out对象为参数,但是这个格式让人难以理解,好像是调用OUt的父类的无参构造。
public static void main(String[] args) {
System.out.println("Hello World");
new OutTest();
} OutTest() {
new Out().super();
}
}class Out extends Super{
class In {
public void test() {
System.out.println("In的test方法");
}
} class A extends In {
}
}class Super{
public Super(){
System.out.println("Father.Father()...");
}
public Super(int arg){
System.out.println("Father.Father(int arg)...");
}
}
结果很明显了,相信楼主也能知道这其中是要干什么了,谢谢楼主的分享~
我自己把代码改了下,猜测其实可能就是调用OutTest的父类Out.In的无参构造super()必须在第一行,而在这之前又必须先创建Out,然而又不能显示的做为参数传进去super(new Out()),所以.在这里大概相当于是个分隔符或者连接符,其实就是先创建外围类Out再创建OutTest的父类也就是外围类的内部类Out.In,也即是依次调用了外围类Out和Out.In的无参构造而已。程序输出
Out init..
In init..class OutTest extends Out.In {
public static void main(String[] args) {
new OutTest();
} OutTest() {
new Out().super();
}
}class Out {
Out()
{
System.out.println("Out init..");
}
class In {
In()
{
System.out.println("In init..");
}
public void test() {
System.out.println("In的test方法");
}
} class A extends In {
}
}
o = new Out();
new o.In();
然后在 In 的构造里面输出 system.out.println( "In construct ");
然后在 main函数中 new OutTest(); 不就知道了1、OutTest extens Out.In
说明什么?说明OutText extends 的 Out类的内部类 In2、那么 new Out() 就是调用Out类3、那么new Out().super() 就是先实例化Out类,然后调用其内部类的的构造器,至于super指的是谁,取决于那个内部类被继承。4、那么什么不能直接写 super(); 直接调用超类构造呢?编译报错 :OutTest.java:34: 错误: 需要包含Out.In的封闭实例
说明,如果继承自一个内部类,需要先构造器外部类。总结
1、如果继承了一个内部类,需要先实例化外部类。
2、out().super() 的意思是: 先实例化一个外部类,然后再调用父类的构造器。
{
}
class In {
In(int a) {
System.out.println("In constructor " + a);
} public void test() {
System.out.println("Test of In");
}
}
}class OutTest extends Out.In {
public static void main(String[] args) {
System.out.println("Hello World");
new OutTest().test();
} OutTest() {
new Out().super(1);
}
}
这段代码可以证明super就是In的构造器,因为super必须要带一个int才能通过编译,而输出是
Hello World
A constructor 1
Test of In这个原因在于class In不是一个static class,它只存在于Out的实例中。
在创建OutTest实例的时候,你必须要有Out.In这个class的引用,而Out.In是随Out的实例的创建而被创建,所以new Out是必须的。
这时候In的构造函数就可以看成如楼上某位说的,第一个参数为其父类引用的特殊函数,所以如果按照正常逻辑,应该是super(new Out());这样子。
但是super本身又不是一个带有参数的函数,这里就只好折中,用new Out().super()了。这是一个非常丑陋的用法,你的代码里应该永远见不到这样的结构,否则就重构吧
public static void main(String[] args) {
new OutTest();
}
OutTest() {
new Out().super();
}
}class Out extends Super{
public Out() {
System.out.println("out");
}
class In {
public In() {
System.out.println("in");
}
}
}class Super {
public Super() {
System.out.println("super");
}
}new Out().super();因为继承的是一个内部类,需要先实例化外部类new Out();super()就是调用父类的构造器。