关于Java内部类的一些知识

成员内部类: 
相当于类的非静态成员,可以用权限修饰符来修饰,包括private、protected、public. 
1、定义成员内部类 
class Outter { 
//非静态内部类 
class Inner { 
//内部类成员 
int i = 12; 

//外部类的普通成员 
int j = 0; 

2、外部类之内创建成员内部类对象 
语法和普通的创建对象相同,用new操作符调用相应的构造方法即可。注意的是,非静态内部类属于外部类的非静态成员,不能在静态上下文使用。 
例子: 
class Outter { 
//非静态内部类 
class Inner { 
//内部类成员 
int i = 12; 
public void innerTest() { 
System.out.println(“Inner Class Method”); 


//外部类的普通成员 
int j = 0; 
public void test() { 
Inner inner = new Inner(); 
inner.innerTest(); 


3、外部类之外创建成员内部类对象 
既然是外部类的非静态成员,就必须在外部类对象存在的情况下使用。 
基本语法是 
<外部类类名>.<内部类类名> 引用变量名称 = <外部类对象的引用>.new <内部类构造器>; 
<外部类类名>.<内部类类名> 引用变量名称 = new <外部类构造器>.new <内部类构造器>; 
(1)、创建内部类对象时对象引用必须是<外部类类名>.<内部类类名> 
(2)、调用内部类的构造方法不能直接用new 而是要用<外部类对象的引用>.new调用 
例子: 
class Outter { 
//非静态内部类 
class Inner { 
//内部类成员 
int i = 12; 
public void innerTest() { 
System.out.println(“Inner Class Method”); 


//外部类的普通成员 
int j = 0; 

class MainTest { 
public static void main(String[] args) { 
Outter outter = new Outter(); 
Outter.Inner inner = outter.new Inner(); 
inner.innerTest(); 


在外部类之外访问内部类时需要注意权限修饰符的限制,这点和类成员一样。 
3、内部类编译后生成的.class文件名称格式是<外部类类名>$<内部类类名>。

4、内部类与外部类之间的成员互相访问 
内部类可以访问外部类的任何成员,包括private成员。 
外部类访问内部类的成员需要创建内部类的对象,之后可以访问内部类的任何成员,包括private成员,需要注意的是成员内部类不可以有静态成员。 
当外部类的成员和内部类的成员重名时单单用this是区分不了的。在内部类中访问外部类的成员时可以用如下语法区分 
<外部类类名>.this.<外部类中需要被访问的成员名>;

局部内部类 
内部类定义在方法中成为局部内部类,只在局部有效。该类只为所在的方法块服务。 
局部内部类和成员内部类一样可以访问外围类的所有成员,但是不可以访问同在一个局部块的普通局部变量。如果要访问,此局部变量要被声明称final的。 
代码块结束后普通的局部变量会消亡,而创建的局部内部类对象并不会随着语句块的结束而消亡。final的局部变量的存储方式和普通的局部变量不同,其不会因为语句块的结束而消失,还会长期存在,因此可以被局部内部类访问。 
例子: 
public class InnerClassTest1 { 
public static void main(String[] args) { 
Outter outter = new Outter(); 
ForInner forInner = outter.getInner(); 
forInner.sayHello();



class Outter { 
ForInner forInner; 
public ForInner getInner() { 
class Inner implements ForInner { 
public void sayHello() { 
System.out.println("你好,我是局部内部类对象,我还存在!"); 


forInner = new Inner(); 
return forInner;

}

interface ForInner { 
void sayHello(); 

由于局部内部类只在局部有效,所以不能在外面用局部内部类的引用指向局部内部类的对象,只能用局部内部类实现接口并创建局部内部类对象,在外面用接口引用指向局部内部类对象。 
静态方法中的局部内部类只能访问外围类的静态成员,访问不了非静态成员。 
局部内部类生成的.class文件名称是<外部类类名>$<n><内部类类名>其中n是该局部的第几个内部类

静态内部类 
静态内部类的定义 
class Outter { 
static class Inner { 
/****/ 


由于静态内部类是外部类的静态成员,所以静态内部类只能访问外部类的静态成员。并且创建静态内部类的对象不依赖外部类的对象。在外部类之外创建静态内部类对象的语法如下 
<外部类类名>.<内部类类名> 引用变量名 = new <外部类类名>.<内部类构造器>; 
例子: 
class Outter { 
static class Inner { 
public void sayHello() { 
System.out.println(“成功创建静态内部类对象!”); 


public void getInner() { 
//在外部类中创建静态内部类的对象 
Inner ii = new Inner(); 
ii.sayHello(); 


public class MainTest { 
public static void main(String[] args) { 
//在外部类外创建静态内部类的对象 
Outter.Inner i = new Outter.Inner(); 
i.sayHello(); 
//在外部类中使用静态内部类的对象 
new Outter().getInner(); 


静态内部类实际上已经脱离了外部类的控制,创建对象时也不再需要外部类对象的存在,实质上只是一个放置在别的类中的普通类而已。

匿名内部类 
基于继承的匿名内部类,语法如下: 
new <匿名内部类要继承父类的对应构造器> { 
//匿名内部类类体 
}; 
基于实现接口的匿名内部类,语法如下: 
new <接口名> { 
//匿名内部类类体,实现接口中的所有方法 

匿名内部类中使用外面的变量要被声明成final的。 
匿名内部类对象初始化的代码可以写在其非静态块中 
匿名内部类生成的.class文件是<外部类类名>$<n>.class n是该类的第几个匿名内部类。

各种内部类可用的修饰符 
成员内部类 
final、abstract、public、private、protected、static 
静态内部类 
final、abstract、public、private、protected 
局部内部类 
final、abstract 
匿名内部类 
不能对匿名内部类使用修饰符

内部接口 
定义在类中的内部接口无论是否被static修饰都是静态成员。 
内部接口声明成private的意味着只能被外部类中的某个内部类来实现。 
内部接口不能扮演局部的角色,否则编译报错。因为接口的设计初衷是对外公布,让很多类实现,而局部的角色违背了接口的设计初衷。 
接口中的内部接口属于接口的成员,具有接口成员的所有属性,不能用private进行修饰。 
外部接口外实现内部接口的语法如下: 
class <类名> implements <外部接口名>.<内部接口名> { 
//类体 
}

时间: 2024-10-06 01:19:37

关于Java内部类的一些知识的相关文章

Java内部类this$0字段产生的一个bug

首先查看下面一段代码,我指出了问题代码的所在,读者先自己思考一下这段代码会有什么问题. 这是用clone方法完整拷贝一个二项堆(BinomialHeap)结构的代码.二项堆中包含一个内部类BinomialHeapEntry,这个内部类的对象即二项堆中的每一个结点,除了包含结点对应的关键字外,还记录父节点parent,下一个兄弟结点sibling和第一个孩子结点child三个指针.二项堆的根表通过每棵二项树根节点的sibling指针链接. cloneBinomialTree(BinomialHea

[转] Java内部类详解

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

Java内部类详解(一)(转自:http://blog.csdn.net/wangpeng047/article/details/12344593)

很多人对于Java内部类(Inner Class)都十分陌生,甚至听都没听过也没有使用过,内部类在Java中其实是比较重要的一块内容,掌握好这门知识对于编程来说,犹如插上一对翅膀. 一.概念 内部类是指在一个外部类的内部再定义一个类,类名不需要和文件名相同. 对于一个名为outer的外部类和其内部定义的名为inner的内部类.编译完成后会生成outer.class和outer$inner.class两个类.所以内部类的成员变量.方法名可以和外部类的相同. 内部类可以是静态static和非静态的,

Java内部类详解 2

Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就来一探究竟.下面是本文的目录大纲: 一.内部类基础 二.深入理解内部类 三.内部类的使用场景和好处 四.常见的与内部类相关的笔试面试题 若有不正之处,请多谅解并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3811

Java内部类

本文是<Java核心技术 卷1>中第六章接口与内部类中关于内部类的阅读总结. Java中的内部类(inner class)是定义在另一个类内部的类.那么内部类有什么用呢?这里主要由三个内部类存在的原因: 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据.即,如果类A中定义了类B,那么类B可以访问类A中的数据,甚至是私有数据,但类A不能访问类B中的私有数据: 内部类可以对同一个包中的其他类隐藏起来.在一个包中,定义一个类时,即使不加上访问权限关键词,这个类也是包内其他类可访问的,不

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内部类小程序(成员内部类,静态内部类,匿名内部类)

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语言的基础知识

第三章 1.在java源文件编辑器中,选择某个成员变量,然后按住shift+alt+j,Eclipse会自动添加JavaDoc文档注释结构,如果选择的是方法,还会自动添加参数名称. 2.Java语言规定标示符是由任意的字母.下划线.美元符号和数字组成,并且第一个字符不能使数字,标示符不能使java中的保留关键字. 3.在Java语言中允许使用汉字或其他语言文字作为变量名,如int 年龄 =21;在程序运行时不会报错,但建议尽量不要使用这些语言作为变量. 4.java用关键字final来声明常量,