zoukankan      html  css  js  c++  java
  • java内部类自我总结

    内部类即是在一个类中定义的一个类。外边的类成为外部类,里面的类成为内部类。外部类前面的修饰符必须是public,内部类的修饰符可以private, public, protected,编译会产生两个类,外部类名.class,  外部类名$内部类名.class

    一 java内部类的分类和特点

    java内部类分成四种: 成员内部类, 静态内部类,局部内部类,匿名内部类。

    成员内部类

    与外部类的关系,作为外部类的一个成员存在。

    访问原则,内部类可以访问外部类的任何成员,但是外部类不能访问内部类的成员,可以通过新建内部类的对象来访问内部类的成员,包款private成员,所以,一个内部类的对象对生成它的外部类对象是完全可见的,包括private内部类、private成员与private方法,同时,内部类对象可以访问外部类对象的任何成员,因为非静态内部类对象有着指向其外部类对象的引用,创建非静态内部类对象时,一定要先创建起相应的外部类对象。

    要获得内部类实例,可以使用外部类的对象.new 内部类的方式获得内部类的实例。

    OuterClassName.InnerClassName inner=new Ouer().new Inner();

     在外部类的非static方法中,如果不是static方法,也可以通过如下方式来获得内部类的实例,但是在非外部类的其他类中,必须以上面的方式来获得内部类实例。

    InnerClassName inner=new Ouer.Inner();
    或者
    InnerClassName inner=new Inner();

    静态内部类

    静态内部类和成员内部类相比,第一,静态内部类和外部类之间只是嵌套关系,没有其指向外部的引用; 第二,静态内部类不仅可以有非static成员,也可以有static成员; 第三,在获得内部类实例的时候,只能用后面一种方式,但是在非外部类的其他类中,则只能使用如下的一种,即:

    InnerClassName inner=new Ouer.Inner();

     局部内部类

    写在一个方法中,或者一个语句块中的内部类,它的作用域仅限于该方法或者语句块。

    01.public class Goods2 {  
    02.    private void internalTracking(boolean b) {  
    03.        if (b) {  
    04.            class TrackingSlip {  
    05.                private String id;  
    06.                TrackingSlip(String s) {  
    07.                    id = s;  
    08.                }  
    09.                String getSlip() {  
    10.                    return id;  
    11.                }  
    12.            }  
    13.            TrackingSlip ts = new TrackingSlip("slip");  
    14.            String s = ts.getSlip();  
    15.        }  
    16.    }  
    17.    public void track() {  
    18.        internalTracking(true);  
    19.    }  
    20.    public static void main(String[] args) {  
    21.        Goods2 g = new Goods2();  
    22.        g.track();  
    23.    }  
    24.} 

    匿名内部类

    对于那些只适用一次,不需要对象名的场景,在swing的事件侦听中使用的比较多,比如,以下例子,只返回一个对象。

    01.public class Goods3 {  
    02.    public Contents cont() {  
    03.        return new Contents() {  
    04.            private int i = 11;  
    05.            public int value() {  
    06.                return i;  
    07.            }  
    08.        };  
    09.    }  
    10.} 

    二 java内部类的访问原则

     java内部类作为java的一个成员,和其他的成员的权限一样。

    1  外部类对内部类的访问如上文所示;

    2  和外部类同包的类,private的内部类不可见,其他类型的内部类中的private成员不可见,其他的均可以见;

    3  和外部类不同包的类,只能访问public内部类的public成员;

    4  继承外部类的类的访问,protected的内部类不可见。

    如果让不可见的成员可见,可以通过添加接口方法,比如:

    public class Out {    
    public PrivateIn getPrivateIn(){       
    return new PrivateIn();    
    }        
    
    private class PrivateIn implements InMethod{      
     private int private_arg;       
      int default_arg;      
      protected int protected_arg;       
      public int public_arg;

    详细见: http://zhangjunhd.blog.51cto.com/113473/65624

    三  java内部类的作用

    1.内部类可以很好的实现隐藏

       一般的非内部类,是不允许有 private protected权限的,但内部类可以

    2.内部类拥有外围类的所有元素的访问权限

    3.可是实现多重继承

    4.可以避免修改接口而实现同一个类中两种同名方法的调用。

    引文:

    http://zhangjunhd.blog.51cto.com/113473/65624

    http://blog.csdn.net/ilibaba/article/details/3866537

    http://andy136566.iteye.com/blog/1061951

  • 相关阅读:
    SEO优化---学会建立高转化率的网站关键词库
    从一个程序员的角度看——微信小应用
    当AngularJS POST方法碰上PHP
    angularJS(6)
    彻底解决显示Opencv中Mat图像到Mfc窗口问题
    数据结构与算法基础总结
    java类别问题
    java基础知识
    逻辑地址、线性地址、物理地址和虚拟地址的区别
    TCP协议中的三次握手和四次挥手(图解)
  • 原文地址:https://www.cnblogs.com/kangls/p/2968787.html
Copyright © 2011-2022 走看看