黑马程序员技术交流社区
标题:
关于外部类中建立内部类的对象
[打印本页]
作者:
李挺
时间:
2013-2-20 21:56
标题:
关于外部类中建立内部类的对象
本帖最后由 李挺 于 2013-2-21 08:50 编辑
class Day26 {
public String str="zhansan";
public void method1(){
System.out.println("hello world!"+str);
}
class Inner{
public void setA(String str){
Day26.this.str=str;
Day26.this.method1();
}
}
public void method2(){
Inner in=new Inner();
in.setA("lisi");
}
public static void main(String[] args){
Inner in=new Inner();
in.setA("lisi");
}
}
复制代码
这个 编译会报错说是:无法从静态上下文中引用非静态 变量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对象要这么做:
public static void main(String[] args){
//Inner in=new Inner();
Day26.Inner in=new Day26().new Inner();
//上句代码可以这么理解,要想生成内部类对象,首先要生成外部类对象
in.setA("lisi");
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2