`
willsunforjava
  • 浏览: 167861 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java内部类学习笔记

 
阅读更多

 

可以将一个类的定义放在另一个类的定义内部,这就是内部类。(摘自Thinking in Java)

 

内部类(Inner Class)与外部类的联系

 

内部类不仅仅是一种名字隐藏和组织代码的模式,它可以能访问外部类的所有成员,可而且不需要任何特殊条件。可以通过 "外部类.this" 获得外部类的引用。

 

外部类也可以通过.new的方式去创建内部类的对象。在拥有外部类对象之前是不可能创建内部类对象的,因为内部类对象会暗暗地连接到创建它的外部类对象上。

 

public class Outer {
	int attr = 1;
	class Inner{
		public void func(){
			System.out.println(Outer.this.attr);
		}
	}
	
	public static void main(String[] args) {
		Outer outer = new Outer();
		Outer.Inner inner = outer.new Inner();
		Outer.Inner inner2 = new Outer.Inner(); //这样是不行的
	}
}

 

方法和作用域中的内部类(Inner class in methods and scopes)

 

有时候你可以定义在一个方法内部或者任何作用域中定义一个内部类,通常这样做的目的有两个:

(1)内部类实现了某类型的接口,于是可以创建并返回对其的引用。

 

interface IBehavior{
	void say(String sth);
}
public class Outer {
	public IBehavior showBehavior(){
		class Dog implements IBehavior{

			@Override
			public void say(String sth) {
				System.out.println("wang!wang! " + sth);
			}
			
		}
		return new Dog();
	}
	public static void main(String[] args) {
		Outer outer = new Outer();
		IBehavior behavior = outer.showBehavior();
		behavior.say("hello");
	}
}

 (2)你要解决一个复杂的问题,想创建一个类来辅助你的解决方案,但是又不想对外暴露它。

 

public class Outer2 {
	public double calculate(double num){
		if(num > 0){
			class InnerCal{
				public double calculate(){
					//复杂的计算
					//内部方法的调用
					return 0;
				}
			}
			return new InnerCal().calculate();
		}
		return -1;
	}
}
 

匿名内部类

 

匿名内部类做法是创建一个继承自XXX类型(具体类、接口、抽象类都可以)的匿名类的对象。通过new表达式返回的引用被自动向上转型为对XXX类型的引用。

 

abstract class Animal{
	private String name;
	public Animal(String name){
		this.name = name;
	}
	abstract void say();
}
public class Outer3 {
	public Animal makeAnimal(final String name){
		return new Animal(name) {
			private int cost;
			{
				//实例初始化
				cost = 200;
			}
			@Override
			public void say() {
				System.out.println(name + " wang wang!");
			}
		};
	}
}
 

(1)如果定义一个匿名内部类,并且希望它使用一个在其外部定义的对象,那么编译器会要求其参数引用时final的。如上实例。如果你忘记了,会得到一个编译时错误消息。

(2)匿名内部类是没有命名构造器的,怎么能做些构造器的行为呢,实例初始化能够达到这种效果。如上实例。

(3)匿名内部类的限制:匿名内部类既可以扩展类,也可以实现接口,但是不能两者兼备。而且如果是实现接口,也只能实现一个接口。

 

嵌套类(Nested Class)

 

如果不需要内部类对象与其外部类对象之间有联系,那么可以讲内部类声明为static,这个类就称作嵌套类,或者静态嵌套类。嵌套类有如下特点:

(1)嵌套类对象内部没有外部类对象引用

(2)不能从嵌套类的对象中访问非静态的外围类对象。

(3)普通内部类不能有static数据或static字段,也不能包含嵌套类,但是嵌套类可以包含。

另外我们知道,正常情况下,不能再接口内部放置任何代码,但嵌套类可以作为接口的一部分。你放到接口的任何类都自动是public和static的。一般这样做的目的是,如果你想要创建某些公共的代码,使得它们可以被某个接口的所有不同实现所共有,那么使用接口内部的嵌套类会显得很方便。


为什么需要内部类

 

通过学习内部类的特性,我们可以知道每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类其实是“多重继承”的一种补充。因为内部类允许继承多个非接口类型(类和抽象类),因此对于类或抽象类只能使用内部类才能实现多重继承。

另外除了“多重继承”的特点,内部类还有一些其他特性。

(1)内部类可以有多个实例,每个实例都有自己的状态信息,并且与外围类对象的信息相互独立。

(2)创建内部类对象的时刻并不依赖与外围类对象的创建(如嵌套类的创建)。

(3)内部类不是一种“is-a”的关系,它是一个独立的实体。

 

另外我自己的一点理解是,对于一个类,它有属性和方法,有属于对象的,有属于类的(static类型)。普通内部类扩展了对象属性和方法的使用,嵌套类扩展了类的属性和方法的使用。当然有些理解狭窄,但对于内部类的学习理解有些帮助。

分享到:
评论

相关推荐

    java学习笔记markdown

    【Java学习笔记Markdown版】是针对Java初学者和进阶者的一份详尽教程,以Markdown格式编写,便于阅读和整理。Markdown是一种轻量级的标记语言,它允许用户使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML...

    JAVA JDK6学习笔记

    Java JDK6学习笔记是针对Java编程语言初学者和进阶者的一份宝贵资源,它涵盖了Java的基础语法,并通过经典且易于理解的实例进行讲解。在本文中,我们将深入探讨Java JDK6中的关键概念和特性,以帮助你更好地理解和...

    Java JDK 5.0学习笔记

    本学习笔记旨在帮助新手全面理解并掌握Java 5.0的关键知识点。 一、泛型(Generics) Java 5.0引入了泛型,它允许在定义类、接口和方法时指定类型参数,从而实现类型安全的集合。泛型消除了强制类型转换的需要,...

    Java学习笔记——良葛格

    "Java学习笔记——良葛格"是一份专为初学者设计的教程资料,由良葛格精心编写,旨在帮助读者掌握JDK5.0版本的Java基础知识。JDK(Java Development Kit)是Java开发的核心工具集,包含了编译器、调试器和运行环境等...

    Java学习笔记(必看经典).pdf

    本知识点的标题为“Java学习笔记(必看经典)”,意味着所整理的内容是针对Java初学者的一系列核心概念和原理的总结。 首先,面向对象编程是Java语言的核心,它与传统的面向过程编程有显著的不同。面向对象编程强调的...

    Java基础尚硅谷宋红康学习笔记

    内部类(包括成员内部类、局部内部类、匿名内部类)是Java特有的特性,允许在类内部定义其他类。 【Java高级】 Java高级部分涵盖了更复杂的特性和技术,包括: 1. **反射**:Java反射机制允许在运行时检查类的信息...

    Java JDK 8学习笔记 带完整书签(不是页码书签哦)

    《Java JDK 8学习笔记》是由林信良教授在2015年3月出版的一本详尽解析Java SE 8新特性的书籍,由清华大学出版社发行。这本书共计643页,内容完整且清晰,包含目录和书签,便于读者高效地查阅和学习。 在Java JDK 8...

    java学习笔记(内部类)汇集

    ### Java学习笔记——内部类详解 #### 一、引言 Java中的内部类是一个非常有用但又容易让人感到困惑的概念。内部类本质上是在另一个类的内部定义的类,它可以访问外部类的所有成员变量和方法,甚至是私有成员。...

    良葛格Java JDK 5.0学习笔记

    Java JDK 5.0是Java发展历程中的一个重要里程碑,它引入了许多新特性,极大地提升了开发效率和代码质量。..."良葛格Java JDK 5.0学习笔记"这份资料应该会详细解释这些概念,为初学者提供宝贵的参考资料。

    Java开发学习笔记

    Java开发学习笔记主要针对的是初学者,旨在帮助他们掌握Java编程的基础知识。下面将详细讲解Java开发中的核心概念和步骤。 一、Java环境变量设置 在开始Java编程之前,我们需要安装Java Development Kit (JDK)并...

    java实战经典学习笔记

    ### Java实战经典学习笔记知识点概览 #### 一、Java概述及开发环境搭建 - **Java概述** - Java是一种广泛使用的高级编程语言,由Sun Microsystems于1995年发布。 - Java的设计目标是“一次编写,到处运行”,这...

    java设计模式学习笔记

    ### Java设计模式学习笔记——外观模式(Facade Pattern) #### 概述 设计模式是软件工程领域中一种解决常见问题的可复用解决方案。在Java开发过程中,掌握设计模式能够帮助开发者更好地组织代码结构,提高代码的...

    良葛格Java JDK 5.0学习笔记ch05

    在这个"良葛格Java JDK 5.0学习笔记ch05"中,我们将深入探讨其中的关键知识点。 一、泛型 Java 5.0引入了泛型,这是一项强大的类型安全机制,允许在编译时检查类型。泛型可以应用于类、接口和方法,通过指定参数...

    java面试题 学习笔记

    Java面试题及学习笔记概述 Java作为一种广泛应用的编程语言,其面试题库广泛且深入,涵盖了从基础语法到高级特性的各个层面。本篇将基于常见的Java面试问题,结合学习笔记,深入探讨Java的核心概念和技术。 一、...

    Javajdk5学习笔记

    以下是对"Javajdk5学习笔记"中可能包含的知识点的详细解析: 1. **自动装箱与拆箱**:JDK 5引入了自动装箱和拆箱功能,使得基本类型和它们对应的包装类之间可以无缝转换,提高了代码的简洁性。例如,`Integer i = ...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《java jdk 7学习笔记》适合java的初中级读者,以及广大java应用开发人员。 作译者 林信良(网名:良葛格) 学历:台湾大学电机工程学系 经历:台湾升阳教育训练技术顾问、专业讲师,oracle授权训练中心讲师 ...

    java代码笔记2010-06-01:Java内部类 静态内部类 局部内部类 明明内部类;StringBuffer reverse的使用;

    Java内部类是Java语言中一个独特且强大的特性,它允许我们在一个类的内部定义另一个类。内部类可以分为四种类型:静态内部类、成员内部类(非静态内部类)、局部内部类和匿名内部类。 1. **静态内部类**: 静态...

    Java JDK 7学习笔记 完整扫描版

    **Java JDK 7学习笔记概述** Java JDK 7(Java Development Kit 7)是Java编程语言的一个重要版本,由Sun Microsystems(后被Oracle公司收购)开发,并于2011年7月28日正式发布。这个版本引入了一系列新特性、改进...

Global site tag (gtag.js) - Google Analytics