黑马程序员技术交流社区

标题: 关于外部类中建立内部类的对象 [打印本页]

作者: 李挺    时间: 2013-2-20 21:56
标题: 关于外部类中建立内部类的对象
本帖最后由 李挺 于 2013-2-21 08:50 编辑
  1. class Day26 {
  2.         public String str="zhansan";
  3.         public void method1(){
  4.                 System.out.println("hello world!"+str);
  5.         }
  6.         class Inner{
  7.                 public void setA(String str){
  8.                         Day26.this.str=str;
  9.                         Day26.this.method1();
  10.                 }
  11.         }
  12.         public void method2(){
  13.                 Inner in=new Inner();
  14.                 in.setA("lisi");
  15.         }
  16.         public static void main(String[] args){
  17.                 Inner in=new Inner();
  18.                 in.setA("lisi");
  19.         }
  20. }
复制代码
这个 编译会报错说是:无法从静态上下文中引用非静态 变量this
这句话啥意思?



作者: 柴乔军    时间: 2013-2-20 22:00
本帖最后由 柴乔军 于 2013-2-20 22:31 编辑

静态成员是优先与对象存在的,存在静态方法区中,此时还不明确该类是否有对象,是哪个对象
所以在静态方法中是不允许调用非静态的成员的

主函数是静态的,而你的内部类定义在成员位置,非静态,所以会报错

内部类改成静态的话,你内部类中的方法也需要修改

主函数这样改

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

你让主函数里建立一个外部类的对象在去建立内部类就可以了,这样对象就明确了,直接建立内部类,但是内部类
需要持有外部类对象的引用,不能被静态调用。这样改也就不需要改方法了
作者: 李桐    时间: 2013-2-20 22:08
str是非静态变量 没有办法不创建对象就访问非静态变量
作者: 黄欢    时间: 2013-2-20 22:24
非静态方法给静态变量赋值!是不行的。
Day26.this.str是静态变量。
public void setA(String str)非静态方法! 所以挂咯
作者: 寇弘禄    时间: 2013-2-20 22:27
01.class Day26 {

02.        public static String str="zhansan";

03.        public static void method1(){

04.                System.out.println("hello world!"+str);

05.        }

06.        static class Inner{

07.                public void setA(String str){

08.                        Day26.str=str;       去掉this,因为静态方法中不能有this super 静态方法优先于对象存在

09.                        Day26.method1();

10.                }

11.        }

12.        public void method2(){

13.                Inner in=new Inner();

14.                in.setA("lisi");

15.        }

16.        public static void main(String[] args){

17.                Inner in=new Inner();

18.                in.setA("lisi");

19.        }

20.}因为主函数是静态的,静态方法只能访问静态成员和静态方法

作者: 王钊    时间: 2013-2-20 22:45
首先,main方法是静态的,只能访问静态变量和方法。
其次,Inner确切的说是Day26的成员内部类,就相当于Day26的一个非静态成员变量,main方法不能直接访问非静态成员。
如果要在main方法中创建Inner对象要这么做:
  1. public static void main(String[] args){

  2.                 //Inner in=new Inner();
  3.                 Day26.Inner in=new Day26().new Inner();
  4.                 //上句代码可以这么理解,要想生成内部类对象,首先要生成外部类对象
  5.                 in.setA("lisi");

  6.         }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2