zoukankan      html  css  js  c++  java
  • 初探JAVA内部类细节一

    定义:

    可以将一个类的定义放在另一个类的内部 这就是内部类。--摘自java编程思想

    一般实现方式:

    public class SimpleInnerClass {
    
     class Content {
    
      private int i;
    
     
    
      public int getVlaue() {
    
       return i;
    
      }
    
     
    
     }
    
     
    
     
    
     class Description {
    
     
    
      private String lable;
    
     
    
      Description(String lab) {
    
       this.lable = lab;
    
     
    
      }
    
     
    
      public String readLable() {
    
       return lable;
    
      }
    
     }
    
     
    
     
    
     public void ship(String lable) {
    
     
    
     
    
      Content content=new Content();
    
     
    
      Description description=new Description(lable);
    
     
    
      System.out.println(description.readLable());
    
     
    
     
    
     }
    
     
    
     public static void main(String[] args) {
    
     
    
      Parcle2 parcle2 = new Parcle2();
    
      parcle2.ship("hi");
    
     }
    
    }
    View Code

      上面的事例是最普通不过的内部类表达的例子,通过创建内部类对象的引用访问内部类方法

    但一般有更通用的做法,通常是在外围类创建一个方法关联内部类的引用;通过这种方式来建立彼此之间的联系。以代码为例:

    public class InnerClass {
    
        class Content {
            private int i;
    
            public int getVlaue() {
                return i;
            }
    
        }
    
    
        class Description {
    
            private String lable;
    
            Description(String lab) {
                this.lable = lab;
    
            }
    
            public String readLable() {
                return lable;
            }
        }
    
        public Content getContentInstance() {
    
            return new Content();
        }
    
        public Description getDescriptionIntance(String lable) {
    
            return new Description(lable);
        }
    
        public void ship(String lable) {
    
            Content content = getContentInstance();
    
            Description description = getDescriptionIntance(lable);
    
            System.out.println(description.readLable());
            
            
            System.out.println(description.readLable());
            
            
        }
    
        public static void main(String[] args) {
    
            InnerClass parcle2 = new InnerClass();
            parcle2.ship("hi");
            InnerClass.Content c = parcle2.getContentInstance();// 如果想在外部类的非静态方法之外的任意位置访问某个内部类的对象,那么必须通过OutClass.xx
    
            InnerClass.Description d = parcle2.getDescriptionIntance("hello");
        }
    
    
    }
    View Code

    有了联系之后内部类就可以访问外围类的所有元素,无论是private类型也可以。

    以下代码即是佐证:

    public interface Selector {
    
        boolean end();
    
        Object current();
    
        void next();
    
    
    }
    public class Sequence {
    
        private Object[] items;
        private int next = 0;
    
        public Sequence(int size) {
    
            items = new Object[size];
        }
    
        public void add(Object object) {
            if (next < items.length) {
                items[next++] = object;
            }
        }
    
    
         class SequenceSelector implements Selector {
    
            private int i = 0;
    
            @Override
            public boolean end() {
                // TODO Auto-generated method stub
                return i == items.length;
            }
    
            @Override
            public Object current() {
                // TODO Auto-generated method stub
                return items[i];
            }
    
            @Override
            public void next() {
                if (i < items.length) {
                    i++;
                }
    
            }
        }
    
        /**
         * 内部类对象只有与外围类对象相关联时才能被创建<p>
         * 构建内部类对象时,需要指向一个其外围类对象的引用;如果编译器访问不到这个引用就会报错
         * @return
         */
        public Selector selector() {
    
            return new SequenceSelector();
        }
    
        public static void main(String[] args) {
            Sequence sequence = new Sequence(5);
            for (int i = 0; i < 5; i++) {
                sequence.add(i);
            }
    //        Sequence.SequenceSelector c=sequence.selector();
            Selector selector = sequence.selector();
            while (!selector.end()) {
                System.out.println(selector.current());
                selector.next();
            }
    
    
        }
    
    }
    View Code

     在此,比较初始化的内部类细节介绍完毕,下一章笔者在继续介绍更深一层次的内部类细节

  • 相关阅读:
    Roce ofed 环境搭建与测试
    Ubuntu 1804 搭建NFS服务器
    Redhat 8.0.0 安装与网络配置
    Centos 8.1 安装与网络配置
    SUSE 15.1 系统安装
    VSpare ESXi 7.0 基本使用(模板、iso、SRIOV)
    VSpare ESXi 7.0 服务器安装
    open SUSE leap 15.1 安装图解
    KVM虚拟机网卡连接网桥
    GitHub Action一键部署配置,值得拥有
  • 原文地址:https://www.cnblogs.com/zhangfengshi/p/9385808.html
Copyright © 2011-2022 走看看