关于Java SE成员内部类的问题,感谢各位

gagabnddshs 2016-10-21 05:42:06
package outerAndInnerClass;

public class Outer {
private int x = 100;
private String y = "hello world";
// 内部类
class Inner {
private String y = "hello";
private void innerMethod() {
System.out.println("内部类中的y是:"+y);
System.out.println("外部类中的y是:"+Outer.this.y);
System.out.println("外部类中的x是:"+x);
// 内部类调用外部类中的方法
outerMethod();
System.out.println("调用外部类方法后,外部类中的x是:"+x);
}
}

public void outerMethod() {
x++;
}
// 外部类方法中创建内部类对象
public void makeInner() {
Inner in = new Inner();
}

public static void main(String[] args) {
// 创建外部类对象out
Outer out = new Outer();
// 通过外部类对象创建内部类对象
Outer.Inner in = out.new Inner();
// 外部类调用内部类中的方法
in.innerMethod();
}
}

上述代码中,
问题1:第23-25行是不是错误的(仅限此例中,不是应该先创建外部类对象才能创建内部类对象嘛)?如果是错的,怎么不报错?
问题2:那第29-31行,我还见过这样写的:
Outer out = new Outer();
Inner in = out.new Inner();

通过外部类对象创建内部类对象的语法规范到底是哪个(怎么多个Outer.)?还是说有好几种方法(非静态情况下)?我知道的有:
Outer out = new Outer();
Inner in = out.new Inner();

Inner in = new Outer().new Inner();

另外,
package outerAndInnerClass;

class Circle {
private double radius = 0;

public Circle(double radius) {
this.radius = radius;
getDrawInstance().drawShape(); // 先创建成员内部类的对象,再进行访问
}

private Draw getDrawInstance() {
return new Draw();
}
// 内部类
class Draw {
public void drawShape() {
System.out.println(radius); // 外部类private成员
}
}
}

问题3:上述代码中第8-12行(尤其是11行),这段代码是什么意思?个人觉得是在创建一个对象并调用方法,可是11行能用类名定义方法吗?

新手自学问题比较多,麻烦各位大神了,谢谢!!
...全文
304 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
在内部类声明的前面加上 static ,在外部类就能直接实例化它了 不需要外部类对象来实例它
巷子里的鸟 2016-10-24
  • 打赏
  • 举报
回复
如果处于内部类以外的区域,要调用内部类方法,自然要先创建一个外部类的内部类。 public static void main(String[] args) { Outer out = new Outer(); out.makeInner(); } 先创建了out外部类, public void makeInner() { Inner in = new Inner(); in.innerMethod(); } 建立了内部类in,建立in的方法是外部类out的,所以in是out的内部类,外部内部都有了实例,自然可以调用内部方法innerMethod了。 不过这个in是在out方法中建立的,他的引用并没有传递出来,所以调用完方法后in就被释放了。如果这个方法想建立一个内部类,建议改为 public Inner makeInner() { Inner in = new Inner(); in.innerMethod(); return in; }
自由自在_Yu 2016-10-21
  • 打赏
  • 举报
回复
引用 3 楼 bytedancer 的回复:
[quote=引用 1 楼 yuxiangaaaaa 的回复:] 23-25行是不是错误的,你试一下用对象in调用内部类的innerMethod()方法,可以调用的 Outer out = new Outer(); Inner in = out.new Inner(); 这样创建也是可以的 private double radius = 0; //这是一个外部类的构造方法,运行该类的时候就会执行这个方法 public Circle(double radius) { this.radius = radius; getDrawInstance().drawShape(); // 先创建成员内部类的对象,再进行访问 //getDrawInstance() 调用外部类中的getDrawInstance方法,此方法的功能 //是创建一个内部类的对象,然后用这个对象调用内部类的drawShape()方法 } private Draw getDrawInstance() { //这个方法执行的结果是创建一个内部类的对象new Draw(),并返回 return new Draw(); } // 内部类 class Draw { public void drawShape() { System.out.println(radius); // 外部类private成员 } }
谢谢回复!!不好意思,您回复的时候,我刚好在编辑我的问题。我问题3中,第11行可以用类名Draw定义方法(我才学到int等类型+方法名)? 根据您说的,我试了下,用以下代码替换23-34行
public void makeInner() {
    Inner in = new Inner();
    in.innerMethod();
}
     
public static void main(String[] args) {
    Outer out = new Outer();
    out.makeInner();
}
是可以运行,就是不知道原因[/quote] 语法就是这么规定的,我也不知道什么原因。要想深究原因,就找创造语言的那个人啦
gagabnddshs 2016-10-21
  • 打赏
  • 举报
回复
引用 1 楼 yuxiangaaaaa 的回复:
23-25行是不是错误的,你试一下用对象in调用内部类的innerMethod()方法,可以调用的 Outer out = new Outer(); Inner in = out.new Inner(); 这样创建也是可以的 private double radius = 0; //这是一个外部类的构造方法,运行该类的时候就会执行这个方法 public Circle(double radius) { this.radius = radius; getDrawInstance().drawShape(); // 先创建成员内部类的对象,再进行访问 //getDrawInstance() 调用外部类中的getDrawInstance方法,此方法的功能 //是创建一个内部类的对象,然后用这个对象调用内部类的drawShape()方法 } private Draw getDrawInstance() { //这个方法执行的结果是创建一个内部类的对象new Draw(),并返回 return new Draw(); } // 内部类 class Draw { public void drawShape() { System.out.println(radius); // 外部类private成员 } }
谢谢回复!!不好意思,您回复的时候,我刚好在编辑我的问题。我问题3中,第11行可以用类名Draw定义方法(我才学到int等类型+方法名)? 根据您说的,我试了下,用以下代码替换23-34行
public void makeInner() {
    Inner in = new Inner();
    in.innerMethod();
}
     
public static void main(String[] args) {
    Outer out = new Outer();
    out.makeInner();
}
是可以运行,就是不知道原因
自由自在_Yu 2016-10-21
  • 打赏
  • 举报
回复
23-25行不是错误的,你试一下用对象in调用内部类的innerMethod()方法,可以调用的 Outer out = new Outer(); Inner in = out.new Inner(); 这样创建也是可以的
自由自在_Yu 2016-10-21
  • 打赏
  • 举报
回复
23-25行是不是错误的,你试一下用对象in调用内部类的innerMethod()方法,可以调用的 Outer out = new Outer(); Inner in = out.new Inner(); 这样创建也是可以的 private double radius = 0; //这是一个外部类的构造方法,运行该类的时候就会执行这个方法 public Circle(double radius) { this.radius = radius; getDrawInstance().drawShape(); // 先创建成员内部类的对象,再进行访问 //getDrawInstance() 调用外部类中的getDrawInstance方法,此方法的功能 //是创建一个内部类的对象,然后用这个对象调用内部类的drawShape()方法 } private Draw getDrawInstance() { //这个方法执行的结果是创建一个内部类的对象new Draw(),并返回 return new Draw(); } // 内部类 class Draw { public void drawShape() { System.out.println(radius); // 外部类private成员 } }

62,614

社区成员

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

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