成员内部类
把一个类定义成一个类似成员变量
局部内部类
在方法中声明的类
匿名内部类
写一个没有名字的类
静态内部类
写法用法根成员内部类是一样的,只不过多了一个static
调用方式比成员内部类舒服
public class Person {
? ?class Dog{ // 内部创建的类
? ? ? ?public void eat() { // 正常创建方法
? ? ? ? ? ?System.out.println("狗在吃东西");
? ? ? }
? }
? ?int age;
? ?String name;
? ?public void play() { // 内部类在内部被调用的时候,跟正常对象的使用是一样的
? ? ? ?Dog dog = new Dog();
? ? ? ?dog.eat();
? }
}
public class Test {
? ?public static void main(String[] args) {
? ? ? ?Person p = new Person();
? ? ? ?p.play();
? ? ? ?Person.Dog d = p.new Dog(); // 在外部调用某类的内部类则比较麻烦
? ? ? ?d.eat();
? }
}
与成员内部类相比只是多了一个static. 调用上只有在外部调用内部类的时候方便一点。
public class Person {
? ?static class Dog{
? ? ? ?public void eat() {
? ? ? ? ? ?System.out.println("狗在吃东西");
? ? ? }
? }
? ?int age;
? ?String name;
? ?public void play() {
? ? ? ?Dog dog = new Dog(); // 内部调用没有区别
? ? ? ?dog.eat();
? }
}
public class Test {
? ?public static void main(String[] args) {
? ? ? ?Person p = new Person();
? ? ? ?p.play();
? ? ? ?Person.Dog d = new Person.Dog(); // 方便一点
? }
}
局部内部类,只有在方法内才能使用,以及只有在方法运行的时候才会存在。
这个限制也是他变得非常的安全,因为只有当前方法中调用
随写随用,安全。
public class Person {
? ?public void makeChild() {
? ? ? ?System.out.println("嘿嘿嘿");
? ? ? ?// 局部内部类
? ? ? ?class Child {
? ? ? ? ? ?public void play(){
? ? ? ? ? ? ? ?System.out.println("小孩儿喜欢玩游戏");
? ? ? ? ? }
? ? ? }
? ? ? ?Child child = new Child();
? ? ? ?child.play();
? }
? ?public void makeChilds(){
? ? ? ?class MyThread extends Thread { // 变成局部内部类之后只有该方法内可以使用这个线程,不被别人打扰
? ? ? ? ? ?@Override
? ? ? ? ? ?public void run() {
? ? ? ? ? ? ? ?while (true){
? ? ? ? ? ? ? ? ? ?System.out.println("嘿嘿嘿");
? ? ? ? ? ? ? ? ? ?try {
? ? ? ? ? ? ? ? ? ? ? ?Thread.sleep(1000);
? ? ? ? ? ? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? ? ? ? ? ? ?throw new RuntimeException(e);
? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? }
? ? ? ? ? }
? ? ? }
? ? ? ?new MyThread().start();
? }
}
public class Test {
? ?public static void main(String[] args) {
? ? ? ?Person p = new Person();
? ? ? ?p.makeChild();
? ? ? ?p.makeChilds();
? }
}
一定程度减小了起名字的问题。
public class Person {
? ?public void makeChild() {
// ? ? ? Thread t = new Thread() { // 接口是不能new的,这里new的是接口的实现类。
// ? ? ? ? ? @Override
// ? ? ? ? ? public void run() {
// ? ? ? ? ? ? ? while(true) {
// ? ? ? ? ? ? ? ? ? System.out.println("哈哈哈");
// ? ? ? ? ? ? ? ? ? try {
// ? ? ? ? ? ? ? ? ? ? ? Thread.sleep(1000);
// ? ? ? ? ? ? ? ? ? } catch (InterruptedException e) {
// ? ? ? ? ? ? ? ? ? ? ? throw new RuntimeException(e);
// ? ? ? ? ? ? ? ? ? }
// ? ? ? ? ? ? ? }
// ? ? ? ? ? }
// ? ? ? };
// ? ? ? t.start();
? ? ? ?new Thread() { // 接口是不能new的,这里new的是接口的实现类。
? ? ? ? ? ?@Override
? ? ? ? ? ?public void run() {
? ? ? ? ? ? ? ?while (true) {
? ? ? ? ? ? ? ? ? ?System.out.println("哈哈哈");
? ? ? ? ? ? ? ? ? ?try {
? ? ? ? ? ? ? ? ? ? ? ?Thread.sleep(1000);
? ? ? ? ? ? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? ? ? ? ? ? ?throw new RuntimeException(e);
? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? }
? ? ? ? ? }
? ? ? }.start();
? }
}
public class Test {
? ?public static void main(String[] args) {
? ? ? ?Person p = new Person();
? ? ? ?p.makeChild();
? }
}
内部类虽好,不要把所有类都写成内部类。因为代码复杂,括号套来套去不易调试debug。 不会也是可以的,但是到一定水平之后,想要让代码设计的更加合理可以考虑一下。
用于:只是当时用一下实现接口,平时是用不上的。