Java基础——内部类

内部类

定义

内部类是定义在类内部的类,它可以访问外部类的成员。

为什么需要内部类

  1. 增强封装,把内部类隐藏在外部类中,不允许其他类访问这个内部类
  2. 增加了代码的维护性

内部类分类

  • 实例内部类
    直接定义在类当中的一个类,在类前面没有任何一个修饰符
  • 静态内部类
    在内部类前面加上一个static
  • 局部内部类
    定义在方法中的内部类
  • 匿名内部类
    属于局部内部的一种特殊情况

实例内部类

class Outter{
	String name = "Outername";
	
	class Inner{
		
		int age = 10;
		String name = "inname";
		
		void test() {
			String name = "testname";
			System.out.println(name);
			
			System.out.println(this.name);
			
			System.out.println(Outter.this.name);
		}
	}
}
public class Test {
	public static void main(String[] args) {
		
		Outter out = new Outter();
		//System.out.println(out.name);
		//创建实例内部类
		//创建内部类对象当中,会有一个外部类的引用 
		Outter.Inner in = out.new Inner();
		in.test();
	}
}
  • 要使用实例内部类,必须先创建外部类对象
  • 实例内部类可以访问外部类的成员
  • 实例内部类中不能有静态成员
  • 外部类不能直接访问实例内部类中的成员

静态内部类

class Outter{
	static String name = "myxq";
	int age = 10;
	static class Inner{
		static String color = "black";
		int width = 30;
		void test() {
			System.out.println(name);
			System.out.println(new Outter().age);
		}
	}
}

public class Test {

	public static void main(String[] args) {
		//创建静态内部类
		Outter.Inner in =	new Outter.Inner();
		in.test();
		
		//System.out.println(in.width);
		
		//访问静态类当中的静态成员
		//System.out.println(Outter.Inner.color);
	}
}
  • 不需要创建外部类对象
    Outter.Inner in = new Outter.Inner();
  • 静态内部类中没有外部类的引用(不能用:外部类名.this.外部类成员)
  • 静态内部类不能直接访问外部类普通成员,但是可以直接访问外部类的静态成员
  • 静态内部类中可以定义静态成员,也可以定义非静态成员

局部内部类

class Outter{
	
	void myxq() {
		
		final String name = "myxq";
		class Inner{
			void test() {
				System.out.println(name);
			}
		}
		Inner in = new Inner();
		in.test();
		
	}
	
}


public class Test {
	
	public static void main(String[] args) {
		
		new Outter().myxq();
	}
}
  • 不能使用一些修饰 public private ...
  • 局部内部类只能在定义的方法当中使用
  • 局部内部类当中不能包含静态变量
  • 局部内部类当中可以包含局部变量,使用的局部变量的本质是final常量

匿名内部类

interface IUSB{
	void swapData();
}

class MotherBoard{
	void pluginIn(IUSB u) {
		u.swapData();
	}
}

class Printer implements IUSB{
	public void swapData() {
		System.out.println("打印工作");
	}
}

class KeyBoard implements IUSB{
	public void swapData() {
		System.out.println("打字");
	}
}

class Mouse  implements IUSB {
	public void swapData() {
		System.out.println("鼠标移动");
	}
}

public class Test {
	public static void main(String[] args) {
		
		IUSB m = new Mouse();
		IUSB k = new KeyBoard();
		
		MotherBoard b = new MotherBoard();
		b.pluginIn(m);
		b.pluginIn(k);
		
		//b.pluginIn(p);
		
		b.pluginIn(new IUSB() {
			public void swapData() {
				System.out.println("打印工作");
			}
		});
		
	}
}
  • 匿名内部类就是一个没有名字的局部内部类
  • 只使用一次的时候,才去使用匿名内部类
  • 格式
    new 父类的构造器 或 接口(){
    内部写的代码(在new时候就会自动执行)
  • 匿名内部类必须得要有父类才或者是实现了接口
posted @ 2021-09-06 10:45  来一块小饼干  阅读(45)  评论(0编辑  收藏  举报