今天老师布置了一个实验,关于内部类的,试验了一下所有内部类,记录一下
在编写Java程序时,在类里面定义的类称之为内部类(Inner Class),内部类是外部类的一个成员。Java内部类可以分为成员内部类、方法内部类(局部内部类)和匿名内部类等。
外部类代码
package Experiment_3;
public class Outer {
private String num = "Outer num: 10";
/*
* 成员内部类:非静态和静态
*/
//public内部类
class Inner1{
private String num = "Inner1 num: 20";
public void method1(){
System.out.println("Public Inner1 class method1");
String num = "Inner1 method num: 30";
System.out.println(num); //当前方法num
System.out.println(this.num); //当前类num
System.out.println(Outer.this.num); //被限定在Outer类范围内的num
System.out.println("----------------------");
}
private void method2(){
System.out.println("Public Inner1 class method2");
String num = "Inner1 method num: 30";
System.out.println(num); //当前方法num
System.out.println(this.num); //当前类num
System.out.println(Outer.this.num); //被限定在Outer类范围内的num
System.out.println("----------------------");
}
public void method3() {
method2();
}
}
//private内部类
private class Inner2{
private String num = "Inner2 num: 20";
public void method1(){
System.out.println("Private Inner2 class method1");
String num = "Inner2 method num: 30";
System.out.println(num);
System.out.println(this.num);
System.out.println(Outer.this.num);
System.out.println("----------------------");
}
private void method2(){
System.out.println("Private Inner2 class method2");
String num = "Inner2 method num: 30";
System.out.println(num);
System.out.println(this.num);
System.out.println(Outer.this.num);
System.out.println("----------------------");
}
public void method3() {
method2();
}
}
//static内部类
static class Inner3{
private static String num = "Inner3 num: 20";
//非静态
public void method1(){
System.out.println("static Inner3 class public method1");
String num = "Inner3 method1 num: 30";
System.out.println(num);
System.out.println(this.num);
System.out.println(new Outer().num);
System.out.println("---------------------");
}
//static内部类static方法
public static void method2() throws Exception{
System.out.println("static Inner3 class static method2");
String num = "static method2 num: 30";
System.out.println(num);
System.out.println(Inner3.num);
System.out.println(new Outer().num);
System.out.println(Outer.class.newInstance().num);
System.out.println("----------------------");
}
}
/*
* 局部内部类
* 只能在其所在的方法中访问
*/
//
public void method() {
class Inner4{
private String num = "Inner4 num: 20";
public void method1() {
System.out.println("Inner4 class public method1");
String num = "Inner4 method1 num: 30";
System.out.println(num);
System.out.println(this.num);
System.out.println(new Outer().num);
System.out.println("---------------------");
}
}
Inner4 i = new Inner4();
i.method1();
}
//外部类方法调用公有内部类的方法
public void methodForInner1(){
System.out.println(num);
Inner1 i1 = new Inner1();
i1.method2();
}
//外部类方法调用私有内部类的方法
public void methodForInner2(){
System.out.println(num);
Inner2 i2 = new Inner2();
i2.method1();
i2.method2();
i2.method3();
}
}
演示类
package Experiment_3;
public class Demo01 {
public static void main(String[] args) throws Exception {
//Inner1 公有内部类
Outer.Inner1 oi = new Outer().new Inner1();
oi.method1(); //调用外部内部的公有方法
oi.method3(); //调用外部内部的私有方法
Outer o1 = new Outer();
o1.methodForInner1(); //调用外部内部的私有方法
System.out.println("---------------------------");
//Inner2 私有内部类
Outer o2 = new Outer();
o1.methodForInner2(); //调用外部私有内部的公私方法
System.out.println("---------------------------");
//Inner3 静态内部类
Outer.Inner3 o3 = new Outer.Inner3();
o3.method1();
o3.method2();
Outer.Inner3.method2();
System.out.println("---------------------------");
//Inner4 局部内部类
Outer o4 = new Outer();
o4.method();
//Inner5 匿名内部类
Outer o5 = new Outer(){
private String num = "anonymous num: 20";
@Override
public void method() {
System.out.println("Inner5 class method");
String num = "anonymous method num: 30";
System.out.println(num);
System.out.println(this.num);
//匿名内部类相当于是一个没有名字的子类,父类的私有变量是对子类隐藏的,覆盖?
//如何在匿名内部类中调用外部类的私有变量?反射和New都不行
}
};
o5.method();
}
}
控制台输出
Public Inner1 class method1
Inner1 method num: 30
Inner1 num: 20
Outer num: 10
----------------------
Public Inner1 class method2
Inner1 method num: 30
Inner1 num: 20
Outer num: 10
----------------------
Outer num: 10
Public Inner1 class method2
Inner1 method num: 30
Inner1 num: 20
Outer num: 10
----------------------
---------------------------
Outer num: 10
Private Inner2 class method1
Inner2 method num: 30
Inner2 num: 20
Outer num: 10
----------------------
Private Inner2 class method2
Inner2 method num: 30
Inner2 num: 20
Outer num: 10
----------------------
Private Inner2 class method2
Inner2 method num: 30
Inner2 num: 20
Outer num: 10
----------------------
---------------------------
static Inner3 class public method1
Inner3 method1 num: 30
Inner3 num: 20
Outer num: 10
---------------------
static Inner3 class static method2
static method2 num: 30
Inner3 num: 20
Outer num: 10
Outer num: 10
----------------------
static Inner3 class static method2
static method2 num: 30
Inner3 num: 20
Outer num: 10
Outer num: 10
----------------------
---------------------------
Inner4 class public method1
Inner4 method1 num: 30
Inner4 num: 20
Outer num: 10
---------------------
Inner5 class method
anonymous method num: 30
anonymous num: 20
看完应该能对Java内部类有个了解,希望能帮助到大家。