java内部类访问外部静态变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java内部类访问外部静态变量相关的知识,希望对你有一定的参考价值。

public class GroupThree
private static int count;
private String name;

public class Student
private int count ;
private String name ;
public void Output (int count)
count++;
this.count++;
GroupThree.count++;
GroupThree.this.count++;
System.out.println(count+""+this.count+""+GroupThree.count+""+GroupThree.this.count++);


public Student aStu()

return new Student();


public static void main(String[] args)
GroupThree g3 = new GroupThree();
g3.count = 10;
GroupThree.Student s1=g3.aStu();
s1.Output(5);




这段代码不同含义的count有点糊涂,大虾们给讲讲,详细点。
count++;
this.count++;
GroupThree.count++;
GroupThree.this.count++;
这里讲讲

count++; 指的是方法的局部变量 因为在方法中定义了一个 int count
所以覆盖了所在类的变量 count ,所以参数count的值+1;

this.count++ 指的是所在类的变量count+1,为了与方法的局部变量count区分开来,所以必须用this.

而GroupThree.count++;因为GroupThree中的变量count是类变量,即静态变量有static,所以可以通过类名直接调用,所以GroupThree.count++;指的是
GroupThree的类变量count+1;

最后一个 GroupThree.this.count++;
内包类访问外包类的同名变量时,采用的格式是:外包类名.this.同名变量;

这个慢慢就可以理解了。希望对你有帮助
参考技术A count++; 是指 参数的count
this.count++; 是指 类变量的 count

下面的类似

内部类访问外部类的变量必须是final吗,java静态方法中不能引用非静态变量,静态方法中不能创建内部类的实例

内部类访问外部类的变量必须是final吗?

如下:
class A
{
int i = 3;
public void shout()
{

class B
{
public void shout1()
{
System.out.println(i);
}

}
B b=new B();
b.shout1();
}

public static void main(String [] args)
{
A a=new A();
a.shout();

}
可正常输出3,证明可以访问类的变量i,但改为下面的方式:
class A
{
public void shout(int temp)

final int i = temp; 
class B
{
public void shout1()
{
System.out.println(i);
}

}
B b=new B();
b.shout1();
}

public static void main(String [] args)
{
A a=new A();
a.shout(3);

}此时i必须为final,怎么理解呢?收起
最佳答案
 
  是的,因为生命周期的原因。方法中的局部变量,方法结束后这个变量就要释放掉,final保证这个变量始终指向一个对象。

  首先,内部类和外部类其实是处于同一个级别,内部类不会因为定义在方法中就会随着方法的执行完毕而跟随者被销毁。问题就来了,如果外部类的方法中的变量不定义final,那么当外部类方法执行完毕的时候,这个局部变量肯定也就被GC了,然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到了。如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类中,这样的话,由于final所修饰的值始终无法改变,所以这个变量所指向的内存区域就不会变。

java静态方法中不能引用非静态变量
因为我们知道静态的方法可以在没有创建实例时使用,而申明为非静态的成员变量是一个对象属性,它只有在对象存在时引用,因此如果在对象未创建实例时我们在静态方法中调用了非静态成员方法自然是非法的,所以编译器会在这种时候给各错误.  

简单说来,静态方法可以不用创建对象就调用,非静态方法必须有了对象的实例才能调用.因此想在静态方法中引用非静态方法是不可能的,因为它究竟引用的是哪个对象的非静态方法呢?编译器不可能给出答案,因为没有对象啊,所以要报错

class HelloWorld 


int a1 = 6; 

public static void main(String[] args) 

  
   System.out.print(a1);    
/**   成员变量不能直接调用  ( 无法从静态上下文中引用非静态变量   a1  )             
   */ 

 

静态方法中不能创建内部类的实例

技术分享

 

如上图所示,Outter是一个普通的类,Inner是Outter类里面的内,属于内部类。在main方法中试图创建Inner的实例,MyEclipse会有报错提示,大意是:“没有Outter可以访问的实例,必须指定一个Outter类的实例(如:x.new A() 其中x就是一个Outter类的实例)”

 

原因:

内部类的特点是可以访问外部类的成员变量,而成员变量只能在创建了实例之后才能访问。

那么main方法是个静态方法,即可以不创建Outter的实例就能访问这个方法,这时候如果Inner可以创建实例,那么inner的实例就有可能访问Outter对象的成员变量。

但main方法是静态方法可以不创建对象就运行,Outter对象都没有创建,Inner就算能创建对象,也有可能访问不到Outter对象的成员变量。

所以,是不能在静态方法中创建内部类的对象,防止该内部类对象在外部类对象创建前访问外部类的成员变量。

 

以上是关于java内部类访问外部静态变量的主要内容,如果未能解决你的问题,请参考以下文章

java 内部类和外部类的关系

java中的内部类

内部类访问外部类的变量必须是final吗,java静态方法中不能引用非静态变量,静态方法中不能创建内部类的实例

Java连载58-静态内部类成员内部类详解

一个java内部类有几个分类?

java 内部类