A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王琪 中级黑马   /  2014-6-7 09:48  /  1628 人查看  /  19 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王琪 于 2014-6-8 20:52 编辑

无意中修改代码,就发现现下面的问题不知该怎么解释
一个是内部类一个是外部类,同名,但是结果不同
  1. package org.demo.java;
  2. import java.util.*;
  3. class person{
  4.         String name;
  5.         int age;
  6.         public void tell(){
  7.                 System.out.println("姓名"+name+"年龄"+age+"A");
  8.         }
  9. }
  10. public class text {
  11.         private static class person{
  12.                 String name;
  13.                 int age;
  14.                 public void tell(){
  15.                         System.out.println("姓名"+name+"年龄"+age+"B");
  16.                 }
  17.         }
  18.         public static void main(String[]args){
  19.                 person p=new person();
  20.                 p.name="王琪";
  21.                 p.age=90;
  22.                 p.tell();
  23.         }
  24. }
  25. 姓名王琪年龄90B
复制代码
  1. package org.demo.java;
  2. import java.util.*;
  3. class person{
  4.         String name;
  5.         int age;
  6.         public void tell(){
  7.                 System.out.println("姓名"+name+"年龄"+age+"A");
  8.         }
  9. }
  10. public class text {
  11.         
  12.         public static void main(String[]args){
  13.                 person p=new person();
  14.                 p.name="王琪";
  15.                 p.age=90;
  16.                 p.tell();
  17.         }
  18. }
  19. 姓名王琪年龄90A
复制代码


评分

参与人数 1技术分 +1 收起 理由
李小然 + 1 鼓励多思考~

查看全部评分

19 个回复

倒序浏览
本帖最后由 woshihq 于 2014-6-7 10:23 编辑

不建议你将内部类定义为static。你可以从内存上思考这个问题,static类型的内部类,相当于一个在外部定义的类,在外部类载入时就开始创建,程序在进入你的static的main方法中时 ,你的外部类就载入了,所以你的内部类也被创建,那程序将你的
person p=new person();p.name="王琪";p.age=90; 理解成是对内部类的操作,所以就有这样的结果。这只是我的理解
回复 使用道具 举报
其实static的内部类使用方式和static的方法类似
回复 使用道具 举报
  1. class person{
  2.         String name;
  3.         int age;
  4.         public void tell(){
  5.                 System.out.println("姓名"+name+"年龄"+age+"A");
  6.         }
  7. }
复制代码
是不是 一般类在用到他时才加进内存中?
但是
  1. public class text {
  2.         private static class person{
  3.                 String name;
  4.                 int age;
  5.                 public void tell(){
  6.                         System.out.println("姓名"+name+"年龄"+age+"B");
  7.                 }
  8.         }
  9.         public static void main(String[]args){
  10.                 person p=new person();
  11.                 p.name="王琪";
  12.                 p.age=90;
  13.                 p.tell();
  14.         }
  15. }
复制代码
包含主方法的的类先加进内存中,随之static内部类自动进入内存,调用也是调用内部类,而那个类

  1. class person{
  2.         String name;
  3.         int age;
  4.         public void tell(){
  5.                 System.out.println("姓名"+name+"年龄"+age+"A");
  6.         }
  7. }
复制代码
没来得及用,所以就永远也用不到吧?
但是我想调用哪个类
  1. class person{
  2. String name;
  3. int age;
  4. public void tell(){
  5. System.out.println("姓名"+name+"年龄"+age+"A");
  6. }
  7. }
复制代码

就没有别的办法了吧?
,嘻嘻也许我想多了,谢谢你


回复 使用道具 举报
这个应该很好理解了 ,就近原则,
回复 使用道具 举报
yang1352546 发表于 2014-6-7 20:34
这个应该很好理解了 ,就近原则,

就近原则,好熟悉啊?
不过谢谢你
回复 使用道具 举报
其实程序中很多东西,他都是就近原则,如果有有两个相同的话,那么肯定是就近的。就好像你上课写字,你自己手边放一只笔,你隔壁位置也放一只笔,你肯定会首先选择你自己手边的。
回复 使用道具 举报
本帖最后由 王琪 于 2014-6-7 20:49 编辑
yang1352546 发表于 2014-6-7 20:35
其实程序中很多东西,他都是就近原则,如果有有两个相同的话,那么肯定是就近的。就好像你上课写字,你自己 ...

没办法得到远的那边吗?就是同名的外部类
回复 使用道具 举报
一般没有这样写的,一般情况下不会名字起一样的。具体怎么能找到那样的,我现在也不知道。
回复 使用道具 举报
yang1352546 发表于 2014-6-7 20:59
一般没有这样写的,一般情况下不会名字起一样的。具体怎么能找到那样的,我现在也不知道。 ...

谢谢你,我可能是乱想的
回复 使用道具 举报
改个名儿就行了,没必要钻牛角尖吧。。。
话说楼主怎么把代码的背景皮肤 导入帖子的,谢~
回复 使用道具 举报
哦,在很早前,我进入论坛,那时乔帮主发表了一个帖子,让大家规范提问与回答的书写,
单击  "<>"这个图标在上边,把代码复制进去就可以了>.<
回复 使用道具 举报
学习下 加油
回复 使用道具 举报

:)谢谢你也加油
回复 使用道具 举报
如果用static 将内部内静态化,那么内部类就只能访问外部类的静态成员变量,具有局限性
回复 使用道具 举报
内部类的作用:
1、隐藏你不想让别人知道的操作,也即封装性。
2、一个内部类对象可以访问创建它的外部类对象的内容,甚至包括私有变量!
回复 使用道具 举报
cain 发表于 2014-6-7 23:35
内部类的作用:
1、隐藏你不想让别人知道的操作,也即封装性。
2、一个内部类对象可以访问创建它的外部类对 ...

谢谢你,我再看看
回复 使用道具 举报
加油啊,路过
回复 使用道具 举报
哦了,受教,谢楼主。
回复 使用道具 举报
面向大众 发表于 2014-6-8 23:11
哦了,受教,谢楼主。

没事的,嘻嘻
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马