Java---(成员、局部、静态、匿名)内部类的特点及应用场景详细解析

内部类

内部类的引入

  提高了类成员的安全性

内部类概述

   把类定义在类的内部,A 类中定义 B类, A类相对于B类就是外部类,B类相对于A类就是内部类

内部类分类

1.成员内部类

2.局部内部类

3.静态内部类

4.匿名内部类

内部类特点

  1.内部类编译后生成class文件的格式: 外部类类名$内部类类名

  2.内部类可以访问外部类的所有成员,包括私有成员

  3.外部类访问内部类成员,必须创建内部类对象

  4.外界访问外部类成员,创建外部类对象,访问内部类对象需要同时创建外部类和内部类对象

  5.内部类将类和类之间产生了关系,提高了耦合性,降低可读性,慎用

1.成员内部类类

  概述: 把类定义在类内部的成员位置

  访问格式:
     外部类类名.内部类类名 对象名 = new 外部类对象().new 内部类对象();

     注意: 当外部类成员名字和内部类成员名字重名的时候: 外部类类名.this.成员

代码示例

class Fu {
	int num = 50;
	
	public void show() {
		int num = 60;
		System.out.println(num);
	}
}

class Outer2 extends Fu{
	int num = 40;
	
	// 成员内部类
	class Inner {
		int num = 30;
		
		public void show() {
			int num = 20;
			// 输出20
			System.out.println(____);
			// 输出30
			System.out.println(____);
			// 输出40
			System.out.println(____); 
			// 输出50
			System.out.println(____);
			// 输出60
			____
		}
	}
}

2.局部内部类

  概述: 把类定义在类内部的局部位置

   理解为局部变量即可

  访问局部内部类成员: 局部内部类只能够在局部创建对象来访问

代码示例

class Outer3 {
	
	
	public void show() {
		class InnerX {
			int num = 20;
			
			public void show() {
				System.out.println("Outer3.show().Inner.show()");
			}
		}
		
		InnerX innerX = new InnerX();
		System.out.println(innerX.num);
		innerX.show();
	}
}

3.静态内部类

  概述:把类定义在类的内部类,并且使用static关键字修饰内部类

  访问格式: 外部类类名.内部类类名 对象名 = new 外部类类名.内部类类名();

  如果在外部类访问静态内部类成员

     内部类静态成员: 类名.静态成员

    内部类非静态成员: 对象.非静态成员

   如何在外界访问静态内部类成员

     创建静态内部类对象格式:
       外部类.内部类 对象名 = new 外部类.内部类();

     访问静态内部类非静态成员
       对象.非静态成员

     访问静态内部类静态成员
       对象.静态成员
       外部类类名.静态内部类类名.静态成员
代码示例

public class InnerClassDemo05 {
	public static void main(String[] args) {
		Outer4 outer4 = new Outer4();
		outer4.test();
		
		Outer4.Inner oi = new Outer4.Inner();
		System.out.println(oi.num);
//		System.out.println(oi.num2);
		System.out.println(Outer4.Inner.num2);
		oi.show();
		Outer4.Inner.staticMethod();
	}
}

class Outer4 {
	
	static String country;
	
	static class Inner {
		int num = 10;
		static int num2 = 20;
		
		public void show() {
			System.out.println("show");
		}
		
		public static void staticMethod() {
			System.out.println("staticMethod");
		}
	}
	
	public void test() {
		System.out.println(Inner.num2);
		Inner inner = new Inner();
		System.out.println(inner.num);
	}
}

4.匿名内部类

  概述

  这个本质就是 一个 继承/实现了某个类(接口,普通类,抽象类)的子类匿名对象

  该类没有类名, 类名叫做 外部类类名$数字

  格式 :

   new 类名() {
     [重写方法;]
   };

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章