黑马程序员技术交流社区

标题: 访问static内部类的静态成员 [打印本页]

作者: 759345779    时间: 2014-4-6 21:39
标题: 访问static内部类的静态成员
  1. public class InnerClassDemo {
  2.         static int i=3;
  3.         static class Inner{
  4.                 static int i=4;
  5.                 public static void function(){
  6.                         int i=5;
  7.                         System.out.println(i);
  8.                         System.out.println(Inner.i);
  9.                         System.out.println(InnerClassDemo.i);
  10.                 }
  11.                
  12.         }
  13.         public static void main(String[] args) {
  14.                 InnerClassDemo.Inner.function();
  15.         }

  16. }
复制代码

依次打印结果:
5
4
3
访问内部类中的static成员,内部类Inner前必须要static修饰,不然会报错,照此推理InnerClassDemo前面不是也要加static修饰吗?可是加了就会报错,这是为什么呢???
作者: ╰青青子佩ˊゝ    时间: 2014-4-6 21:51
1.你要理解为什么会出现静态这个东西,是因为需要不通过创建实例对象来直接调用类的成员变量和方法。
2.要直接调用Inner类中的function()方法,首先要访问Inner这个类,在不创建InnerClassDemo类的实例对象的前提下访问其内部类,那么Inner类前当然要加static ;其次,再访问Inner类中的方法且不创建Inner类,当然要在function前加static .
3.本身你这个推理逻辑不正确。
作者: ilvsoft    时间: 2014-4-6 21:55
╰青青子佩ˊゝ 发表于 2014-4-6 21:51
1.你要理解为什么会出现静态这个东西,是因为需要不通过创建实例对象来直接调用类的成员变量和方法。
2.要 ...

大神能举个例子吗,按道理他InnerClassDemo前面加个static是可以的啊,可以在不实例化对象的情况下访问它累里面的成员变量和方法啊
作者: xuehuayous    时间: 2014-4-6 21:58
你定义的内部类在成员位置上,
内部类定义中的局部位置上时,只能访问该局部被final修饰的局部变量
所以不用加的。
下面是以前的总结,希望有助于你理解;
内部类的访问规则:
1.内部类可以直接访问外部类的成员,方法;
之所以可以直接访问外部类中的成员,是因为内部类
持有一个外部类的引用,格式:外部类名.this
2.外部类要访问内部类,必须建立内部类对象。
访问格式:
1.当内部类定义在外部类的成员位置上,而且非私有,
可以在外部其他类中直接建立内部类对象。
外部类名.内部类名 变量名 = new 外部类名().内部类名。
Outer.Inner in = new Outer().Inter();
2.当内部类在成员位置上,就可以被成员修饰符所修饰。
比如:private,将内部类在外部类中进行封装。
          Static ,内部类就具备了static的特性。
内部类可以私有!!!
在外部其他类中访问static内部类的非静态成员
new Outer.Inner().function();
外部其他类中,访问static内部类的静态成员
Outer.Inner.function();
注意:内部类中定义了静态成员,该内部类必须是static的。
          当外部类中的静态方法访问内部类时,内部类也必须是static的。
作者: 李厚斌    时间: 2014-4-6 22:08
给你发你自己看吧。。刚看了好几个都是纠结修饰符的问题的。首先static是不能修饰类的(内部类除外)。。


关于几个修饰类你自己看看

1.       类(class)

可见性修饰符: public—在所有类中可见,在其他包中可以用import导入。
                             缺省—就是没有修饰符,在同一个包中的类中可见,在其他包中不能用import导入。
              修饰符:final—终态类,表示该类不能被继承
                            abstract—抽象类,不能新建对象

2.       变量(variable)

Java中变量有两种,方法变量和字段变量
方法变量只能用一个修饰符:final—表示常量,不能修改
下面是字段变量的修饰符
        可见性修饰符:public—在任何类中可见
                                    protected—       在子类中或同一个包中可见
                                    private—只在本类中可见,子类中也不可见
                                    缺省—在同一个包中可见,子类不在一个包中,子类中也不可见  
        修饰符:static—静态变量,被类的所有实例共享
                        final—常量,定义后不能修改
*transient—告诉编译器,在类对象序列化的时候,此变量不需要持久保存
*volatile—指出可能有多个线程修改此变量,要求编译器优化以保证对此变量的修改能够被正确的处理
这两带*的不是很常用,但也是Java的修饰符,我也不是很清楚

3.      方法(method)

   可见性修饰符:public—在任何类中可见
                               protected—在子类中或同一个包中可见
                              private—只在本类中可见,子类中也不可见
                              缺省—在同一个包中可见,子类不在一个包中,子类中也不可见
   修饰符:   static—静态方法,并不需要创建类的实例就可以访问静态方法
                      final—常方法,所有子类不能覆盖该方法,但可以重载
                      abstract—抽象方法,在抽象类中没有实现的方法
                      native—本地方法,参见Java Native Interface(JNI)
                             synchronized —在多线程中,synchronized方法调用时,其他所有方法不能调用该方法

4.       接口(interface)

         可见性修饰符:public—所有类中可见
                                     缺省—同一个包中可见
         接口中的变量总是需要定义为“ public static final 接口名称”,但可以不包含这些修饰符,编译器默认就是这样   
因为接口是不可能有直接实例的,那样的话也就是不可能修改(final),也不可能通过实例访问的(static)。     
         接口中的方法只能使用public和abstract修饰符  


作者: 759345779    时间: 2014-4-6 22:26
╰青青子佩ˊゝ 发表于 2014-4-6 21:51
1.你要理解为什么会出现静态这个东西,是因为需要不通过创建实例对象来直接调用类的成员变量和方法。
2.要 ...

谢谢你了
作者: 759345779    时间: 2014-4-6 22:29
李厚斌 发表于 2014-4-6 22:08
给你发你自己看吧。。刚看了好几个都是纠结修饰符的问题的。首先static是不能修饰类的(内部类除外)。。

...

非常感谢
作者: 759345779    时间: 2014-4-6 22:30
xuehuayous 发表于 2014-4-6 21:58
你定义的内部类在成员位置上,
内部类定义中的局部位置上时,只能访问该局部被final修饰的局部变量
所以不 ...

嗯 谢谢了
作者: ╰青青子佩ˊゝ    时间: 2014-4-6 22:48
ilvsoft 发表于 2014-4-6 21:55
大神能举个例子吗,按道理他InnerClassDemo前面加个static是可以的啊,可以在不实例化对象的情况下访问它 ...

外部类不能被static修饰。static只能修饰类中成员,内部类属于外部类的成员,所以可以用static。
  1. class Test2{
  2.         public static void main(String[] args)throws IOException{
  3.                 Animal.Cat.print();
  4.         }
  5. }
  6. //外部类不能使用static修饰。
  7. class Animal{
  8.         static class Cat{
  9.                 public static void print(){
  10.                         System.out.println(" I love you , honey ! ");
  11.                 }
  12.         }
  13. }
复制代码





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