天天看点

Java中的有名内部类与匿名内部类

一、有名内部类

    1、定义方法

Java中的有名内部类与匿名内部类

        如图、在Example类中定义了一个Test类,此时Test称为有名内部类(因为该内部类有其名字),Example为其外部类

    2、作用

        内部类可以定义在类中的任何位置:

            一、当定义在成员变量的位置上:

                此时该内部类可以使用权限修饰符:public~private

            二、当定义在局部变量的位置上:

                此时该类不可以使用修饰符修饰;

            三、当类定义在含有局部变量的方法中:

                在JDK.8以下的版本要在形参中添加final修饰 

Java中的有名内部类与匿名内部类

   三、调用方法

      在定义的非静态有名内部类在静态方法中使用时;必须得创建对象进行调用:

public class Example {

	class Eat{//不可以直接在main方法中使用   必须创建对象
		void sleep() {
			
		}
	}
public static void main(String[] args) {
		Eat eat= new Example().new Eat();
	}
           

      可以看出想要必须创建Example对象才可以创建Eat对象

二、匿名内部类

    1、定义方法

Example example =new Example() {
			public void eat() {
				System.out.println("正在吃东西");
			}
		};
           

        此处定义的new Example();括号后面的部分相当于创建了一个子类(上转型对象),其中可以对父类方法进行重写而进行使用:

    2、作用

        一、定义在普通类

Java中的有名内部类与匿名内部类

        二、定义在抽象类

Java中的有名内部类与匿名内部类

        三、定义在接口类

Java中的有名内部类与匿名内部类

    3、使用方法

            一、在定义抽象类的内部类时必须全部实现其抽象方法,否则不可创建对象;

            二、可以在匿名内部类中添加新的属性和方法,但是这些属性和方法不能被上转型对象所调用,只能被非上转型对象方式创建的匿名内部类对象所调用

public class Test {
	public void eat() {
		System.out.println("吃");
	}
	public static void main(String[] args) {
		Test test= new Test() {
			@Override
			public void eat() {
				System.out.println("喝");
			}
			int age=0;
		}.age=11;
		System.out.println(test.age);	
	}
           

                此时的test的新定义的属性是不可以被上转型使用的、要是想要调用,就需要在创建的对象后面使用.新属性

三、创建内部类时在Workplace

    1、内部类创建新文件

            在创建内部类的时候,会在自己的eclipse的工作区中自定生成带有$(dollar)文件,匿名类使用的是1,2.3代替其类名:

Java中的有名内部类与匿名内部类