java 内部类 匿名内部类

内部类 :
在一个类A的内部再定义一个类B,类A叫作外部类,类B叫作内部类

内部类 : 成员内部类 vs 局部内部类
成员内部类 : 静态(成员)内部类 vs 非静态(成员)内部类
在这里插入图片描述
在这里插入图片描述

内部类作为类:

  • 可以继承父类,实现接口
  • 类内部可以有类的成员(普通类可以做的事情内部类都可以)。

作为类的成员:

  • 可以被static修饰
  • 可以使用四种权限修饰符
  • 内部类还可以调用外部类的成员(属性,方法)

学习目标:
1.如何创建内部类的对象?
静态内部类: new 外部类名.内部类名()
非静态内部类 : 外部类的对象.new 内部类名()

2.内部类如何调用外部类的成员(属性和方法)?
静态内部类 : 外部类名.类变量名、静态方法 (只能调用外部类的类变量和静态方法)
非静态内部类 : 外 部类名.this.属性名、方法名

3.如何使用局部内部类?

//外部类
class Number{
	
	public String type = "number";
	public static int age = 5;
	
	public void show(){
		System.out.println("number show");
	}
	
	public static void test(){
		System.out.println("number test");
	}
	
	//非静态内部类 - 可以调用外部类的静态方法和非静态方法,实例变量和类变量
	class A {
		int age = 20;
		public void info(){
			System.out.println("A info " + Number.this.type + " " + Number.this.age);
//			System.out.println(age + " " + type);
			//调用外部类的方法
//			Number.this.show();
//			Number.this.test();
		}
	}
	
	//静态内部类 - 只能调用外部类中的静态方法和类变量
	static class B{
		public void info(){
			System.out.println("B info" + Number.age);
			//调用外部类的静态方法
			Number.test();
		}
	}
	
}
public class InnerClassTest {
	
	public static void main(String[] args) {
		
		//1.创建非静态内部类的对象
		//创建非静态内部类的对象
		Number number = new Number();//创建外部类的对象
		Number.A a = number.new A();
		a.info();
		
		System.out.println("-------------------------------------------------");
		//创建静态内部类的对象
		Number.B b = new Number.B();
		b.info();
		
		System.out.println("-------------------------------------------------");
		
		InnerClassTest ict = new InnerClassTest();
		ict.test();
		
		MyInterface myInterface = ict.test2();
		//可以获取局部内部类的对象但是无法向下转型。
		myInterface.info();
	}

	/*
	 * 如何获取局部内部类的对象 (了解即可)
	 */
	public MyInterface test2(){
		class C implements MyInterface{
			public void info(){
				System.out.println("MyInterface test method info");
			}
		}
		return new C();
	}
	
	public void test(){
		//局部内部类
		class C{
			public void info(){
				System.out.println("test method info");
			}
		}
		
		new C().info();
	}
	
}

interface MyInterface{
	void info();
}

运行结果:
在这里插入图片描述
在这里插入图片描述

匿名内部类的特点:

  1. 匿名内部类必须继承父类或实现接口
  2. 匿名内部类只能有一个对象
  3. 匿名内部类对象只能使用多态形式引用
interface MyInterface{
	void add(int a,int b);
}

public class AnonymousTest {

	public static void main(String[] args) {
		

		class Computer implements MyInterface{
			
			public void add(int a,int b){
				System.out.println(a + b);
			}
		}
		MyInterface computer1 = new Computer();

		//创建了一个实现类MyInterface接口的匿名实现类的对象
		MyInterface computer = new MyInterface(){
			public void add(int a,int b){
				System.out.println("匿名实现类的对象");
			}
		};
		
		//可以使用alt + /
		new MyInterface() { //创建的是该接口的实现类的对象
			@Override
			public void add(int a, int b) {
				// TODO Auto-generated method stub
			}
		};
		
		test(computer);
	}
	
	//如果形参是一个接口的类型,那么实参只能是接口实现类的对象
	public static void test(MyInterface mi){
		
		mi.add(5, 10);
	}
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级D洋葱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值