- 浏览: 142392 次
- 性别:
- 来自: 深圳
文章分类
最新评论
Java语言基础:内部类
Java语言基础:内部类
1. 普通内部类
普通内部类的一个最简单的例子:
view plaincopy to clipboardprint?
// 外部类
class OutterClass {
// 内部类
public class InnerClass {
private int i = 0;
public int getInt(){
return i;
}
}
public void proc(){
InnerClass inClass = new InnerClass();
System.out.println(inClass.getInt());
}
}
public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
outClass.proc();
}
}
// 外部类
class OutterClass {
// 内部类
public class InnerClass {
private int i = 0;
public int getInt(){
return i;
}
}
public void proc(){
InnerClass inClass = new InnerClass();
System.out.println(inClass.getInt());
}
}
public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
outClass.proc();
}
}
外部类可以访问内部类的私有成员,内部类也可以访问外部类的私有成员:
view plaincopy to clipboardprint?
// 外部类
class OutterClass {
private int mOut = 10;
// 内部类
public class InnerClass {
private int mIn = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(mOut);
}
}
public void printInPrivate(){
InnerClass inClass = new InnerClass();
// 直接打印内部类的私有成员
System.out.println(inClass.mIn);
}
public void printOutPrivate(){
InnerClass inClass = new InnerClass();
inClass.printOutPrivate();
}
}
public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
outClass.printInPrivate();
outClass.printOutPrivate();
}
}
// 外部类
class OutterClass {
private int mOut = 10;
// 内部类
public class InnerClass {
private int mIn = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(mOut);
}
}
public void printInPrivate(){
InnerClass inClass = new InnerClass();
// 直接打印内部类的私有成员
System.out.println(inClass.mIn);
}
public void printOutPrivate(){
InnerClass inClass = new InnerClass();
inClass.printOutPrivate();
}
}
public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
outClass.printInPrivate();
outClass.printOutPrivate();
}
}
如果外部类的成员变量与内部类的成员变量名字相同,当内部类要访问外部类的该成员时,可以使用“OutClass.this.mem”来区分:
view plaincopy to clipboardprint?
// 外部类
class OutterClass {
private int mMem = 10;
// 内部类
public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(OutterClass.this.mMem);
}
}
}
// 外部类
class OutterClass {
private int mMem = 10;
// 内部类
public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(OutterClass.this.mMem);
}
}
}
要创建普通内部类,必须先创建相应的外部类:
view plaincopy to clipboardprint?
// 外部类
class OutterClass {
private int mMem = 10;
// 内部类
public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(OutterClass.this.mMem);
}
}
}
public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
OutterClass.InnerClass inClass = outClass.new InnerClass();
inClass.printOutPrivate();
}
}
// 外部类
class OutterClass {
private int mMem = 10;
// 内部类
public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(OutterClass.this.mMem);
}
}
}
public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
OutterClass.InnerClass inClass = outClass.new InnerClass();
inClass.printOutPrivate();
}
}
也可以用下面的方式:
view plaincopy to clipboardprint?
// 外部类
class OutterClass {
private int mMem = 10;
// 内部类
public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(OutterClass.this.mMem);
}
}
public InnerClass newInnerClass() {
return new InnerClass();
}
}
public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
OutterClass.InnerClass inClass = outClass.newInnerClass();
inClass.printOutPrivate();
}
}
// 外部类
class OutterClass {
private int mMem = 10;
// 内部类
public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(OutterClass.this.mMem);
}
}
public InnerClass newInnerClass() {
return new InnerClass();
}
}
public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
OutterClass.InnerClass inClass = outClass.newInnerClass();
inClass.printOutPrivate();
}
}
2. 静态内部类
普通内部类前面加上static修饰符,就成为静态内部类,静态内部类类似于C++的嵌套类,与普通内部类相比有如下区别:
静态内部类没有指向外部类的引用,外部类对于它来说更像一个名字空间。
普通内部类不能有静态成员,静态方法,或另一个静态内部类;而静态内部类可以有这一切。
静态内部类可以直接创建,不必先创建外部类:
view plaincopy to clipboardprint?
// 外部类
class OutterClass {
private int mMem = 0;
// 静态内部类
static public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 这是错误的
// System.out.println(OutterClass.this.mMem);
}
}
public void printInPrivate() {
InnerClass inClass = new InnerClass();
// 可以直接访问静态内部类的成员
System.out.println(inClass.mMem);
}
}
public class Main {
public static void main(String[] args) {
// 直接创建静态内部类
OutterClass.InnerClass inClass = new OutterClass.InnerClass();
inClass.printOutPrivate();
}
}
// 外部类
class OutterClass {
private int mMem = 0;
// 静态内部类
static public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 这是错误的
// System.out.println(OutterClass.this.mMem);
}
}
public void printInPrivate() {
InnerClass inClass = new InnerClass();
// 可以直接访问静态内部类的成员
System.out.println(inClass.mMem);
}
}
public class Main {
public static void main(String[] args) {
// 直接创建静态内部类
OutterClass.InnerClass inClass = new OutterClass.InnerClass();
inClass.printOutPrivate();
}
}
从上面描述可以看出,静态内部类与一般类没有太大区别,只不过它是放在一个类的里面,这个类相当于它的名字空间,可以防止命名冲突。
3. 局部内部类
Java可以把一个类定义在一个方法里面,甚至是一个{}块里面,它的作用域就在这个块里面:
view plaincopy to clipboardprint?
// 外部类
class OutterClass {
public void testLocalInner() {
if (true)
{
class LocalInner {
public void proc() {
System.out.println("hello");
}
}
// 可以创建使用
LocalInner localInner = new LocalInner();
localInner.proc();
}
// 错误:超出类定义的作用域
LocalInner localInner = new LocalInner();
localInner.proc();
}
}
// 外部类
class OutterClass {
public void testLocalInner() {
if (true)
{
class LocalInner {
public void proc() {
System.out.println("hello");
}
}
// 可以创建使用
LocalInner localInner = new LocalInner();
localInner.proc();
}
// 错误:超出类定义的作用域
LocalInner localInner = new LocalInner();
localInner.proc();
}
}
局部内部类的一般用途是实现某个接口,并作为这个接口传出方法被使用:
view plaincopy to clipboardprint?
// 接口
interface Talker {
public void Talk();
}
// 外部类
class OutterClass {
public Talker getTalker() {
// 现实该接口的局部内部类
class SomeTalker implements Talker {
public void Talk() {
System.out.println("hello");
}
}
// 创建类实例并作为Talker返回
SomeTalker talker = new SomeTalker();
return talker;
}
}
public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
Talker talker = outClass.getTalker();
talker.Talk();
}
}
// 接口
interface Talker {
public void Talk();
}
// 外部类
class OutterClass {
public Talker getTalker() {
// 现实该接口的局部内部类
class SomeTalker implements Talker {
public void Talk() {
System.out.println("hello");
}
}
// 创建类实例并作为Talker返回
SomeTalker talker = new SomeTalker();
return talker;
}
}
public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
Talker talker = outClass.getTalker();
talker.Talk();
}
}
4. 匿名内部类
匿名内部类的语法如下:
view plaincopy to clipboardprint?
new InterfaceName(){......}; 或 new SuperclassName(){......};
new InterfaceName(){......}; 或 new SuperclassName(){......};
它被认为是InterfaceName的实现者,或是SuperclassName的继承类,匿名内部类没有构建函数,如果SuperclassName有带参数的构造函数,必须在创建匿名内部类时带上这些参数,下面是匿名内部类最常见的使用场合:
view plaincopy to clipboardprint?
// 接口
interface Talker {
public void Talk();
}
// 外部类
class OutterClass {
public void Talk(Talker talker) {
talker.Talk();
}
}
public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
// 直接生成一个匿名内部类
outClass.Talk(new Talker(){
public void Talk() {
System.out.println("hello");
}
});
}
}
1. 普通内部类
普通内部类的一个最简单的例子:
view plaincopy to clipboardprint?
// 外部类
class OutterClass {
// 内部类
public class InnerClass {
private int i = 0;
public int getInt(){
return i;
}
}
public void proc(){
InnerClass inClass = new InnerClass();
System.out.println(inClass.getInt());
}
}
public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
outClass.proc();
}
}
// 外部类
class OutterClass {
// 内部类
public class InnerClass {
private int i = 0;
public int getInt(){
return i;
}
}
public void proc(){
InnerClass inClass = new InnerClass();
System.out.println(inClass.getInt());
}
}
public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
outClass.proc();
}
}
外部类可以访问内部类的私有成员,内部类也可以访问外部类的私有成员:
view plaincopy to clipboardprint?
// 外部类
class OutterClass {
private int mOut = 10;
// 内部类
public class InnerClass {
private int mIn = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(mOut);
}
}
public void printInPrivate(){
InnerClass inClass = new InnerClass();
// 直接打印内部类的私有成员
System.out.println(inClass.mIn);
}
public void printOutPrivate(){
InnerClass inClass = new InnerClass();
inClass.printOutPrivate();
}
}
public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
outClass.printInPrivate();
outClass.printOutPrivate();
}
}
// 外部类
class OutterClass {
private int mOut = 10;
// 内部类
public class InnerClass {
private int mIn = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(mOut);
}
}
public void printInPrivate(){
InnerClass inClass = new InnerClass();
// 直接打印内部类的私有成员
System.out.println(inClass.mIn);
}
public void printOutPrivate(){
InnerClass inClass = new InnerClass();
inClass.printOutPrivate();
}
}
public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
outClass.printInPrivate();
outClass.printOutPrivate();
}
}
如果外部类的成员变量与内部类的成员变量名字相同,当内部类要访问外部类的该成员时,可以使用“OutClass.this.mem”来区分:
view plaincopy to clipboardprint?
// 外部类
class OutterClass {
private int mMem = 10;
// 内部类
public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(OutterClass.this.mMem);
}
}
}
// 外部类
class OutterClass {
private int mMem = 10;
// 内部类
public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(OutterClass.this.mMem);
}
}
}
要创建普通内部类,必须先创建相应的外部类:
view plaincopy to clipboardprint?
// 外部类
class OutterClass {
private int mMem = 10;
// 内部类
public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(OutterClass.this.mMem);
}
}
}
public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
OutterClass.InnerClass inClass = outClass.new InnerClass();
inClass.printOutPrivate();
}
}
// 外部类
class OutterClass {
private int mMem = 10;
// 内部类
public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(OutterClass.this.mMem);
}
}
}
public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
OutterClass.InnerClass inClass = outClass.new InnerClass();
inClass.printOutPrivate();
}
}
也可以用下面的方式:
view plaincopy to clipboardprint?
// 外部类
class OutterClass {
private int mMem = 10;
// 内部类
public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(OutterClass.this.mMem);
}
}
public InnerClass newInnerClass() {
return new InnerClass();
}
}
public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
OutterClass.InnerClass inClass = outClass.newInnerClass();
inClass.printOutPrivate();
}
}
// 外部类
class OutterClass {
private int mMem = 10;
// 内部类
public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(OutterClass.this.mMem);
}
}
public InnerClass newInnerClass() {
return new InnerClass();
}
}
public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
OutterClass.InnerClass inClass = outClass.newInnerClass();
inClass.printOutPrivate();
}
}
2. 静态内部类
普通内部类前面加上static修饰符,就成为静态内部类,静态内部类类似于C++的嵌套类,与普通内部类相比有如下区别:
静态内部类没有指向外部类的引用,外部类对于它来说更像一个名字空间。
普通内部类不能有静态成员,静态方法,或另一个静态内部类;而静态内部类可以有这一切。
静态内部类可以直接创建,不必先创建外部类:
view plaincopy to clipboardprint?
// 外部类
class OutterClass {
private int mMem = 0;
// 静态内部类
static public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 这是错误的
// System.out.println(OutterClass.this.mMem);
}
}
public void printInPrivate() {
InnerClass inClass = new InnerClass();
// 可以直接访问静态内部类的成员
System.out.println(inClass.mMem);
}
}
public class Main {
public static void main(String[] args) {
// 直接创建静态内部类
OutterClass.InnerClass inClass = new OutterClass.InnerClass();
inClass.printOutPrivate();
}
}
// 外部类
class OutterClass {
private int mMem = 0;
// 静态内部类
static public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 这是错误的
// System.out.println(OutterClass.this.mMem);
}
}
public void printInPrivate() {
InnerClass inClass = new InnerClass();
// 可以直接访问静态内部类的成员
System.out.println(inClass.mMem);
}
}
public class Main {
public static void main(String[] args) {
// 直接创建静态内部类
OutterClass.InnerClass inClass = new OutterClass.InnerClass();
inClass.printOutPrivate();
}
}
从上面描述可以看出,静态内部类与一般类没有太大区别,只不过它是放在一个类的里面,这个类相当于它的名字空间,可以防止命名冲突。
3. 局部内部类
Java可以把一个类定义在一个方法里面,甚至是一个{}块里面,它的作用域就在这个块里面:
view plaincopy to clipboardprint?
// 外部类
class OutterClass {
public void testLocalInner() {
if (true)
{
class LocalInner {
public void proc() {
System.out.println("hello");
}
}
// 可以创建使用
LocalInner localInner = new LocalInner();
localInner.proc();
}
// 错误:超出类定义的作用域
LocalInner localInner = new LocalInner();
localInner.proc();
}
}
// 外部类
class OutterClass {
public void testLocalInner() {
if (true)
{
class LocalInner {
public void proc() {
System.out.println("hello");
}
}
// 可以创建使用
LocalInner localInner = new LocalInner();
localInner.proc();
}
// 错误:超出类定义的作用域
LocalInner localInner = new LocalInner();
localInner.proc();
}
}
局部内部类的一般用途是实现某个接口,并作为这个接口传出方法被使用:
view plaincopy to clipboardprint?
// 接口
interface Talker {
public void Talk();
}
// 外部类
class OutterClass {
public Talker getTalker() {
// 现实该接口的局部内部类
class SomeTalker implements Talker {
public void Talk() {
System.out.println("hello");
}
}
// 创建类实例并作为Talker返回
SomeTalker talker = new SomeTalker();
return talker;
}
}
public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
Talker talker = outClass.getTalker();
talker.Talk();
}
}
// 接口
interface Talker {
public void Talk();
}
// 外部类
class OutterClass {
public Talker getTalker() {
// 现实该接口的局部内部类
class SomeTalker implements Talker {
public void Talk() {
System.out.println("hello");
}
}
// 创建类实例并作为Talker返回
SomeTalker talker = new SomeTalker();
return talker;
}
}
public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
Talker talker = outClass.getTalker();
talker.Talk();
}
}
4. 匿名内部类
匿名内部类的语法如下:
view plaincopy to clipboardprint?
new InterfaceName(){......}; 或 new SuperclassName(){......};
new InterfaceName(){......}; 或 new SuperclassName(){......};
它被认为是InterfaceName的实现者,或是SuperclassName的继承类,匿名内部类没有构建函数,如果SuperclassName有带参数的构造函数,必须在创建匿名内部类时带上这些参数,下面是匿名内部类最常见的使用场合:
view plaincopy to clipboardprint?
// 接口
interface Talker {
public void Talk();
}
// 外部类
class OutterClass {
public void Talk(Talker talker) {
talker.Talk();
}
}
public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
// 直接生成一个匿名内部类
outClass.Talk(new Talker(){
public void Talk() {
System.out.println("hello");
}
});
}
}
相关推荐
java语言基础:内部类2.pdf
java语言基础:内部类2[整理].pdf
在移动开发中,Android操作系统广泛采用Java语言,开发者可以利用Android SDK创建丰富的手机应用。 总的来说,Java作为一门广泛应用于各领域的编程语言,其基础知识涵盖了从入门到高级的各种概念和技术,无论你是...
Java 基础第七章内部类与异常类 Java 语言支持在一个类中定义另一个类,这样的类称做内部类。内部类和外嵌类之间存在着紧密的关系:内部类可以访问外嵌类的成员变量和方法,而外嵌类也可以使用内部类声明的对象作为...
Java 内部类是 Java 语言的一个重要特性,它允许在一个类的内部定义另一个类。内部类的概念在 Java 中有着广泛的应用,特别是在处理复杂的继承问题和实现特定设计模式时。以下将详细介绍 Java 内部类的基本概念、...
"Java接口、内部类和Java_API基础" Java接口是Java语言中的一个抽象概念,它定义了一组方法的集合,但不提供实现。...这些基础类库为Java语言提供了强大的功能支持,使得Java语言能更好地满足各种编程需求。
### Java语言基础入门教程:内部类与异常处理 #### 一、内部类概述 内部类是在另一个类的内部定义的类。它具有多种类型,并且能够访问外部类的私有成员,这使得内部类在实现特定功能时非常灵活且强大。 #### 二、...
Java编程基础实验手册是针对初学者设计的一份详尽教程,旨在帮助读者掌握Java编程语言的基本概念、语法和实践技能。这份手册涵盖了从环境搭建到编写简单程序的全过程,逐步引导学习者深入理解面向对象编程的核心思想...
Java作为一门广泛应用于企业级开发、互联网应用以及大数据处理等领域的编程语言,其基础知识的掌握对于初学者和专业开发者都至关重要。"Java应用基础:网友精选25个Java试题分享"是一个集合了Java核心概念与实践操作...
"Java语言基础" Java语言基础是指Java语言的基本概念和特点。Java语言是面向对象的、简单的、安全的、多线程的、解释型的、与平台无关的编程语言。Java语言的发展经历了从C++到Java的演化过程,面向对象的概念是...
计算机后端-Java-Java核心基础-第17章 异常处理 04. 复习:内部类.avi
这份"java语言基础.zip"压缩包很可能是某内部培训机构的教学资料,旨在帮助初学者掌握Java编程的核心知识。下面,我们将深入探讨Java语言的基础内容。 1. **Java简介**: Java是一种跨平台、面向对象的编程语言,...
Java反射机制是Java语言的一个重要特性,它使得Java在运行时具有了动态性,能够获取和操作类的信息,包括类的修饰符、超类、实现的接口、字段和方法等。这种机制允许程序在运行时动态加载未知名称的类,进行字段的...
根据提供的信息,“Java语言程序设计 基础篇 第八版 带目录”这本书主要针对初学者介绍了Java编程的基础知识。尽管提供的具体内容部分只包含了下载链接,我们仍然可以根据书名、描述以及标签来推断出书中可能涵盖的...
### Java语言基础入门教程:内部类与异常处理 #### 一、内部类概述 内部类是在另一个类的内部定义的类。它具有多种类型,并且能够访问外部类的私有成员,这使得内部类在实现特定功能时非常灵活且强大。 #### 二、...
Java集合框架是Java编程...总之,这个资料包涵盖了Java集合框架和内部类的基础知识,对于想要深入理解Java编程的开发者来说,是一份宝贵的学习资源。通过学习,你可以提升在处理数据集合和实现复杂设计模式上的能力。
Java内部类是Java编程语言中的一个独特特性,它允许在一个类的定义内部定义另一个类。这种设计模式在处理复杂的对象关系、实现匿名类以及提供更好的封装性时非常有用。在这个"JAVA_12内部类"的学习资料中,我们将会...
《Java高手真经(编程基础卷):Java核心编程技术》详细讲解了Java语言基础开发中的各种技术,主要内容包括如下。Java开发入门:JDK、JVM、Eclipse、Linux。Java语法基础:类、抽象类、接口、内部类、匿名类、异常、...
《Java高手真经(编程基础卷):Java核心编程技术》详细讲解了Java语言基础开发中的各种技术,主要内容包括如下。Java开发入门:JDK、JVM、Eclipse、Linux。Java语法基础:类、抽象类、接口、内部类、匿名类、异常、...