尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

【从零开始学Java | 第十四篇】内部类

【从零开始学Java | 第十四篇】内部类 目录前言一、什么是内部类二、内部类的分类三、成员内部类1、成员内部类如何书写2、如何创建成员内部类的对象3、成员内部类如何获取外部类的成员变量四、静态内部类五、匿名内部类总结前言在前面的学习中我们写的类都是并列存在的但有时候我们会遇到一种特殊情况一个类只为另一个类服务完全没有必要暴露给外部世界。比如人Person和心脏Heart心脏离开人体单独存在是没有意义的。 为了解决这种问题Java 允许我们在一个类的内部定义另一个类——这就是内部类Inner Class。一、什么是内部类定义将一个类 A 定义在另一个类 B 的里面A 就叫内部类B 就叫外部类。内部类表示的事物是外部类的一部分内部类单独出现没有任何意义内部类的访问特点内部类可以直接访问外部类的成员包括私有的。外部类若要访问内部类的成员必须创建一个内部类的对象。示例1内部类可以直接方位外部类的成员包括私有。示例2外部类若要访问内部类的成员必须创建一个内部类的对象。二、内部类的分类成员内部类静态内部类局部内部类匿名内部类其中成员内部类、静态内部类、局部内部类仅仅了解即可最重要的还是匿名内部类。三、成员内部类写在成员位置的属于外部类的成员。1、成员内部类如何书写成员内部类可以被一些修饰符所修饰比如private、缺省、protected、public、static等。在成员内部类里JDK16之前不能定义静态变量 JDK16之后才可以定义静态变量。public class Car { private String carName; String carColor; int carAge; class Enginee{ String engineeName; int engineeAge; } }2、如何创建成员内部类的对象方式一在外部类中编写方法对外提供内部类的对象。方式二直接创建格式外部类名.内部类名 对象名 外部类对象.内部类对象;方式一在外部类中定义一个getInstance()方法返回一个内部类对象。public class Outer { String name; private class Inner{ } public Inner getInstance(){ return new Inner(); } }利用多态来接收public class Test { public static void main(String[] args) { // Outer.Inner oi new Outer().new Inner(); Outer o new Outer(); Object inner o.getInstance(); } }方式二public class Outer { String name; class Inner{ } }public class Test { public static void main(String[] args) { Outer.Inner oi new Outer().new Inner(); } }3、成员内部类如何获取外部类的成员变量使用Outer.this.变量名来调用外部类的成员变量。public class Outer { private int a 10; class Inner{ private int a 20; public void show(){ int a 30; System.out.println(a); System.out.println(this.a); System.out.println(Outer.this.a); } } }四、静态内部类在内部类前面加上static。它不再依赖外部类的对象就像一个独立存在的类只是恰好借住在外部类的壳子里。限制因为是静态的所以它不能访问外部类的非静态变量。实例化Outer.Inner oi new Outer.Inner();五、匿名内部类上一篇我们学了接口。如果我想用一个接口标准流程是写个类实现接口 - 重写方法 - new 这个实现类。但如果这个实现类我这辈子只用一次专门为它建个.java文件是不是太浪费了匿名内部类它允许我们在实现接口或继承父类的同时直接创建出一个没有名字的对象。匿名内部类本质上就是隐藏了名字的内部类。格式new 类名或接口名(){重写方法;};包含了实现/继承关系、方法的重写、创建对象。//Swim接口 public interface Swim { void Swimming(); } //Aminal类 public abstract class Animal { public abstract void eat(); }匿名内部类的实现public class Test { public static void main(String[] args) { new Swim(){ Override public void Swimming() { System.out.println(重写了Swim接口中的Swimming方法); } }; new Animal(){ Override public void eat() { System.out.println(重写了Animal类中的eat方法); } }; } }匿名内部类的使用主要看method()方法的调用public class Test { public static void main(String[] args) { new Swim(){ Override public void Swimming() { System.out.println(重写了Swim接口中的Swimming方法); } }; new Animal(){ Override public void eat() { System.out.println(重写了Animal类中的eat方法); } }; method( new Animal() { Override public void eat() { System.out.println(狗在吃骨头); } } ); } public static void method(Animal a){ a.eat(); } }总结内部类的优势可以无条件访问外部类的私有成员。成员内部类依赖外部类对象outer.new Inner()静态内部类不依赖new Outer.Inner()。匿名内部类可以简化代码省略哪些只用一次的接口或类。
返回列表