内部类访问外部类的变量必须是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对象的成员变量。

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

时间: 2024-10-10 13:25:24

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

ERROR无法从静态上下文中引用非静态变量

ERROR无法从静态上下文中引用非静态变量 2012-06-16 20:58:52 分类: Java 什么是“static”? 学习过java.C++或C的人都应该认识这个关键字.用这个关键字修饰的变量叫做静态变量,有其特殊的作用.在java中static也用来修饰静态方法和静态内部类. 静态变量的特点: (1)生存周期:静态局部变量的生存周期也是整个源程序.当定义整个变量的函数结束时,整个变量并没有消失,他始终是存在的. (2)作用域:作用域与自动变量是一样的,只能在定义其的子函数中使用,当退

报错!无法从静态上下文中引用非静态 变量

1 import java.awt.Point; 2 class rectangle 3 { int x1=0; 4 int y1=0; 5 int x2=0; 6 int y2=0; 7 8 rectangle point(int x,int y,int z,int w) 9 {x1= x; 10 y1= y; 11 x2= z; 12 y2= w; 13 return this; 14 } 15 16 public static void main(String[] args) 17 18

内部类练习题(外部类访问内部类成员、内部类访问外部类成员、顶级类访问内部类成员)

package com.Summer_0429.cn; /** * @author Summer * 内部类实例: * 定义一只猫类,猫有: * 1.重量 * 2.猫的身体: * 1)颜色 * 2)显示猫的身体的信息(): * 3.显示猫的整体信息(): * 要求:创建一只小猫,显示它的整体信息. * */ class Cat{ private double weight; public Cat(double weight){ this.weight = weight; } //内部类:成员内部

"无法从静态上下文中引用非静态变量,非静态方法"

原因:1.用static修饰的方法称为静态方法,修饰变量则为静态变量,又分别叫做类方法或者类变量. 2.静态的方法可以在没有创建实例时使用,而申明为非静态的成员变量是一个对象属性,它只有在对象存在时引用,   因此如果在对象未创建实例时,在静态方法中调用了非静态成员方法自然是非法的. 改正:   1.在方法或者变量前面加static关键字   2.初始化(new)一个对象 原文地址:https://www.cnblogs.com/lydbky/p/8178055.html

内部类和 外部类相互访问

内部类: ①静态内部类中可以有非静态的方法 ②当内部类中有静态方法或者静态成员变量时,一定是静态内部类 1.外部类访问内部类: 内部类被static修饰:可以直接new Inner in = new Inner(); 内部类没有被static修饰:得先new出来外部类的实例,再new内部类的 Inner in = new Outer().new Inner(); 2.内部类访问外部类:(外部类.this.变量) 3.外部类和内部类中的方法相互访问: ①外部类的静态方法test和非静态内部类的非静

内部类和外部类之间的相互调用

内部类: ①静态内部类中可以有非静态的方法 ②当内部类中有静态方法或者静态成员变量时,一定是静态内部类 一般内部类在外部类的成员变量位置,像这样: 1 public class Outer { 2 class Inner{ 3 4 } 5 } 1.外部类访问内部类: 内部类被static修饰:可以直接new Inner in = new Inner(); 内部类没有被static修饰:得先new出来外部类的实例,再new内部类的 Inner in = new Outer().new Inner(

Java嵌套类,内部类和外部类

1.嵌套类,内部类 嵌套类是指被定义在一个类内部的类: JAVA的嵌套类有很多种类:1.静态成员类:2.非静态成员类:3.匿名类:4.局部类:其中,除了静态成员类之外,其他的都是内部类,因为静态成员类更像是一个独立的类: 但是静态成员类,是外部类内部的一个成员,静态成员类的访问和其他的静态成员一样:1.通过外部类类名调用:2.如果静态成员类定义为私有,那么只能在外部类内部使用        JAVA 内部类可以很好的实现隐藏,并且内部类拥有外围类的所有元素的访问权限,可是实现多重继承,并且可以避

java学习(四)static静态变量 和this

java中的this /* this:是当前类的对象引用.简单的记,它就代表当前类的一个对象. 注意:谁调用这个方法,在该方法内部的this就代表谁. this的场景: 解决局部变量隐藏成员变量 */ //定义学生类 class Student { //姓名 private String name; //年龄 private int age; //姓名获取值 public String getName() { return name; } //姓名设置值 public void setName(

深入理解Java中为什么内部类可以访问外部类的成员

内部类简介 虽然Java是一门相对比较简单的编程语言,但是对于初学者, 还是有很多东西感觉云里雾里, 理解的不是很清晰.内部类就是一个经常让初学者感到迷惑的特性. 即使现在我自认为Java学的不错了, 但是依然不是很清楚.其中一个疑惑就是为什么内部类对象可以访问外部类对象中的成员(包括成员变量和成员方法)? 早就想对内部类这个特性一探究竟了,今天终于抽出时间把它研究了一下. 内部类就是定义在一个类内部的类.定义在类内部的类有两种情况:一种是被static关键字修饰的, 叫做静态内部类, 另一种是