java---内部类

  • java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类
  • 内部类的分类:
    • 成员内部类(静态、非静态)
    • 局部内部类(方法内、代码块内、构造器内)
  • 成员内部类
    • 一方面,作为外部类的成员
      • 调用外部类的结构
      • 可以被static修饰
      • 可以被4种不同的权限修饰
    • 另一方面,作为一个类
      • 类内可以定义属性、方法、构造器
      • 可以被final修饰,表示此类不能被继承
      • 可以被abstract修饰
  • 如何实例化成员内部类的对象
  • 如何在成员内部类中区分调用外部类的结构

成员内部类和局部内部类在编译以后,都会生成字节码文件

字节码文件命名格式:

成员内部类:外部类$内部类名.class

局部内部类:外部类$数字 内部类名.class

​ 住:数字用于区分同名的局部内部类。

package exer;

public class InnerClassTest {
	public static void main(String[] args) {
		//创建Dog实例(静态的成员内部类)
		Person.Dog dog=new Person.Dog();
		dog.show();
		
		//创建Bird实例(非静态的成员内部类)
		Person p=new Person();
		Person.Bird bird=p.new Bird();
		bird.sing();
		
		System.out.println();
		
		bird.display("ll");
	}
}
class  Person{
	String name="小明";
	int age;
	
	public void eat(){
		System.out.println("人:吃饭");
	}
	//静态成员内部类
	static class Dog{
		String name;
		int age;
		
		public void show(){
			System.out.println("狗狗狗");
		}
	}
	
	//非静态成员类
	class Bird{
		String name="杜鹃";
		
		public Bird(){
			
		}
		public void sing(){
			System.out.println("鸟鸟鸟");
			//调用外部类的非静态方法
			Person.this.eat();
			eat();
			System.out.println(age);
		}
		public void display(String name){
			//方法的形参
			System.out.println(name);
			//内部类的属性
			System.out.println(this.name);
			//外部类的属性
			System.out.println(Person.this.name);
		}
	}
}
  • 开发中局部内部类的使用
package exer;

public class InnerClassTest1 {
	public Comparable getComparable(){
		class MyComparable implements Comparable{

			@Override
			public int compareTo(Object o) {
				return 0;
			}
			
		}
		return new MyComparable();
	}
}

内部类中要注意的一个问题:

package exer;

public class Test {
	/*
	 * 在局部内部类的方法中(比如:show)如果调用了声明局部内部类的方法(比如method)中的局部变量(比如num)
	 * 要求此局部变量声明为final的
	 * jdk 7及之前的版本:要求此局部变量显式的声明为final的
	 * jdk 8及之后的版本:可以省略final的声明。 
	 */
	public void method(){
		//局部变量
		int num=10;
		//局部内部类
		class AA{
			public void show(){
				//num=20;
				System.out.println(num);
			}
		}
	}
}

posted @ 2022-02-10 17:45  ice--cream  阅读(35)  评论(0编辑  收藏  举报