`
Ydoing
  • 浏览: 106008 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java内部类总结

 
阅读更多

内部类是一种编译器现象,与虚拟机无关。编译器将会把内部类翻译成用美元符号$分隔外部类名与内部类名的常规类文件,而虚拟机对此一无所知。编译器为了引用外部类,生成了一个附加的实例域this$0

为什么要用内部类?

  • 内部类可以访问所在类域中的数据(包括私有);
  • 内部类可以在同一包中被隐藏;
  • 匿名内部类在实现回调时非常方便;

特殊语法

  • OuterClass.this表示外部类对象引用,比如Employee.this.id;
  • OuterObject.new InnerClass()显式调用内部对象的构造函数,例如this.new Payroll(10000);
  • OuterClass.InnerClass其它类访问内部类;
  • OuterClass$InnerClass编译器翻译成JVM能够识别的类,内部类对JVM是透明的.

内部类表现形式

  • 简单内部类
  • 局部的内部类
  • 匿名内部类
  • 静态内部类

简单内部类

每个内部类对象都有一个指向外部对象的隐式引用outer;每次外部类对象初始化一个内部类对象时都会把自己的this引用传给内部类对象的隐式的构造函数,以下是模拟的过程:

public class Outer{
    //隐式会把this传给内部类对象的构造函数,实际这个过程看不到也不用去写.
    public void function(){
        Inner inner = new Inner(this);
        ....
    }

    public class Inner{
    //内部类有个隐式的构造函数生成外部类对象的引用,实际这个过程看不到也不用去显示调用
        private Outer outer;
        public Inner(Outer outer){
            this.outer = outer;
        }
    }
}

实例如下

public class Employee {

    // 实例化对象时,在调用构造函数之前前初始化字段;
    private int id; // 实例化对象时初始化为0
    private String name; // 实例化对象时初始化为null
    public Employee(int id, String name) {
        this.id = id;
        this.name = name;

    }

    public void start(){
        //局部的内部类
        class Computer{
            private int seq;
            public Computer(int seq){
                this.seq = seq;

        public void run(){
                System.out.println(seq + " computer is run");
            }
        }

        Computer c = new Computer(2015);    
        c.run();
    }

    //简单内部类
    public class Payroll {
        private int pay;
        //以下是模拟生成外部类对象的引用
        // private Employee outer;
        // public Payroll(Employee e) {
        // this.outer = e;
        // }

        public Payroll(int pay) {
            this.pay = pay;
        }

        // 每个内部类对象都有一个指向外部对象的隐式引用outer,可以把id和name想象成outer.id和outer.name
        public void printPay() {
            //if (id == 1) {
                if(Employee.this.id ==1){
                System.out.println("name is " + name);
                System.out.println("pay is: " + pay);
                System.out.println("----------------------------");
            } else {
                System.out.println("you can not print pay");
            }
        }
    }

    public void printPayroll() {
        //Payroll p = new Payroll(10000);
        Payroll p = this.new Payroll(10000);
        p.printPay();
    }

    public static void main(String[] args) {
        Employee e1 = new Employee(1, "a");
        Employee e2 = new Employee(2, "b");
        e1.printPayroll();
        e2.printPayroll();
        e1.start();
    }
}

局部的内部类

在外部类方法中定义的内部类称为局部内部类,局部内部类不能用修饰符(public or private)定义.只能访问局部方法作用域的final变量.

    public void start(){
        final int num = 2015;
        class Computer{
            private int seq;
            public Computer(int seq){
                this.seq = seq;
            }   

            public void run(){
                System.out.println("seq is: " + seq + ", num is: " + num);
            }
        }   

        Computer c = new Computer(2015);
        c.run();
    }

匿名内部类

语法如下,SuperType可是接口也可以是类.匿名内部类不能有构造函数.匿名内部类隐式地继承了一个父类或者实现了一个接口。

new SuperType(construction parameters)
{

inner class method and data

}

或者是
new InterfaceType()
{

inner class method and data

}

实例

new Thread() {
            //匿名内部类
            @Override
            public void run() {
                System.out.println("----------------------------");
                System.out.println("this is a anonymous class run");
            }
}.start();

静态内部类

静态内部类与其它内部类相似,不同之处在于静态内部类没有指向外部类的引用.当不需要访问外部对象时,可以考虑使用静态内部类.被编译成一个完全独立的.class文件,名称为OuterClass$InnerClass.class的形式。只可以访问外部类的静态成员和静态方法,包括了私有的静态成员和方法。 注意,声明在接口中的内部类自动成为public和static。
实例

public class StaticInner {
    private static int a = 4;

    // 静态内部类
    public static class Inner {
        public void test() {
            // 静态内部类可以访问外部类的静态成员
            // 并且它只能访问静态的
            System.out.println(a);
        }
    }

    public static void main(String[] args) {
        StaticInner.Inner inner = new StaticInner.Inner();
        inner.test();
    }
}
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    JAVA内部类总结

    ### JAVA内部类总结 在Java编程语言中,内部类(Inner Classes)是一种非常重要的特性,它允许我们在一个类的内部定义另一个类。这种结构不仅能够提高代码的组织性,还能帮助我们更好地处理类与类之间的关系。根据...

    java内部类总结(含概念和实例)

    Java 内部类总结 Java 内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用 protected 和 private 修饰(而外部类只能使用 public 和缺省的包...

    Java内部类总结,内部类的共同特征,内部类的分类等

    Java 内部类总结 Java 内部类是 Java 语言的一个重要概念,指的是在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用 protected 和 private 修饰(而...

    Java内部类总结[参考].pdf

    Java内部类总结 Java内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限...

    Java内部类总结.pdf

    总结一下,Java内部类是一种强大的工具,它增强了类的封装性和灵活性。通过内部类,开发者可以更好地组织代码,实现更复杂的逻辑,同时保持良好的代码结构。成员内部类提供了对外部类状态的访问,局部内部类提供局部...

    java内部类总结.pdf

    Java内部类是Java语言的一个独特特性,它允许一个类被定义在另一个类的内部。这种设计使得代码结构更加紧凑,同时也提供了对封装和抽象的新层次。内部类在J2EE编程中可能用得较少,但在GUI编程中尤其常见,主要用于...

    java语言内部类总结

    定义在一个类内部的类叫内部类,包含内部类的类称为外部类。内部类可以声明public、protected、private等访问限制,可以声明为abstract的供其他内部类或外部类继承与扩展,或者声明为static、final的,也可以实现...

    Java语法总结 - 内部类

    Java内部类详解 Java内部类是Java语言中的一种特殊类别,它是指定义在另外一个类内部的类。内部类可以访问外部类的所有成员变量和方法,包括私有的变量和方法。内部类可以分为四种:成员内部类、静态嵌套类、方法...

    java中的匿名内部类总结

    Java 中的匿名内部类总结 Java 中的匿名内部类是一种特殊的内部类,它没有名字,因此也称为匿名类。匿名内部类是一种简洁的编程方式,能够简化代码编写,但它也有一些限制和特点。 匿名内部类的定义 匿名内部类是...

    java内部类使用总结

    Java内部类是Java语言中一个独特且强大的特性,它允许我们在一个类的内部定义另一个类。内部类提供了增强封装的能力,使得内部类可以被隐藏在外部类中,仅对外部类可见,从而增加了代码的隐私性和安全性。同时,内部...

    java中的内部类总结

    Java 中的内部类是面向对象编程的一个重要特性,它允许在一个类的定义内部定义另一个类。内部类的主要优点是能够方便地访问外部类的私有成员,提供了更封装的代码组织方式,以及创建特定上下文的类实例。下面将详细...

    java 内部类应用

    总结,Java内部类是一种强大的工具,能够帮助我们更好地组织代码、实现复杂的逻辑和接口。但使用时也需谨慎,避免过度依赖内部类导致代码难以理解和维护。在实际项目中,应根据具体需求选择合适的设计模式。

    Java 内部类

    总结来说,Java 内部类提供了一种强大的工具,可以增强代码的封装性和灵活性。成员内部类方便访问外部类的私有成员,方法内部类常用于匿名内部类的创建,而静态内部类则允许我们不依赖外部类实例来创建对象。理解并...

    Java中的内部类总结.doc

    Java中的内部类是一种强大的特性,它允许在一个类的定义内部定义另一个类。内部类可以作为外部类的一个成员,提供了一种灵活的代码组织方式,并且能够访问外部类的私有成员,这使得内部类在处理封装和继承时具有独特...

Global site tag (gtag.js) - Google Analytics