天天看点

Java学习总结(六) —— 内部类一、内部类二、匿名内部类

Java学习总结(六) —— 内部类

  • 一、内部类
    • 1. 概述
    • 2. 内部类的访问
  • 二、匿名内部类
    • 1. 基本使用方法
    • 2. 作为参数传递

一、内部类

1. 概述

将一个类A定义在另一个类B里面,里面的那个类A就称为 内部类 ,B则称为外部类。

代码如下:

public class A{
	class B{
	}
}
           

2. 内部类的访问

  • 1.内部类可以直接访问外部类的成员,包括私有成员。
  • 2.外部类要访问内部类的成员,必须要建立内部类的对象。

代码如下:

class Animal {
	    private boolean CAT = true;
		// 内部类
	    class Cat {
	        public void isCat() {
	            // 内部类可以直接访问外部类的成员变量
	            if (CAT) {
	                System.out.println("喵喵喵");
	            } else {
	                System.out.println("汪汪汪");
	            }
	        }
	    }
	
	    public void changeToCat() {
	        this.CAT = true;
	    }
	
	    public void changeToDog() {
	        this.CAT = false;
	    }
	}
	// 测试类
	class Test01 {
	    public static void main(String[] args) {
	        // 创建外部类对象
	        Animal animal = new Animal();
	        // 创建内部类对象
	        Animal.Cat Jim = animal.new Cat();
	
	        // 调用内部方法
	        Jim.isCat();
	        // 调用外部方法
	        animal.changeToDog();
	        // 调用内部方法
	        Jim.isCat();
	    }
	}
           

输出结果:

喵喵喵
	汪汪汪
           

重点:

  • 内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。
  • 比如,Animal$Cat.class

二、匿名内部类

匿名内部类:是内部类的简化格式,匿名内部类的本质是一个 带着具体实现的父类或父接口的匿名的 子类对象。

传统实现接口的步骤为:

  • 1.创建接口
  • 2.定义子类
  • 3.重写接口的方法
  • 4.创建子类对象
  • 5.调用重写后的方法

所以针对以上繁琐的步骤,提出了匿名内部类来简化开发的步骤。

【前提】匿名内部类必须继承一个父类或者实现一个父接口。

代码如下:

new 父类名或者接口名(){ 
		// 方法重写 
		@Override 
		public void method() { 
			// 执行语句 
		} 
	};
           

1. 基本使用方法

举个例子,代码如下:

abstract class Fruit {
	    public abstract void eat();
	}
	
	class InnerDemo {
	    public static void main(String[] args) {
		    /*
		    1.等号右边:是匿名内部类,定义并创建该接口的子类对象 
		    2.等号左边:是多态赋值,接口类型引用指向子类对象 
		    */
	        Fruit fruit = new Fruit() {
	            @Override
	            public void eat() {
	                System.out.println("甜滋滋的");
	            }
	        };
	        fruit.eat();
	    }
	}
           

输出结果:

甜滋滋的
           

2. 作为参数传递

另一种使用方法是将匿名内部类作为参数传递,通常在方法的形式参数是接口或者抽象类时使用。

代码如下:

abstract class Fruit {
	    public abstract void eat();
	}
	
	class InnerDemo {
	    public static void main(String[] args) {
	        show(new Fruit() {
	            @Override
	            public void eat() {
	                System.out.println("甜滋滋的");
	            }
	        });
	    }
	    public static void show(Fruit fruit) {
	        fruit.eat();
	    }
	}
           

输出结果:

甜滋滋的