JAVA 内部类详解及实例

 更新时间:2016年11月18日 15:16:03   投稿:lqh  
这篇文章主要介绍了JAVA 内部类详解及实例的相关资料,需要的朋友可以参考下

JAVA 内部类

一、什么是内部类?

  一个类的定义放在另一个类的内部,这个类就叫做内部类

二、内部类有那些特性?

  1、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。
  2、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 。
  3、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 。

三、内部类有哪几种?

  1.成员内部类

    如:

package com.test01;

public class A {
  // 内部类 B 继承 TestPojo 和实现 TestInterface 接口
  class B extends TestPojo implements TestInterface{
    //内部类 B 自己的方法
    public void run(){
      System.out.println("我正在跑!");
    }
    //重写的接口方法
    public void testf() {
      System.out.println("实现接口!");
    }
  } 
  // 方法里面调用内部类
  public void test(){
    B b = new B() ;
    b.testf() ;    // 掉用重写接口方法
    b.run() ;     // 调用自己的方法
    b.testpojo() ;   // 调用继承父类的方法
  }
  // main 方法测试
  public static void main(String[] args) {
    A a = new A() ;
    a.test() ;
  }
}
// 定义了一个接口 ,方法为testf() 
interface TestInterface{
  public void testf() ;
}
// 定义了一个普通类 方法testpojo() 
class TestPojo{
  public void testpojo(){
    System.out.println("我是简单的pojo类");
  }
}
// 实现 调用内部类里面的方法
class Textone{
  public static void main(String[] args) {
    A.B b = new A().new B() ;  //调用类A里面的内部类B
    /** 等同于 下面代码
     *     A a = new A() ;
     *     A.B b = a.new B() ;
     * */
    b.testf() ;   // 掉用重写接口方法
    b.run() ;    // 调用自己的方法
    b.testpojo() ;  // 调用继承父类的方法
  }
}

  2、方法内部类

package com.test01;

public class PerTest {
  public void test(){     // 定义一个方法
    class Ne{        // 定义一个方法内部类
      public void fle(){  // 定义方法内部类的方法 
        System.out.println("我正在飞翔!");
      }
    } ;
    new Ne().fle() ;    //调用内部类的方法
  }
  public static void main(String[] args) {
    new PerTest().test() ;  //测试
  }
}

  注意: (1)、方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。

      (2)、方法内部类对象不能使用该内部类所在方法的非final局部变量。        

      因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,
      局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!
      例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变
      量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。 (该理解来源于百度百科)

   3、匿名内部类

      1)、抽象匿名内部类    

package com.anonymous;

public class AbstractClass {
  public void test(){        //方法为test
    TestA a = new TestA(){    //实现抽象类
      @Override
      public void run() {    //实现抽象类的方法
        System.out.println("我正在使用抽象匿名内部类");
      }
    } ;
    a.run() ;          //调用内部类的方法
  }
  public static void main(String[] args) {
    new AbstractClass().test() ;  //测试
  }
}
//定义一个抽象类 TestA 抽象方法为run()
abstract class TestA{
  public abstract void run() ;
}

    2)、接口匿名内部类

package com.anonymous;

public class TestAnonymous {
  MyInterface m = new MyInterface(){  //实现接口
    public void eat() {        //重写MyInterface 接口方法
      System.out.println("我正在吃饭!");
    }
  } ;
  public void ss(){  //方法ss
    m.eat() ;    //调用重写的方法
  }
  public static void main(String[] args) {
    new TestAnonymous().ss() ;  //测试
  }
}
//定义一个接口 方法为 eat
interface MyInterface{
  public void eat() ;
}

  注意:匿名内部 类 可以定义在方法内也可以定义在类的成员中,不管是那种匿名内部类都不能被外部类直接调用

四、内部类的作用?

  每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。

接口解决了部分问题,而内部类有效地实现了“多重继承”。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • java中HashMap.values()转为ArrayList()问题

    java中HashMap.values()转为ArrayList()问题

    这篇文章主要介绍了java中HashMap.values()转为ArrayList()问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • SpringBoot统计一个Bean中方法的调用次数的实现步骤

    SpringBoot统计一个Bean中方法的调用次数的实现步骤

    这篇文章主要给大家介绍了SpringBoot统计一个Bean中方法的调用次数的实现步骤,文中通过代码示例和图文结合的方式给大家讲解的非常详细,对大家的学习具有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • Java8新特性之lambda(动力节点Java学院整理)

    Java8新特性之lambda(动力节点Java学院整理)

    这篇文章主要介绍了Java8新特性之lambda(动力节点Java学院整理)表达式的相关知识,包括lambda语法方面的知识,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-06-06
  • Java模拟HTTP Get Post请求 轻松实现校园BBS自动回帖

    Java模拟HTTP Get Post请求 轻松实现校园BBS自动回帖

    这篇文章主要介绍了Java模拟HTTP Get Post请求,轻松实现校园BBS自动回帖,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • Mybatis批量提交实现步骤详解

    Mybatis批量提交实现步骤详解

    这篇文章主要介绍了Mybatis批量提交实现步骤详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • Java使用Maven BOM统一管理版本号的实现

    Java使用Maven BOM统一管理版本号的实现

    这篇文章主要介绍了Java使用Maven BOM统一管理版本号的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 在springboot中使用AOP进行全局日志记录

    在springboot中使用AOP进行全局日志记录

    这篇文章主要介绍就在springboot中使用AOP进行全局日志记录,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • SpringBoot下载文件遇到文件损坏等问题解决方案

    SpringBoot下载文件遇到文件损坏等问题解决方案

    调用接口下载spring boot工程的resources目录下的excel模板文件,非常常见的一个文件下载功能,但是却容易遇到很多坑,下面总结记录下
    2023-10-10
  • java实现LRU缓存淘汰算法的方法

    java实现LRU缓存淘汰算法的方法

    LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。下面看下java实现LRU缓存淘汰算法的方法,一起看看吧
    2021-11-11
  • 利用Java的Struts框架实现电子邮件发送功能

    利用Java的Struts框架实现电子邮件发送功能

    这篇文章主要介绍了利用Java的Struts框架实现电子邮件发送功能,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-12-12

最新评论