龙空技术网

内部类Java

学霸的JAVA笔记 56

前言:

眼前朋友们对“java私有类怎么创建”大体比较注意,姐妹们都想要剖析一些“java私有类怎么创建”的相关知识。那么小编在网上网罗了一些关于“java私有类怎么创建””的相关文章,希望小伙伴们能喜欢,咱们一起来学习一下吧!

概念

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

什么时候使用内部类

一个事物内部还有一个独立的事物,内部的事物脱离外部的事物无法独立使用

比如汽车只有一个发动机,电脑只有一个CPU

内部类的分类

按定义的位置来分

1. 成员内部内,类定义在了成员位置 (类中方法外称为成员位置)

2. 局部内部类,类定义在方法内

成员内部类

成员内部类:定义在类中方法外的类。

格式

class 外部类 {

// 成员变量

// 成员方法

class 内部类 {

// 成员变量

// 成员方法

}

}

在描述事物时,若一个事物内部还包含其他事物,就可以使用内部类这种结构。比如,汽车类Car中包含发动机类Engine,这时,Engine就可以使用内部类来描述,定义在成员位置。

示例

class Car { //外部类

class Engine { //内部类

}

}

访问特点

内部类可以直接访问外部类的成员,包括私有成员。

创建内部类对象格式:

外部类名.内部类名 对象名 = new 外部类型().new 内部类型();

示例

public class Body {

public boolean live = true;

public void walk() {

System.out.println("散散步");

}

class Heart {

public void jump() {

// 直接访问外部类成员

if (live) {

System.out.println("脚离地了");

} else {

System.out.println("智商又占领高地了");

}

}

}

}

测试类

public class Test {

public static void main(String[] args) {

// 外部类名.内部类名 变量名 = new 外部类名().new 内部类名();

// 创建的是内部类对象

// Body.Heart heart = new Body().new Heart();

// heart.jump();

// 创建方式2:先创建外部类,再创建内部类

// 创建外部类对象

Body b = new Body();

// 创建内部类对象

Body.Heart heart = b.new Heart();

// 调用内部类方法

heart.jump();

// 调用外部类方法

b.live = false;

// 调用内部类方法

heart.jump();

}

}

局部内部类

局部内部类:定义在方法中的类。

格式

class 外部类名 {

数据类型 变量名;

修饰符 返回值类型 方法名(参数列表) {

// …

class 内部类 {

// 成员变量

// 成员方法

}

}

}

使用: 在定义好局部内部类后,直接就创建对象

访问特点

内部类可以直接访问外部类的成员,包括私有成员。

匿名内部类(重点)

匿名内部类:是内部类的简化写法。它的本质是一个带具体实现的父类或者父接口的匿名的子类对象。开发中,最常用到的内部类就是匿名内部类了。

之前我們使用接口时,似乎得做如下几步操作:

1. 定义子类

2. 重写接口中的方法

3. 创建子类对象

4. 调用重写后的方法

interface Swim {

public abstract void swimming();

}

// 1. 定义接口的实现类

class Student implements Swim {

// 2. 重写抽象方法

@Override

public void swimming() {

System.out.println("仰泳");

}

}

public class Test {

public static void main(String[] args) {

// 3. 创建实现类对象

Student s = new Student();

// 4. 调用方法

s.swimming();

}

}

我们的目的,最终只是为了调用方法,那么能不能简化一下,把以上四步合成一步呢?匿名内部类就是做这样的快捷方式。

匿名内部类前提

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

格式

new 父类名或者接口名(){

// 方法重写

@Override

public void method() {

// 执行语句

}

};

使用方式

示例

interface Swim {

public abstract void swimming();

}

// 1. 定义接口的实现类

class Student implements Swim {

// 2. 重写抽象方法

@Override

public void swimming() {

System.out.println("仰泳");

}

}

public class Test {

public static void main(String[] args) {

// 使用匿名内部类

new Swim() {

@Override

public void swimming() {

System.out.println("蛙泳");

}

}.swimming();

// 接口 变量 = new 实现类(); 多态,走子类的重写方法

Swim s2 = new Swim() {

@Override

public void swimming() {

System.out.println("游泳");

}

};

s2.swimming();

s2.swimming();

}

}

匿名内部类的本质

1. 定义一个没有名字的内部类

2. 这个类实现了Swim接口

3. 创建了这个没有名字的类的对象

匿名内部类的作用

简化代码

匿名内部类的使用场景

通常在方法的形式参数是接口或者抽象类时,也可以将匿名内部类作为参数传递。示例:

interface Swim {

public abstract void swimming();

}

// 1. 定义接口的实现类

class Student implements Swim {

// 2. 重写抽象方法

@Override

public void swimming() {

System.out.println("仰泳");

}

}

public class Test {

public static void main(String[] args) {

// 普通方式传入对象

// 创建实现类对象

Student s = new Student();

goSwimming(s);

// 匿名内部类使用场景:作为方法参数传递

Swim s3 = new Swim() {

@Override

public void swimming() {

System.out.println("顾泳");

}

};

// 传入匿名内部类

goSwimming(s3);

// 完美方案: 一步到位

goSwimming(new Swim() {

public void swimming() {

System.out.println("小学生, 蛙泳");

}

});

goSwimming(new Swim() {

public void swimming() {

System.out.println("中学生, 潜泳");

}

});

}

// 定义一个方法,模拟请一些人去游泳

public static void goSwimming(Swim s) {

s.swimming();

}

}

标签: #java私有类怎么创建