Java外部类和内部类的爱恨情仇

Java外部类和内部类

  • 前言
  • 一、外部类
  • 二、一般内部类
    • 1、访问内部类
  • 三、局部内部类
  • 四、静态内部类
  • 五、匿名内部类

前言

在学习Java过程中偶然遇到了外部类和内部类的相关问题,在通过查阅多个大牛博客之后,在这里做出个人的总结,若有什么问题欢迎评论留言讨论

一、外部类

外部类这个较好理解,顾名思义,就是在最外层的类,平时我们在Java中新建的类基本上都属于外部类,这里不做过多的解释,下面提供一个明了例子

/*Hello 为外部类*/
public class Hello {
	public static void main() {
		System.out.println("Hello World!");
	}
}

二、一般内部类

被包裹在某个类中的类即为内部类。内部类也拥有类的特性和功能,不推荐但允许内部类中嵌套内部类,形成娃套娃来完成一些特殊的需求。

1、访问内部类

需通过相对于该内部类的外部类进行实例化之后的对象对其进行实例化对象之后,在通过对象才能访问内部类中方法

/*
 内部类实例化调用
 Teacher text01 = new Teacher();
 Teacher.Student text02 = text01.new Student();
 上述两步可简化成下面一句
*/
Teacher.Student text01 = new Teacher().new Student();

三、局部内部类

在某个类中的类即使内部类,那处在某个类中的方法的类则被称为局部内部类。局部内部类的作用域跟它的名字一样只在包含它的方法中生效,访问权限也只限于这一方法。

public class Father {
    public void work() {
        System.out.println("WORK");
    }
    //主函数
    public static void main(String[] args) {
    	//方法中的内部类
        class Son {
            public void learn() {
                System.out.println("LEARN");
            }
        }
        Son son = new Son();	//可在方法中直接对其进行实例化
        Father father = new Father();
        son.learn();
        father.work();
    }
}

四、静态内部类

一些属性和方法加上 static 总会有些不一样,内部类也同样如此。大家应该都知道加上 static 之后的内容是跟所在类一起加载的,因此内部类变成静态内部类之后自然而然也可以摆脱通过外部类实例化对象才能访问的悲惨,相当于其变成了外部类,可通过类名或直接调用这个类并对其实例化。

public class Pet {
    public void eat() {
        System.out.println("EAT");
    }
    static class Dog {
        public void run() {
            System.out.println("RUN");
        }
    }
    
    public static void main(String[] args) {
        Pet pet = new Pet();
        Dog dog01 = new Dog();//也可写成Pet.Dog dog01 = new Dog();
        pet.eat();
        dog01.run();
    }
}

五、匿名内部类

这也是顾名思义,匿名内部类就是不需要知道类名,无需将其实例保存到一个变量中。匿名内部类适合创建那种只需要使用一次的类,也就是说创建一个匿名内部类,只需要用一次即可。

/*定义一个抽象类*/
public abstract class Phone {
    public abstract void work();
}

/*匿名内部类*/
class Huawei {
    public static void main(String[] args) {
    	/*核心*/
        new Huawei().textMethod(new Phone() {
            @Override
            public void work() {
                System.out.println("手机在运行");
            }
        });
    }
    
    public void textMethod(Phone phone) {
        phone.work();
    }
}

在上述代码核心中的 new Phone() 中,我们好像实例化了一个抽象类,但实际上,我们是通过了匿名内部类对其抽象方法进行了重写,将抽象实际化再进行了实例化,最后通过测试方法 textMethod对方法进行调用,因此输出了“手机在运行”

你可能感兴趣的:(JavaSE,java)