Java匿名内部类的详细描述

内部类:在一个类中再次创建的类称为内部类,另一个类称为外部类;内部类分为有名内部类和匿名内部类

有名内部类:有自己名称的内部类,编译后生成 外部类$内部类.class文件

public class Student{//外部类
	class Grade{//有名内部类
		public void benefit() {
			System.out.println("成绩好得益于学习");
		}
	}
	{
		Grade grade = new Grade();//在代码块中相当于Grade grade = this.new Grade();
	}
	public static void main(String[] args) {
		Student student = new Student();
		Grade grade = student.new Grade();//在创建内部类对象时需要依靠外部类对象
		grade.benefit();
	}
}

匿名内部类:没有自己名字的内部类,需要依靠创建对象来定义,必须和创建对象同时存在。匿名内部类一定是创建对象的类的子类,或者一定是接口的实现类。编译后生成 外部类$数值.class文件(数值从1开始,几个匿名内部类就有几个数值)
格式:new 父类构造器([参数列表]) | 接口{
                 匿名内部类类体
          }

public class Body {
	public void beat() {
		System.out.println("心脏正在跳动");
	}
	static Body body = new Body(){//是Body类的子类
		@Override
		public void beat() {//重写了父类中的方法
			System.out.println("心脏正在跳动");
		}
	};
	public static void main(String[] args) {
		body.beat();//方法通过父类对象调用
	}
}

public interface Body {
	public void beat(); 
	
}




public class Test implements Body{
    static Body body = new Body(){//是Body接口的实现类
		@Override
		public void beat() {//重写了接口中的虚拟方法
			System.out.println("心脏正在跳动");
		}
	};
	public static void main(String[] args) {
		body.beat();//通过接口对象进行调用
	}
}

匿名内部类常用于重写父类和接口中的方法,当然也可以定义新的属性与方法,但是此方法上的上转型对象无法调用

关于修饰符问题

public class Test {//外部类与接口修饰符只能是public或默认
	public class Child{//内部类与接口修饰符4种均可
		
	}
	private class Parent{
		
	}
	public static void main(String[] args) {
		class Brother{//与局部变量一样,局部内部类不允许添加任何修饰符
			
		}
	}
}
发布了16 篇原创文章 · 获赞 0 · 访问量 224

猜你喜欢

转载自blog.csdn.net/LinDadaxia/article/details/105255860