Java内部类总结

今天老师布置了一个实验,关于内部类的,试验了一下所有内部类,记录一下

在编写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内部类有个了解,希望能帮助到大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值