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();
} }
}
结果 如图下图 所示:
各种情况应该都考虑到了,如果有其他情况,赶紧留言,我测试后,再继续更新本文。如果有理解错误的地方,谢谢提出。。。
Java内部类——成员内部类的更多相关文章
- java内部类:成员内部类,静态内部类方法内部类,匿名内部类(A)
package cn.kecheng; /** * 在java中,一个文件可以定义多个类,文件名必须和public 类型的类的类名保持一致.这两个类是平行关系. * 在java中,一个类也可以定义在一 ...
- Java 内部类(成员内部类、局部内部类、静态内部类,匿名内部类)
一.什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用publ ...
- 【Java入门提高篇】Day6 Java内部类——成员内部类
内部类是什么,简单来说,就是定义在类内部的类(一本正经的说着废话). 一个正经的内部类是长这样的: public class Outer { class Inner{ } } 这是为了演示而写的类,没 ...
- Java内部类小程序(成员内部类,静态内部类,匿名内部类)
/** * 测试java内部类(成员内部类,静态内部类,匿名内部类) * 局部内部类不常用,就不写了. * @package :java05 * @author shaobn * @Describe ...
- Java内部类详解
Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...
- java内部类和匿名内部类
内部类即是包含在类里面的又一个类. java内部类分为: 成员内部类.静态嵌套类.方法内部类.匿名内部类 . 内部类的共性 (1).内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.clas ...
- [转] Java内部类详解
作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置 ...
- Java内部类的使用小结
转载:http://android.blog.51cto.com/268543/384844/ Java内部类的使用小结 内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可 ...
- java 内部类(摘抄自网络)
Java内部类 1.内部类分为成员内部类.静态嵌套类.方法内部类.匿名内部类. 几种内部类的共性: A.内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类 ...
随机推荐
- java学习之tcp与udp的实现
package com.gh.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.Inp ...
- Save Princess(丑数)
Save Princess 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 Yesterday, the princess was kidnapped by a de ...
- Android中通过进程注入技术改动广播接收器的优先级
前言 这个周末又没有吊事,在家研究了怎样通过进程的注入技术改动广播接收器的优先级.关于这个应用场景是非常多的.并且也非常重要.所以就非常急的去fixed了. Android中的四大组件中有一个广播:B ...
- Java面试题之一
下面也将收集一些经典的java面试题,琢磨这些面试题还是非常有好处,可以弄清楚一些容易混淆的知识点,下面面试题的答案部分来自网络,有些来自自己的理解,都是自己精心归纳整理的,有问题的地方,希望大家指出 ...
- ThinkPHP - Widget 工具
提出问题:widget能实现什么功能? 显示右侧博文: 1.首先在Home目录下新建Widget文件夹,之后建立对应文件 2.拿最热Hot新闻来举例: 在Tpl目录下Common公共文件夹里的righ ...
- CodeForces 486C Palindrome Transformation 贪心+抽象问题本质
题目:戳我 题意:给定长度为n的字符串,给定初始光标位置p,支持4种操作,left,right移动光标指向,up,down,改变当前光标指向的字符,输出最少的操作使得字符串为回文. 分析:只关注字符串 ...
- stdcall、cdecl、fastcall、thiscall 、naked call的汇编详解
函数调用规范 当高级语言函数被编译成机器码时,有一个问题就必须解决:因为CPU没有办法知道一个函数调用需要多少个.什么样的参数.即计算机不知道怎么给这个函数传递参数,传递参数的工作必须由函数调用者 ...
- BIOS和CMOS的联系与区别
BIOS为何物? BIOS就是(Basic Input/Output System,基本输入/输出系统的缩写)在电脑中起到了最基础的而又最重要的作用.是电脑中最基础的而又最重要的程序.把这一段程序放在 ...
- 上海投行需要一大群JAVA,C++,C#,UNIX.走过路过不要错过!过完年想换工作看过来初级资深都有 - V2EX
上海投行需要一大群JAVA,C++,C#,UNIX.走过路过不要错过!过完年想换工作看过来初级资深都有 - V2EX 上海投行需要一大群JAVA,C++,C#,UNIX.走过路过不要错过!过完年想换工 ...
- hdu 4885 TIANKENG’s travel(bfs)
题目链接:hdu 4885 TIANKENG's travel 题目大意:给定N,L,表示有N个加油站,每次加满油能够移动距离L,必须走直线,可是能够为斜线.然后给出sx,sy,ex,ey,以及N个加 ...