内部类(下)匿名内部类,静态内部类的使用

简介: 内部类(下)匿名内部类,静态内部类的使用

前言

       该文将会介绍匿名内部类、静态内部类的使用,补充完毕java中的内部类。补充内容为向上转型为接口、使用this关键字获取引用、内部类的继承。

一、匿名内部类

       定义:没有名称的内部类。

       语法:

return new A(){
    //匿名内部类
    //该匿名内部类的外部类为:A
}

或者为:

ParentClass obj = new ParentClass(){
    //创建了一个以ParentClass为外部类的匿名内部类
    //实现代码
};

   注:该匿名内部类的外部类为 A。在实例化该外部类时,同时实例化了该匿名内部类。

       实例:

public class Demo3 {
  public OutInterface2 action(){
    //实例化接口OutInterface2
    return new OutInterface2() {
      /*在 return 语句中编写一个返回值为实例化的一个外部类 OutInterface2,
       *java中最常用的内部类
       创建了一个匿名内部类,由于该内部类没有名字,所以被称为"匿名"
                  */
      private int i =0;
      public int getValue() {
        return i;
            //匿名内部类的成员变量和成员方法
      }
    };  //匿名内部类{}结尾需要一个 ; 符号
  }
} 

       规则1:匿名内部类定义结束后,需要加分号 ; 加以标识,这个分号并不表示内部类的结束,而是代表匿名内部类的创建。

        规则2:匿名内部类的外部类为,return new 语句中的实例化的类。

        规则3: 匿名内部类没有名字。

二、静态内部类

 定义: 在内部类前添加  static 关键字修饰。

      语法:

class OuterClass {
    // 外部类的成员和方法
     static class StaticInnerClass {
        // 静态内部类的成员和方法
    }
}

 规则1:如果创建静态内部类的对象,不需要其外部类的对象,直接在其中声明 static成员即可。

public class Demo4 {
  static class innerClass4{
        //创建了一个静态内部类
  }
  static innerClass4 n = new innerClass4();
    //在外部类中创建了一个静态内部类的对象
}

  规则2:不能从静态内部类的对象中访问非静态外部类的对象。不可以使用外部类的非静态成员。(因为静态区不能调用非静态区)

        规则3:maain静态方法可以在静态内部类中使用。与在主方法中使用的main静态方法,实现效果一致。例如,system.out.println 语句输出内容,都会在控制台输出。

public class Demo4 {
  static class innerClass4{
        //这里是一个静态内部类
    public static void main(String[] args) {
            //静态方法中使用println
      System.out.println("我是静态内部类");
    }
  }
}

 输出结果:

       问题: 行程序测试时,如果每一个Java文件中都设置一个主方法,将出现很多额外代码,而程序本身不需要这些主方法,该怎么做呢?

       解决方法:将多个主方法写入几个静态内部类,主要作用是,方便进行调试

三、内部类的继承

       内部类的继承

               语法:class 子类 extends 外部类.内部类

class OutputInnerClass extends ClassA.ClassB{
    //OutputInnerClass 继承了ClassA的内部类ClassB
    public OutputInnerClass(ClassA a){
      a.super();
    }
    //类继承内部类必写的一个构造方法
}

          注:在某个类继承内部类时,必须硬性创建这个子类一个带参数的构造方法,并且该构造方法的参数为需要继承的内部类的外部类的引用,同时在构造方法体中通过该参数,使用 super() 方法。调用了这个外部类,才能继承其中的内部类。

               问题:匿名内部类没有名字,那么其他类该怎么继承该内部类呢?

               解决方法:定义一个实现了某个接口的匿名内部类,通过内部类覆写接口的抽象方法,然后在其他类中继承这个匿名内部类。

              实例:

interface MyInterface {
    void doSomething();
}
 class MyClass {
    MyInterface myInterface = new MyInterface() {
        public void doSomething() {
            System.out.println("Doing something in anonymous inner class.");
        }
    };
}
 class MySubClass extends MyClass {
    // 可以使用 myInterface 对象调用 doSomething 方法
}

总结

       本文简单介绍了匿名内部类、静态内部类,以及内部类的继承。补充完整了内部类的使用。如果读者对文章所提到的内容有什么疑问或补充,欢迎在评论区中评论,博主会及时进行反馈的。

相关文章
|
9月前
|
Java
Java内部类(成员内部类、静态内部类、局部内部类、局部内部类)
Java内部类(成员内部类、静态内部类、局部内部类、局部内部类)
125 3
|
NoSQL Apache
Cassandra两种登录方式cassandra-cli / csqlsh
(1)cassandra-cli cassadnra-cli命令在cassandra2.2中被抛弃,以后登录访问cassandra可以使用cqlsh [tnuser@sht-sgmhadoopdn-02 cassandra]$ cassandra-cli -h 172.
2084 0
|
2月前
|
机器学习/深度学习 数据采集 DataWorks
数据分析经典案例重现:使用DataWorks Notebook 实现Kaggle竞赛之房价预测,成为数据分析大神!
Python是目前当之无愧的数据分析第一语言,大量的数据科学家使用Python来完成各种各样的数据科学任务。本文以Kaggle竞赛中的房价预测为例,结合DataWorks Notebook,完成数据加载、数据探索、数据可视化、数据清洗、特征分析、特征处理、机器学习、回归预测等步骤,主要Python工具是Pandas和SKLearn。本文中仅仅使用了线性回归这一最基本的机器学习模型,读者可以自行尝试其他更加复杂模型,比如随机森林、支持向量机、XGBoost等。
|
9月前
|
监控 物联网 数据安全/隐私保护
以太网供电(POE):技术详解与应用探索
【4月更文挑战第22天】
541 2
|
4月前
|
缓存 JavaScript
vue2知识点:全局事件总线(GlobalEventBus)
vue2知识点:全局事件总线(GlobalEventBus)
124 2
vue2知识点:全局事件总线(GlobalEventBus)
|
4月前
|
机器学习/深度学习 人工智能 算法
AI在医疗健康领域的应用
随着人工智能技术的不断发展,其在医疗健康领域的应用也日益广泛。从辅助诊断、个性化治疗方案的制定,到疾病预防和健康管理,AI技术都在发挥着重要作用。本文将探讨AI在医疗健康领域的应用,包括其在医学影像分析、基因编辑、药物研发等方面的应用,以及其对医疗行业未来发展的影响。
|
XML Android开发 数据格式
Android - Daydream 互动屏保
Android Daydream 互动屏保 API19 API23 Create:2016-03-01 继承DreamService来实现一个自定义屏保 Dreams是当充电的设备空闲,或者插入底座时显示的互动屏保。
1680 0
|
存储 Java Linux
Android 11 system_server 读写 SDCARD
Android 11 system_server 读写 SDCARD
610 0
|
9月前
|
负载均衡 算法 网络协议
LVS、Nginx和HAProxy负载均衡器对比总结
LVS、Nginx和HAProxy负载均衡器对比总结

热门文章

最新文章