java非静态内部类如何创建对象实例:
public class A {
public class NestA {
}
}
在A的外部创建NestA的方法如下
A a = new A();
A.NestA nestA = a.new NestA();
接下来我们通过实际的项目经历给大家讲解一下在外部创建内部非静态类实例的应用场景——单元测试。
刚刚结束一个新开发项目,项目开发中推动团队成员使用单元测试开发,其中一个同事不知道怎样给内部非静态类做单元测试。在单元测试时他也不知道如何给非静态内部类new对象实例,开始我也挺惊讶的毕竟自己很早以前就知道了,平常也不是死磕语法糖的习惯,最后从如何给非静态内部类创建对象开始指导单元测试。考虑到该同事在平常开发能力很好,可能非静态内部类创建对象确实比较偏门,所以也写一篇博客介绍一下
首先我们创建一个动物类Animal
package com.penny.javademo;
public class Animal {
private final String name;
public Animal(String name) {
this.name = name;
}
}
动物总会运动,所以我们就给动物顶一个运动接口Motion,其中有水生、有陆地、有空中的
运动接口:
// 动物的活动方式
public interface Motion {
public void action();
}
所有动物都是有对应的运动模式
// 水中活动是游泳
public class Swimming implements Motion {
@Override
public void action() {
System.out.println(name + " swimming");
}
}
// 空中活动的飞
public class Flying implements Motion {
@Override
public void action() {
System.out.println(name + " flying");
}
}
// 陆地活动的走、跑
public class Run implements Motion {
@Override
public void action() {
System.out.println(name + " walk or run");
}
}
整个类的如下:
Animal.java
package com.penny.javademo;
public class Animal {
private final String name;
public Animal(String name) {
this.name = name;
}
// 水中活动是游泳
public class Swimming implements Motion {
@Override
public void action() {
System.out.println(name + " swimming");
}
}
// 空中活动的飞
public class Flying implements Motion {
@Override
public void action() {
System.out.println(name + " flying");
}
}
// 陆地活动的走、跑
public class Run implements Motion {
@Override
public void action() {
System.out.println(name + " walk or run");
}
}
// 动物的活动方式
public interface Motion {
public void action();
}
}
测试用例AnimalTest.java
import com.penny.javademo.Animal;
import org.junit.Test;
public class AnimalTest {
@Test
public void testInnerClass() {
System.out.println("testInnerClass...");
Animal animal = new Animal("dolphin");
Animal.Swimming swimming = animal.new Swimming();
swimming.action();
}
}
测试输出结果
testInnerClass…
dolphin swimming
上面我们进行了海豚Animal实例然后在外部指定海豚的行动游泳,单独对游泳内部类进行测试。