java-static学习

       在java里,static关键字还可以修饰类--这就是内部类。它也只可能修饰内部类。

       首先,定义外部类和静态内部类

	static int outerField = 0;
	static int b(){
		return 1;
		
	}
	int out;
	staticTest(){
		
	}
	static class inner{
		staticTest bb = new staticTest();
		int s = b();
		void InnerMethod(){
            int i = outerField;
        }
		//下边报错
		int in = out;
	}

      从代码可以看出,静态内部类可以访问外部类的静态成员,不可以访问外部类的非静态成员。

 

       访问静态内部类

public static void main(String[] args){
		staticTest t = new staticTest();
		staticTest.inner n = new staticTest.inner();
		//下边这段代码是报错的  The method inner() is undefined for the type staticTest
		n = t.inner();
	}

      可以看到,可以通过外部类访问静态内部类,但不能通过外部类的实例访问静态内部类。甚至可以通过import的形式访问静态内部类

import codeTest.staticTest.inner;

         根据昨天的学习很容易想到,静态内部类,其实也只是一个类的静态成员而已,他是跟着整个类走的,不能通过任何实例化的外部类访问,不跟任何必须实例化的外部类对象产生关系。静态内部类中可以定义静态成员和非静态成员。

         执行main函数

public static void main(String[] args){
		staticTest t = new staticTest();
		staticTest.inner n = new staticTest.inner();
		//下边这段代码是报错的  The method inner() is undefined for the type staticTest
//		n = t.inner();
		staticTest.inner n2 = new staticTest.inner();
		n.s = 2;
		System.out.println(n.s);
		System.out.println(n2.s);
	}

     结果

2
1

     

说明虽然内部类被static关键字修饰,但是其实在内存中是保留两份的。

      对于非static内部类,情况复杂一点。。首先,内部类里面不能有static成员变量。但是对于基本数据类型和string,可以有static  final变量。

        网上很多答案,但看了很多都不知所云。。 个人觉得,这其实是java设计者为了方便而来的。java中很多这样的设计。如果当初java设计的时候允许static内部类可以有static变量,可以嘛?   当然可以。但是这貌似没有太大的必要,而且可能会对代码编写造成很大的不便。

        当然,如果你觉得这样不能说服你,还有另一个解释:对于非静态内部类来说,要想访问它,必须有实例化的外部类,我们假设有两个外部类,A和B,在内存中占两块内存。分别用他们访问非静态内部类,非静态内部类肯定会在两块内存中各占一个位置。毕竟他是人家两个实例对象的两个非静态成员。那么,如果这时候内部类里面有static成员,那么static成员是属于A,还是属于B呢?   很矛盾,于是,java设计者禁止这种情况。。

         还有一种解释,jvm加载顺序的问题。。    想看的时候网上搜吧   这种解释是最多的。。。

         至于对于string和各种基本类型,个人猜测是保存在外部类的常量池中,网上说法很多,没有官方文档,希望大神能科普吧。

你可能感兴趣的:(java-static学习)