Java内部类 - 极悦
Java面向对象
Java异常
Java数组
Java常用类
Java集合
Java IO流
Java线程
Java反射
Socket编程
Java注解开发
Java GoF设计模式
HashMap
Java内存模型
Java线性表

Java内部类

在A类的类体中定义了的类,称为内部类。

内部类包括: 成员内部类, 静态内部类, 局部内部类, 匿名内部类。

package com.wkcto.chapter01.innerclass.demo01;
/**
 * 成员内部类
 * 	1) 成员内部类与实例变量/实例方法一样,都是属于某一个Outer对象的
 * 	2) 一般情况下, 在实例方法中使用成员内部类创建对象
 * 	3) 在Java中,所有类编译后都会生成一个独立的字节码文件, 
 * 		内部类的字节码文件: 外部类$内部类名.class
 * 
 * @author 蛙课网
 *
 */
public class Outer {
	int  xx = 10 ; 		//实例变量
	public void m1() {
		System.out.println("实例方法");
		xx = 123; 		//在实例方法中,可以直接使用实例变量
		//一般情况下, 在实例方法中使用成员内部类创建对象
		Inner1  obj = new Inner1();
	}
	
	//成员内部类
	class Inner1{
		
	}
	
}
package com.wkcto.chapter01.innerclass.demo02;
/**
 * 静态内部类
 * 	1) 使用static修饰的成员 内部类
 * 	2) 静态内部类一般情况下是在静态方法中使用
 * 
 * @author 蛙课网
 *
 */
public class Outer {
	static int yy = 20; 		//静态变量
	public static void sm() {
		System.out.println("静态方法");
		yy = 202 ;				//在静态方法中,可以直接使用静态变量
		//一般情况下是在静态方法中使用静态内部类
		Inner2 obj = new Inner2();
	}
	
	//静态内部类
	static class Inner2{
		
	}
}
package com.wkcto.chapter01.innerclass.demo03;
/**
 * 局部内部类
 * 	1) 在方法体中定义的内部类就是局部内部类
 * 	2) 局部内部类的作用域 , 是从定义内部类的位置开始, 直到包含它的大括弧结束
 * @author 蛙课网
 *
 */
public class Outer {
	public void m3() {
		int zz = 10; 		//局部变量
		
		class Inner3{} 		//局部内部类
		
		
	}
}
package com.wkcto.chapter01.innerclass.demo04;
/**
 * 匿名内部类
 * 	1)匿名内部类,就是没有类名 的内部类,
 * 	2)因为匿名内部类没有类名, 匿名内部类的定义与对象的创建必须在一起
 * 	3)给接口/抽象类的引用赋值时,可以赋值匿名内部类对象,  接口实现类/抽象类的子类只使用一次时, 可以使用匿名内部类
 * 		经常, 如果方法的形参是接口/抽象类的引用,在调用方法时,可以传递匿名内部类对象
 * @author 蛙课网
 *
 */
public class Test {

	public static void main(String[] args) {
		//接口的引用只能赋值实现类对象, 接口不能实例化对象, 需要先定义一个类, 让它实现接口,再创建实现类对象给接口引用赋值
		//如果接口的实现类就使用这一次, 以后再也不用了, 就不需要再单独的定义一个实现类了, 可以直接给接口引用赋值匿名内部类对象
		
		Flyable  flyable = new Flyable() {
			//在匿名内部类中重写接口的抽象方法
			@Override
			public void fly() {
				System.out.println("我是匿名内部类中重写 的飞行操作");
			}
		};		
		flyable.fly();
		
		//抽象类不能实例化对象, 抽象类的引用需要赋值子类对象, 先定义子类继承抽象类, 重写抽象类的抽象方法, 再创建子类对象给抽象类引用赋值
		//当子类就使用这一次时, 可以直接给抽象类引用赋值匿名内部类对象
		
		Animal animal = new Animal() {
			//在匿名内部类中重写抽象类的抽象方法
			@Override
			public void walk() {
				System.out.println(" 这是一个神奇的动物, 它没有腿也能走路");
			}
		};
		animal.walk();
		
	}

}

总结:

记住类与类之间的关系, 可以通过Rose工具画出类与类之间的关系。

了解什么是内部类, 了解内部类有哪些, 掌握接口的引用/抽象类的引用可以赋值匿名内部类对象。

全部教程