Java基础复习 Day 16
1. 内部类
-
内部类分类:成员内部类,局部内部类(匿名内部类)
-
成员内部类:
-
成员内部类的定义格式:
修饰符 class 类名{
修饰符 class 成员内部类名称{
//…
}
//…
}
-
注意:内用外,随意访问;外用内,必须借助内部类对象
-
成员内部类的使用
-
间接方式:在外部类的方法中创建内部类对象,在main方法中创建外部类对象通过调用该方法使用内部类对象
//定义一个嵌有内部类的外部类 public class Outer { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public class InnerClass{ public void mothod1(){ System.out.println("内部类的方法"); System.out.println("我叫"+ name);//正确方法 } } public void method(){ System.out.println("外部类方法执行"); //通过在外部类的方法中创建内部类对象 new InnerClass().mothod1(); } } //Main方法中调用外部类对象 来调用内部类 public static void main(String[] args) { Outer outer = new Outer(); outer.method();//外部类方法执行 //内部类的方法 我叫null }
-
直接方式:公式:外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
public static void main(String[] args) { Outer.InnerClass innerClass = new Outer().new InnerClass(); innerClass.mothod1();//内部类的方法 //我叫null }
-
-
-
当有同名变量时的访问区分方法:
public class Outer {
int num = 10;
public class Inner{
int num = 20;
public void innerMethod(){
int num = 30;
System.out.println(num);//访问同名局部变量
System.out.println(this.num);//访问同名内部类成员变量
System.out.println(Outer.this.num);//访问同名外部类对象
}
}
}
public static void main(String[] args) {
Outer.Inner inner = new Outer().new Inner();
inner.innerMethod();//30 20 10
}
-
局部内部类
-
定义:如果一个类是定义在一个方法内部的, 那么这就是一个局部内部类。
定义格式:
修饰符 class{
修饰符 返回值类型 外部类方法名称(){
修饰符 class{
//…
}
//…
}
//…
}
- “局部”:只有当前所属的方法才能使用它,出了这个方法之外就不能访问,所以在访问局部内部类时, 需要在方法内部定义局部类对象来使用其成员方法等。
//定义一个有局部内部类的外部类 public class Outer { public void methodOuter(){ class Inner{ int num = 10; public void methodInner(){ System.out.println(num); } } Inner inner = new Inner(); inner.methodInner(); } } //Main方法调用 public static void main(String[] args) { Outer outer = new Outer(); outer.methodOuter();//10 }
-
-
小结:关于权限修饰符在外部类中的使用
public > protected > (default) > private
定义一个类的时候,权限修饰符规则
- 外部类:public ,(default)
- 成员内部类:public > protected > (default) > private
- 局部内部类:什么都不能写
-
局部内部类的final问题
在局部内部类中,如果希望访问所在方法的局部变量,那么这个变量则需要有效final(可显示定义final关键字,也可事实上不要改变其值也可)
原因:因为局部变量跟方法走,内存存在方法区
局部内部类时new出来的,在栈内存例
方法出栈时,局部变量byebye,但是此时可能局部内部类还没有垃圾回收,那就需要留下的不变的final数据
public class Outer { public void methodOuter(){ /*final*/ int num = 10; //num = 20;如果改变num的值则 //Variable 'num' is accessed from within inner class, needs to be final or effectively final class Inner{ public void methodInner(){ System.out.println(num); } } Inner inner = new Inner(); inner.methodInner(); } }