内部类的一个奇怪问题

蔴牛 2017-12-01 11:35:29
public class Out {

private In t1;

public class In{
//成员内部类
}

void a(In t1){
//外部类的一个方法
}

public static void main(String[] args) {
Out t = new Out();
t.a(t1);//这里报错了,说,t1 必须是静态的
}
}


为什么外部类的那个成员变量,必须要是静态的?是在搞不懂
...全文
230 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiongdejun 2018-01-04
  • 打赏
  • 举报
回复
引用 6 楼 u010747201 的回复:
[quote=引用 3 楼 xiongdejun 的回复:] 因为静态方法里只能是静态变量。而非静态方法里不限制。你得main是静态方法。那么你得 private In t1;这个必须是静态属性才行 这事java基础。你多看看
首先,感谢你的回答,再次,真诚的麻烦你,写个测试类试试,如果像你说的这样,我回去就把电脑砸了,这辈子不碰代码,谢谢。[/quote] 抱歉,前段时间比较忙,没有上来看看,看了下,下边的评论说我的理解错误了,好吧,反正现在没事,那咱们就来讨论讨论! 首先先看下你的源代码:public class Out { private In t1; public class In{ //成员内部类 } void a(In t1){ //外部类的一个方法 } public static void main(String[] args) { Out t = new Out(); t.a(t1);//这里报错了,说,t1 必须是静态的 } } 1)其实这个内部类跟咱们讨论的这个问题没有任何关系(我相信你应该也不会这么认为吧) 2)说明下这个形参t1和上边的的t1不是同一个 好了,咱们把代码修改下 public class Out { private int t1; void a(int t1){ //外部类的一个方法 } public static void main(String[] args) { Out t = new Out(); t.a(t1);//这里报错了,说,t1 必须是静态的 } } 1)把In换成一个仁意基本数据类型吧(为了方便讨论) 我这里就换成int了 2)main方法是一个程序执行的入口,你可以理解为是一个static类型的方法 首先t.a() 这个方法肯定是没有问题的 但是你这里给的参数是t1 (注:首先会先去找局部变量,找不到就会 找成员变量) 很明显你没有定义局部变量,那么就会调用 private int t1; 这个t1了 关键的问题来了: static修饰的静态方法里可以直接调用非静态方法?(注意是直接调用) 所以可以修改为 1.把 t1换成static的变量 2.把 t.a(t1) 这部分代码换成 t.a( t . t1) 原代码修改为: public class Out { 1)private static In t1; private In t1; public class In{ //成员内部类 } void a(In t1){ //外部类的一个方法 } public static void main(String[] args) { Out t = new Out(); //t.a(t1);//这里报错了,说,t1 必须是静态的 2) t.a(t.t1) } } 总结:静态方法里不能直接调用非静态的属性或方法 (是我上边的辩论有错误,还是我说的不够明确,或者你们没有理解。。。) 欢迎大神来辩论
xiongdejun 2018-01-04
  • 打赏
  • 举报
回复
引用 6 楼 u010747201 的回复:
[quote=引用 3 楼 xiongdejun 的回复:] 因为静态方法里只能是静态变量。而非静态方法里不限制。你得main是静态方法。那么你得 private In t1;这个必须是静态属性才行 这事java基础。你多看看
首先,感谢你的回答,再次,真诚的麻烦你,写个测试类试试,如果像你说的这样,我回去就把电脑砸了,这辈子不碰代码,谢谢。[/quote] 抱歉,前段时间比较忙,没有上来看看,看了下,下边的评论说我的理解错误了,好吧,反正现在没事,那咱们就来讨论讨论! 首先先看下你的源代码:public class Out { private In t1; public class In{ //成员内部类 1)其实这个内部类跟咱们讨论的这个问题没有任何关系(我相信你应该也不会这么认为吧) } void a(In t1){ //外部类的一个方法 2)说明下这个形参t1和上边的的t1不是同一个 } public static void main(String[] args) { Out t = new Out(); t.a(t1);//这里报错了,说,t1 必须是静态的 } } 好了,咱们把代码修改下 public class Out { private int t1; 1)把In换成一个仁意基本数据类型吧(为了方便讨论) 我这里就换成int了 void a(int t1){ //外部类的一个方法 } public static void main(String[] args) { 2)main方法是一个程序执行的入口,你可以理解为是一个static类型的方法 Out t = new Out(); 运行到这里实例化了一个对象 t.a(t1);//这里报错了,说,t1 必须是静态的 首先t.a() 这个方法肯定是没有问题的 但是你这里给的参数是t1 (注:首先会先去找局部变量,找不到就会 } 找成员变量) 很明显你没有定义局部变量,那么就会调用 private int t1; 这个t1了 关键的问题来了: } static修饰的静态方法里可以直接调用非静态方法?(注意是直接调用) 所以可以修改为 1.把 t1换成static的变量 2.把 t.a(t1) 这部分代码换成 t.a( t . t1) 总结:静态方法里不能直接调用非静态的属性或方法 (是我上边的辩论有错误,还是我说的不够明确,或者你们没有理解。。。) 欢迎大神来辩论
maradona1984 2017-12-06
  • 打赏
  • 举报
回复
引用 12 楼 u010747201 的回复:
[quote=引用 9 楼 maradona1984 的回复:] [quote=引用 7 楼 u010747201 的回复:] [quote=引用 4 楼 Royal_lr 的回复:] 首先main方法是静态方法,所以不允许在静态方法中调用非静态变量。更深入点,从内存角度上说静态方法和静态变量在类加载时会开辟一段内存来保存,这时未实例化的类是不在内存中的
你和楼上的兄弟一样,我是调用的实例变量,不是类变量,谢谢。[/quote] 拥有t1这个变量的实例并没有实例化啊[/quote] out 实例,new了一个,这个问题应该是和内部类有关,和你说的这个没有关系,很简单,想想bean的getter,setter方法,难道实例了一个后,还不能直接调用set方法了?[/quote] 我只是说t1这个成员变量并没有对象拥有,访问这个属性的怎么也得带上句柄(对象),同一个对象中访问倒是不需要加句柄,但main方法明显不属于某个对象啊...
蔴牛 2017-12-06
  • 打赏
  • 举报
回复
引用 10 楼 yuxiangaaaaa 的回复:
[quote=引用 7 楼 u010747201 的回复:] [quote=引用 4 楼 Royal_lr 的回复:] 首先main方法是静态方法,所以不允许在静态方法中调用非静态变量。更深入点,从内存角度上说静态方法和静态变量在类加载时会开辟一段内存来保存,这时未实例化的类是不在内存中的
你和楼上的兄弟一样,我是调用的实例变量,不是类变量,谢谢。[/quote] 类变量也叫静态变量,也就是在变量前加了static 的变量; 实例变量也叫对象变量,即没加static 的变量; 区别在于:类变量和实例变量的区别在于:类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果; 而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象。 静态方法main是属于类的,所以里面的变量要用类变量(static修饰),不加static修饰的话,加载类的时候运行静态方法时会找不到这个非静态(实例)变量[/quote] out 实例,new了一个,这个问题应该是和内部类有关,和你说的这个没有关系,很简单,想想bean的getter,setter方法,难道实例了一个后,还不能直接调用set方法了?
蔴牛 2017-12-06
  • 打赏
  • 举报
回复
引用 9 楼 maradona1984 的回复:
[quote=引用 7 楼 u010747201 的回复:] [quote=引用 4 楼 Royal_lr 的回复:] 首先main方法是静态方法,所以不允许在静态方法中调用非静态变量。更深入点,从内存角度上说静态方法和静态变量在类加载时会开辟一段内存来保存,这时未实例化的类是不在内存中的
你和楼上的兄弟一样,我是调用的实例变量,不是类变量,谢谢。[/quote] 拥有t1这个变量的实例并没有实例化啊[/quote] out 实例,new了一个,这个问题应该是和内部类有关,和你说的这个没有关系,很简单,想想bean的getter,setter方法,难道实例了一个后,还不能直接调用set方法了?
自由自在_Yu 2017-12-04
  • 打赏
  • 举报
回复
引用 6 楼 u010747201 的回复:
[quote=引用 3 楼 xiongdejun 的回复:] 因为静态方法里只能是静态变量。而非静态方法里不限制。你得main是静态方法。那么你得 private In t1;这个必须是静态属性才行 这事java基础。你多看看
首先,感谢你的回答,再次,真诚的麻烦你,写个测试类试试,如果像你说的这样,我回去就把电脑砸了,这辈子不碰代码,谢谢。[/quote] 楼主你写一个静态方法里可以调用非静态变量的例子推翻他呗
自由自在_Yu 2017-12-04
  • 打赏
  • 举报
回复
引用 7 楼 u010747201 的回复:
[quote=引用 4 楼 Royal_lr 的回复:] 首先main方法是静态方法,所以不允许在静态方法中调用非静态变量。更深入点,从内存角度上说静态方法和静态变量在类加载时会开辟一段内存来保存,这时未实例化的类是不在内存中的
你和楼上的兄弟一样,我是调用的实例变量,不是类变量,谢谢。[/quote] 类变量也叫静态变量,也就是在变量前加了static 的变量; 实例变量也叫对象变量,即没加static 的变量; 区别在于:类变量和实例变量的区别在于:类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果; 而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象。 静态方法main是属于类的,所以里面的变量要用类变量(static修饰),不加static修饰的话,加载类的时候运行静态方法时会找不到这个非静态(实例)变量
maradona1984 2017-12-04
  • 打赏
  • 举报
回复
引用 7 楼 u010747201 的回复:
[quote=引用 4 楼 Royal_lr 的回复:] 首先main方法是静态方法,所以不允许在静态方法中调用非静态变量。更深入点,从内存角度上说静态方法和静态变量在类加载时会开辟一段内存来保存,这时未实例化的类是不在内存中的
你和楼上的兄弟一样,我是调用的实例变量,不是类变量,谢谢。[/quote] 拥有t1这个变量的实例并没有实例化啊
蔴牛 2017-12-04
  • 打赏
  • 举报
回复
引用 1 楼 yewuqing007 的回复:
因为你t1是普通方法 没得初始化 应该可以 t.a(t.StaticInner());
这么多回答里,就你这个靠谱,但是,我是用的内部类引用啊,这也必须要先实例化内部类吗?谢谢
蔴牛 2017-12-04
  • 打赏
  • 举报
回复
引用 4 楼 Royal_lr 的回复:
首先main方法是静态方法,所以不允许在静态方法中调用非静态变量。更深入点,从内存角度上说静态方法和静态变量在类加载时会开辟一段内存来保存,这时未实例化的类是不在内存中的
你和楼上的兄弟一样,我是调用的实例变量,不是类变量,谢谢。
蔴牛 2017-12-04
  • 打赏
  • 举报
回复
引用 3 楼 xiongdejun 的回复:
因为静态方法里只能是静态变量。而非静态方法里不限制。你得main是静态方法。那么你得 private In t1;这个必须是静态属性才行 这事java基础。你多看看
首先,感谢你的回答,再次,真诚的麻烦你,写个测试类试试,如果像你说的这样,我回去就把电脑砸了,这辈子不碰代码,谢谢。
xiongdejun 2017-12-01
  • 打赏
  • 举报
回复
因为静态方法里只能是静态变量。而非静态方法里不限制。你得main是静态方法。那么你得 private In t1;这个必须是静态属性才行 这事java基础。你多看看
devin_jia 2017-12-01
  • 打赏
  • 举报
回复
t.a(t.new In());
devin_jia 2017-12-01
  • 打赏
  • 举报
回复
因为你t1是普通方法 没得初始化 应该可以 t.a(t.StaticInner());
李德胜1995 2017-12-01
  • 打赏
  • 举报
回复
Royal_lr 2017-12-01
  • 打赏
  • 举报
回复
首先main方法是静态方法,所以不允许在静态方法中调用非静态变量。更深入点,从内存角度上说静态方法和静态变量在类加载时会开辟一段内存来保存,这时未实例化的类是不在内存中的

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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