zoukankan      html  css  js  c++  java
  • Java中的内部类

    有些时候我们需要在一个类中快速的访问另一个类的某些属性,此时可以使用到内部类。

    class Outer
    {
        private String str1 ;
        private String str2 ;
        public Outer(String str1, String str2)
        {
            this.str1 = str1;
            this.str2 = str2;
        }
        
    
        public class Inner
        {
            public String generateNewString()
            {
                return str1 + " " + str2;
            }
        }
    
    
        public void printInfo()
        {
            String newStr = new Inner().generateNewString();
            System.out.println(newStr);
        } 
    } 
    
    
    public class  Hello
    { 
        public static void main(String[] args) 
        { 
             
            new Outer("Hello","World").printInfo();
        } 
    }

    如果我们不用内部类该如何实现呢?当然可以,只是我们需要对代码做一些大的改动。

    class Outer
    {
        private String str1 ;
        private String str2 ;
        public Outer(String str1, String str2)
        {
            this.str1 = str1;
            this.str2 = str2;
        }
    
        public String getStr1()
        {
            return this.str1;
        }
    
        public String getStr2()
        {
            return this.str2;
        }
    
        public void printInfo()
        {
            String newStr = new Inner().generateNewString(this);
            System.out.println(newStr);
        } 
    } 
    
    class Inner
    {
        public String generateNewString(Outer outer)
        {
            return outer.getStr1() + " " + outer.getStr2();
        }
    }
    
    
    public class  Hello
    { 
        public static void main(String[] args) 
        { 
             
            new Outer("Hello","World").printInfo();
        } 
    }

    可以看到,我们将Inner类移除到Outer类后,为了实现程序目的,我们必须要给Outer类增加两个getter方法,同时还要将Outer类的一个实例作为参数传递个Inner类。这样增加的程序的代码量,程序结构也比较混乱。

    现在回到第一段代码,如果我们要在main函数中声明并实例化一个Inner的实例怎么办呢?

    格式如下: Outer.Inner inner = Outer对象.new Inner();

    class Outer
    {
        private String str1 ;
        private String str2 ;
        public Outer(String str1, String str2)
        {
            this.str1 = str1;
            this.str2 = str2;
        }
        
    
        public class Inner
        {
            public String generateNewString()
            {
                return str1 + " " + str2;
            }
        }
    
    
        public void printInfo()
        {
            String newStr = new Inner().generateNewString();
            System.out.println(newStr);
        } 
    } 
    
    
    public class  Hello
    { 
        public static void main(String[] args) 
        {
            Outer.Inner inner = new Outer("hello","china").new Inner();
            String newString = inner.generateNewString();
            System.out.println(newString);
        } 
    }

    上面代码输出: hello china

    由此可以推测,Inner类实际上是Outer的一个属性。要想声明并实例化一个Inner类,就必须要有一个Outer类的实例。

    但是,如果我们不想以上面这种奇怪的方式声明Inner类,还有办法吗? 答案是有的。可以将Inner类声明为static。

    class Outer
    {
        private static String str1 ="hello";
        private static String str2 ="america";
        public Outer(String str1, String str2)
        {
            this.str1 = str1;
            this.str2 = str2;
        }
        
    
        public static class Inner
        {
            public String generateNewString()
            {
                return str1 + " " + str2;
            }
        }
    
    
        public void printInfo()
        {
            String newStr = new Inner().generateNewString();
            System.out.println(newStr);
        } 
    } 
    
    
    public class  Hello
    { 
        public static void main(String[] args) 
        {
            Outer.Inner inner = new Outer.Inner();
            System.out.println(inner.generateNewString());
        } 
    }

    以上代码输出: hello america

    注意到上面将Inner设置为static,str1和str2也为static类型了。

  • 相关阅读:
    Android 通过广播来异步更新UI
    自拉ADSL网线搭建站点server,解决动态IP、无公网IP、80port被封、HTTP被屏蔽的方法
    UVA 10494 (13.08.02)
    直线向量方程
    直线向量方程
    初等解析几何
    初等解析几何
    算法/机器学习算法工程师笔试题
    算法/机器学习算法工程师笔试题
    Python 库的使用 —— dis
  • 原文地址:https://www.cnblogs.com/kuillldan/p/5572126.html
Copyright © 2011-2022 走看看