Java 内部类

2023-12-22 12:40:19
  1. 成员内部类

    把一个类定义成一个类似成员变量

  2. 局部内部类

    在方法中声明的类

  3. 匿名内部类

    写一个没有名字的类

  4. 静态内部类

    写法用法根成员内部类是一样的,只不过多了一个static

    调用方式比成员内部类舒服

1、成员内部类

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();
 ?  }
}

2、静态内部类

与成员内部类相比只是多了一个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(); // 方便一点
 ?  }
}

3、局部内部类

  • 局部内部类,只有在方法内才能使用,以及只有在方法运行的时候才会存在。

  • 这个限制也是他变得非常的安全,因为只有当前方法中调用

  • 随写随用,安全。

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();
 ?  }
}

2.4、匿名内部类

一定程度减小了起名字的问题。

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();
 ?  }
}

2.5、总结

内部类虽好,不要把所有类都写成内部类。因为代码复杂,括号套来套去不易调试debug。 不会也是可以的,但是到一定水平之后,想要让代码设计的更加合理可以考虑一下。

  • 用于:只是当时用一下实现接口,平时是用不上的。

文章来源:https://blog.csdn.net/qq_64468032/article/details/135150120
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。