java 内部类 变量_【Java基础】Java内部类

什么是内部类

把类定义在其他类的内部,这个类就被称为内部类。

内部类的分类

内部类分为两种,分别为成员内部类和局部内部类:

成员内部类:和成员变量和成员方法定义在同级

局部内部类:和局部变量定义在同级,包括在构造方法,成员方法体和静态方法体中

classOuter {class InnerA {//成员内部类

}

{class InnerB {//局部内部类

}

}static{class InnerC {//局部内部类

}

}publicOuter() {class InnerD { //局部内部类

}

}public voidshow() {class InnerE {//成员内部类

}

}

}

成员内部类访问特点

内部类可以直接访问外部类的全部成员。

外部类要访问内部类的成员,必须创建对象。

成员内部类一般多用private修饰和static修饰

classOuter {private int age = 20;classInner {public voidgetAge() {

System.out.println(age);

}

}public voidmethod() {//找不到符号//getAge();Inner inner= newInner();

inner.getAge();

}

}

public classTest {public static voidmain(String[] args) {

Outer.Inner inner= new Outer().newInner();

inner.getAge();

}

}

上面的例子中,可以直接通过new Outer(). new Inner();来访问内部来,这种访问一般不安全,因为类之所以定义在内部而不定义在外部,肯定有安全性需求,这时候可以在内部类前的修饰符加private,如果类中的成员变量,外部只能通过指定的方法来访问,这个时候在对外的方法可以提供验证,例如:

classOuter {private classInnerA {public voidplay() {

System.out.println("play");

}

}public voidgetInner(String name) {if(name.equals("lili")){newInnerA().play();

}

}

}public classTest {public static voidmain(String[] args) {

Outer outer= newOuter();

outer.getInner("lili");

}

}

当然,成员内部类也常用static修饰,这样访问起来便利性比较高,但是静态内部类只能访问静态外部成员变量。

public classTest {public static voidmain(String[] args) {

Outer.Inner inner= newOuter.Inner();

inner.getAge();

}

}classOuter {private static int age = 20;static classInner {public voidgetAge() {

System.out.println(age);

}

}public voidmethod() {

Inner inner = newInner();

inner.getAge();

}

}

局部内部类访问特点

可以直接访问外部类的全部成员

在局部位置,可以创建内部类对象来使用局部内部类提供的功能

局部内部类访问局部变量必须用final修饰

classOuter {private String name = "lili";public voidshow(){int phoneNum = 10086;classInner {final int age = 20;public voidgetAge() {//phoneNum = 110;//Error:(13, 17) java: 从内部类引用的本地变量必须是最终变量或实际上的最终变量

int miniPhoneNum = phoneNum;//可以访问

System.out.println(age);

System.out.println(phoneNum);System.out.println(name);

}

}newInner().getAge();

}

}public classTest {public static voidmain(String[] args) {

Outer outer= newOuter();

outer.show();

}

}

为什么局部内部类只能访问final类型的局部变量?

局部变量是随着方法的调用而调用,随着调用完毕而消失。而堆内存的内容并不会立即消失。所以,我们加final修饰。加入final修饰后,这个变量就成了常量。既然是常量。你消失了,我在内存中存储的是数据20,所以,我还是有数据在使用。

内部类中如何区分多层同名变量

classOuter {public int num = 10;classInner {public int num = 20;public voidshow() {int num = 30;

System.out.println(num);

System.out.println(this.num);//System.out.println(new Outer().num);

System.out.println(Outer.this.num);

}

}

}


版权声明:本文为weixin_39593340原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。