Java内部类——成员内部类

成员内部类的意思就是,一个外层类里面包含着一个非static的class,举例如下:

class OuterClass
{
        //变量,函数定义。。。

        class InnerClass
        {
                         //变量,函数定义。。。
        }
}    

关于成员内部类的各种使用情况:

1.成员内部类不能定义静态成员,原因如下:

  对于java类加载顺序我们知道,首先加载类,执行static变量初始化,接下来执行对象的创建,如果我们要执行代码中的变量i初始化,那么必须先执行加载OuterClass,再加载InnerClass,最后初始化静态变量i,问题就出在加载Innerclass上面,我们可以把InnerClass看成OuterClass的非静态成员,它的初始化必须在外部类对象创建后以后进行,要加载InnerClass必须在实例化OuterClass之后完成 ,java虚拟机要求所有的静态变量必须在对象创建之前完成,这样便产生了矛盾。也就是说,成员内部类是需要在外层类实例化之后,才能加载,其实成员内部类是属于类对象,而不是属于类,所以如果你InnerClass中如果有静态成员,则OuterClass加载的时候,也必须加载了InnerClass,而此时没有OuterClass实例对象,就不会有InnerClass。

2.当内部类和外部类具有同名成员(变量or函数,这里指的是 非静态的)时:

  如果要获取InnerClass中的变量,直接使用变量名or方法名来调用;如果要调用OuterClass的同名成员,则通过“OuterClass.this.成员”,也就是“外层类.this.成员”。

3.当外部类有某一成员(变量or函数,静态,非静态都可以),但内部类没有时:

  在InnerClass调用OuterClass的成员,直接通过变量名or函数名调用即可。

4.当外部成员为静态时(这里不考虑内部类为静态成员的情况,因为这篇文章仅涉及成员内部类的情况,且成员内部类不允许定义静态成员):

  当外部成员为静态时,InnerClass直接通过变量名or函数名调用即可。

5.外部类,无法直接操作内部类的成员。

  只能通过InnerClass的对象来调用,这里没有考虑InnerClass为静态的情况,(or没有考虑InnerClass中的静态方法,因为成员内部类不能有静态成员)。

6.外部类的private成员,在内部类中的使用规则和以上五条一致。

7.如果涉及到继承,也会将这个类继承下来

class test
{
    public static void main(String[] args)
    {
        Human h=new Human();
        Human.China hc=h.new China();

        System.out.println(hc.cStr);//将会输出China
    }
}
class Person
{
    public String pStr="Person";

    class China
    {
        public String cStr="China";
    }
}
class Human extends Person
{
      //其他属性方法
}

实例代码:

class InnerClassTest
{
    public static void main(String[] args)
    {
        OuterClass oc=new OuterClass();
        OuterClass.InnerClass ic=oc.new InnerClass();//新建一个成员内部类的对象
        OuterClass.InnerClass ic=new OuterClass().new InnerClass();//这样新建一个成员内部类的对象,只是它属于一个新建的OuterClass对象

        System.out.println(ic.GetSamVar());//调用和内部类同名的变量
        System.out.println();    

        System.out.println(ic.GetNotSameVarFromOuter());//调用外部类中没有和内部类同名的变量
        System.out.println();

        System.out.println(ic.GetStaticVar());//调用外部类的静态变量
        System.out.println();

        System.out.println(ic.CallOuterClassFunction());//调用外部类的非静态方法
        System.out.println();

        System.out.println(ic.CallOuterClassStaticFunction());//调用外部类的静态方法
        System.out.println();

        System.out.println(ic.CallOuterSameFunctionNameWithInner());//调用外部类中与内部类同名的非静态方法
        System.out.println();

        System.out.println(ic.CallOuterClassStaticFunction());//调用外部类中的静态方法
        System.out.println();
    }
}
//外部类
class OuterClass
{
    int OuterInt=123;
    String OuterString="I am OuterClass‘s String";
    String sameVar="I am the OuterClass‘s sameVar";//declare the same variable with the InnerClass.to show how to use the OuterClass and InnerClass var in the InnerClass
    static String staticVar="I am the OuterClass‘s staticVar";
    //static String staticSameVar="I am the OuterClass‘s staticSameVar";

    public String OuterClassFunction()
    {
        return "I am the OuterClass‘s function";
    }

    public static String OuterClassStaticFunction()
    {
        return "I am the OuterClass‘s Static function";
    }
  //与内部类同名的方法
    public String SameFunction()
    {
        return "I am the OuterClass‘s function which has the same name with the InnerClass";
    }
//内部类
    class InnerClass
    {
        String sameVar="I am the OuterClass‘s sameVar";
        //static String staticSameVar="I am the OuterClass‘s staticVar";
        //与外部类同名的方法
        public String SameFunction()
        {
            return "I am the InnerClass‘s function which has the same name with the OuterClass";
        }

        //与外部类同名的变量
        public String GetSamVar()//this function is to distinguish the same name variable with the OuterClass
        {
            //return sameVar;  //得到内部类的变量
            return OuterClass.this.sameVar;//get the OuterClass‘s sameVar
        }

        public String GetNotSameVarFromOuter()//Get the variable from outerclass ,and the variable is not in the innerclass
        {
            return OuterString;
        }
        public String GetStaticVar()//to show how to use the outerClass‘s static variable which not in the InnerClass
        {
            return staticVar;
        }

        public String CallOuterClassFunction()//调用外部类函数
        {
            return OuterClass.this.OuterClassFunction();
        }

        public String CallOuterClassStaticFunction()
        {
            return OuterClass.this.OuterClassStaticFunction();
            //return OuterClass.OuterClassStaticFunction();//this two kinds of call ,are ok
        }

        public String CallOuterSameFunctionNameWithInner()
        {
            return OuterClass.this.SameFunction();
        }

    }
}

结果 如图下图 所示:

各种情况应该都考虑到了,如果有其他情况,赶紧留言,我测试后,再继续更新本文。如果有理解错误的地方,谢谢提出。。。

时间: 2024-07-30 13:42:41

Java内部类——成员内部类的相关文章

Java内部类小程序(成员内部类,静态内部类,匿名内部类)

1 /** 2 * 测试java内部类(成员内部类,静态内部类,匿名内部类) 3 * 局部内部类不常用,就不写了. 4 * @package :java05 5 * @author shaobn 6 * @Describe : 7 * @Time: 2015-9-6 下午8:32:38 8 */ 9 public class TestInner { 10 11 /** 12 * @author shaobn 13 * @Describe : 14 * @param args 15 * @Time

Java内部类:成员内部类(二)

Java内部类分为4个部分进行阐述,分别为概览.成员内部类.局部内部类和匿名内部类. 在本文中是Java内部类的成员内部类,主要讲述成员内部类的访问方式和一些细节. 成员内部类 成员内部类的访问方式 非static成员内部类 static成员内部类 外部类提供一个方法创建内部类的对象 直接创建内部类的对象 成员内部类要注意的细节 1.成员内部类的访问方式 成员内部类的访问方式,也可以理解为它的创建方式,主要分为两种:第一种是由外部类提供一个方法,用来创建内部类的对象,第二种方法直接创建内部类的对

Java内部类:局部内部类(三)

Java内部类分为4个部分进行阐述,分别为概览.成员内部类.局部内部类和匿名内部类. 在本文中是Java内部类的局部内部类,主要讲局部内部类的概念和在使用局部内部的过程中,需要注意的一个细节. 1.局部内部类的概念 在一个类的方法内部定义另外一个类,那么另外一个类就称作为局部内部类. class OutterClass { void test() { class InnerClass//局部内部类 { } } } 在上述代码中,InnerClass定义在OutterClass的test方法的内部

Java内部类:匿名内部类(四)

Java内部类分为4个部分进行阐述,分别为概览.成员内部类.局部内部类和匿名内部类. 在本文中是Java内部类的匿名内部类,主要讲述匿名内部类的概念.匿名内部类的好处.匿名内部类的使用前提.和匿名内部类的应用场景. 1.匿名内部类的概念 没有类名的类就称作为匿名内部类 2.匿名内部类的好处 简化书写 3.匿名内部类的使用前提 必须存在继承或者实现关系才能使用 4.匿名内部类的应用场景 匿名内部类一般是用于实参 示例代码: package com.rk.innerclass; public cla

Java内部类的使用小结

内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可以是静态static的,也可用public,default,protected和private修饰.(而外部顶级类即类名和文件名相同的只能使用public和default). 注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类.对于一个名为outer的外部类和其内部定义的名为inner的内部类.编译完成后出现outer.class和outer$inner.class两类.所以内部类的成员变量/方法名可

java内部类和匿名内部类

内部类即是包含在类里面的又一个类. java内部类分为: 成员内部类.静态嵌套类.方法内部类.匿名内部类 . 内部类的共性 (1).内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 . (2).内部类不能用普通的方式访问.内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 . (3).内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 . 成员内部类

【转】Java 内部类种类及使用解析

Java 内部类种类及使用解析 内部类Inner Class 将相关的类组织在一起,从而降低了命名空间的混乱. 一个内部类可以定义在另一个类里,可以定义在函数里,甚至可以作为一个表达式的一部分. Java中的内部类共分为四种: 静态内部类static inner class (also called nested class) 成员内部类member inner class 局部内部类local inner class 匿名内部类anonymous inner class 静态内部类Static

[转] Java内部类详解

作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就来一探究竟.下面是本文的目录大纲: 一.内部类基础 二.

java内部类详细介绍

0.内部类与一般类有所不同,它是放在外部类的内部即可作为外部类的成员变量,也可放在方法内部作为局部变量,既然是变量,那么它可以用 private static 修饰符修饰,而外部类则不能,这也是内部类不同于一般java类的特殊之处. 1.分类:成员内部类 和 局部内部类 成员内部类: 静态成员变量: 创建方式:InnerClass inner = new OutClass.InnerClass(); 内部方法: 静态方法:只能访问外部类的静态变量: 普通方法:只能访问外部类的静态变量: 普通成员