`
lhx1026
  • 浏览: 310108 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

《Thinking in java》——内部类小结

阅读更多

1、在一个类A中定义了一个内部类B之后,如果要在外部类中实例化这个内部类B的话,必须要有类A的引用才能够使用new实例化一个内部类。例子如下所示:

 

public class DotNew {

	public class Inner{
		
	}
	
	public static void main(String[] args){
		
		DotNew dotNew = new DotNew();
		Inner inner = dotNew.new Inner();
	}
}
 

2、如果要在内部类B中获得其外部类A的引用,可以使用外部类的类名+.this 关键字。例子如下所示:

 

public class DotThis {

	void f(){
		
		System.out.println("DotThis.f()");
	}
	
	public class Inner{
		
		public DotThis outer(){
			
			return DotThis.this;
		}
	}
	
	public Inner inner(){
		
		return new Inner();
	}
	
	public static void main(String[] args){
		
		DotThis dotThis = new DotThis();
		DotThis.Inner inner = dotThis.inner();
		inner.outer().f();
	}
}

 

3、如果一个外部类A中有内部类B,并且该内部类B是嵌套类(静态内部类),则要实例化这个内部类时,不需要引用外部类的实例。例子代码如下所示:

 

public class Parcel3 {

	static class StaticDestination{
		
		private String label;
		
		StaticDestination(String whereTo) {
			this.label = whereTo;
		}
		
		String readLabel(){
			
			return label;
		}
		
	}
	
	public static void main(String[] args){
		
		Parcel3.StaticDestination staticDestination = new Parcel3.StaticDestination("Tasmania");
	}
}

 

4、内部类可以定义在类中,也可以定义在方法中、方法的某个范围中。例子代码如下所示:

 

public class Parcel6 { 
  private void internalTracking(boolean b) { 
    if(b) { 
      class TrackingSlip { 
        private String id; 
        TrackingSlip(String s) { 
          id = s; 
        } 
        String getSlip() { return id; } 
      } 
      TrackingSlip ts = new TrackingSlip("slip"); 
      String s = ts.getSlip(); 
    } 
    // 超出内部类的定义范围,无法访问这个内部类
    //! TrackingSlip ts = new TrackingSlip("x"); 
  }  
  public void track() { internalTracking(true); } 
  public static void main(String[] args) { 
    Parcel6 p = new Parcel6(); 
    p.track(); 
  } 
} 

 

5、匿名内部类使用默认构造器,如果其基类的构造方法需要传参数,那么这个匿名内部类的构造方法也需要传参数。不传参数的话,编译器会报错。而且该匿名内部类看起来是继承或者实现了基类。例子代码如下所示:

 

public class Parcel8 {
	
	class Wrapping{
		
		private int x;
		
		public Wrapping(int x) {

			this.x = x;
		}
		
		int value(){
			return x;
		}
	}

	public Wrapping warrping(int x){
		return new Wrapping(x){

			@Override
			int value() {
				return super.value()*47;
			}
			
		};
	}
}
 

6、在匿名内部类中如果该匿名内部类中需要直接引用外部类的变量,则该变量必须是final 的。上例中因为没有直接在匿名内部类中引用x,只是构造方法传参数进去,因此x不需要是final 的。代码例子如下所示:

 

abstract class Destination{
	
	abstract String readLabel();
}

public class Parcel10 {

	public Destination destination(final String dest,final float price){
		
		return new Destination(){
			
			private int cost;
			
			{
				cost = Math.round(price);
				if(cost>100){
					System.out.println("Over budget!");
				}
			}
			
			private String label = dest;
			
			@Override
			String readLabel() {
				return label;
			}
			
		};
	}
	
	public static void main(String[] args){
		
		Parcel10 parcel10 = new Parcel10();
		parcel10.destination("Tasmania", 101.95F);
	}
}

 

7、匿名内部类有点类似于平常的继承,因为它们可以继承一个类或者实现一个接口,但是不能两者都有。如果是实现一个接口的话,只能实现一个接口。 

 

8、如果在内部类和外部类之间不需要连接的话,则可以使用嵌套类,即这个内部类是静态的(static)的。使用嵌套类意味着:

 

a、不需要使用外部类来创建一个嵌套类对象。

b、不能从嵌套类访问非静态的外部类的对象。

c、可以有静态域、静态数据。

d、嵌套类内部可以有嵌套类。

 

而普通的内部类与嵌套类相比较而言,有以下不同点:

 

a、必须通过外部类的引用来创建一个内部类的对象。

b、内部类可以访问外部类的的域、方法(静态非静态都可以)。

c、普通内部类不能定义静态域、静态方法,也不能定义嵌套类,不过可以定义常量(static final的常量)

 

9、嵌套类可以是接口的一部分。因为在接口中的所有类都默认是public和static的,所以在接口中定义嵌套类并不违反接口的规则。例子代码如下所示:

 

public interface ClassInInterface {

	void howdy();
	
	class Test implements ClassInInterface{

		@Override
		public void howdy() {
			
			System.out.println("Test.howdy()");
		}
		
		public static void main(String[] args){
			
			new Test().howdy();
		}
		
	}

}
 

 

未完待续。

分享到:
评论

相关推荐

    Thinking in Java——自己手写的代码

    "Thinking in Java——自己手写的代码"这个压缩包很可能是作者在阅读这本书的过程中,为了加深理解和实践,自己编写的代码实现。 在压缩包"Think in Java 4 code"中,我们可以预期找到与《Thinking in Java》第四版...

    Thinking in java .txt

    《Thinking in Java》专门有一章详细介绍集合框架,包括`List`、`Set`、`Map`等主要接口及其实现类。这一章被认为是本书中的亮点之一。 #### 2. 异常处理 异常处理是Java中管理程序错误的一种机制。书中详细介绍了...

    Thinking in Java 4th Edition Annotated Solutions Guide

    根据提供的文件信息,以下是对文件《Thinking in Java 4th Edition Annotated Solutions Guide》中所包含知识点的详细解释: 首先,文件标题《Thinking in Java 4th Edition Annotated Solutions Guide》指出了这是...

    Thinking in Java 自学笔记——第一章 对象导论

    Thinking in Java 自学笔记——第一章 对象导论 本章节总结了面向对象程序设计(Object-oriented Programming, OOP)的基本概念和原则,以帮助读者更好地理解 Java 编程语言。以下是对标题、描述、标签和部分内容的...

    Thinking in Java 自学笔记——第二章 一切皆对象

    ### Thinking in Java 自学笔记——第二章 一切皆对象 #### 重要概念解析 ##### 2.1 用引用操纵对象 在Java中,一切都被视为对象,这意味着无论是字符串、数字还是其他数据类型都可以被视为对象来进行操作。当...

    Thinking in java4(中文高清版)-java的'圣经'

    + 和 += 3.14 使用操作符时常犯的错误 3.15 类型转换操作符 3.15.1 截尾和舍入 3.15.2提升 3.16 Java没有“sizeof” 3.17 操作符小结 3.18 总结 第4章 控制执行流程 4.1 true和false 4.2 if-else 4.3 迭代 4.3.1 do-...

    Thinking in Java 练习题答案

    《Thinking in Java》是Bruce Eckel的经典之作,它深入浅出地介绍了Java语言的核心概念和技术。这本书的练习题是学习Java的重要组成部分,因为它们能够帮助读者巩固理论知识并提升实践能力。以下是对"Thinking in ...

    Thinking in Java 4th Edition + Annotated Solution Guide (代码)英文文字版 带书签 有答案

    - **Innerclasses**:涉及Java中的内部类,包括匿名类、成员内部类、局部内部类等。 - **Holding**:可能是关于数据存储和容器(如ArrayList、LinkedList、HashSet等)的讨论。 - **Polymorphism**:讲解Java的多...

    Thinking in Java 4 源码 导入IDEA可直接运行

    《Thinking in Java》是Bruce Eckel的经典之作,第四版(TIJ4)更是Java程序员必读的书籍之一。这本书深入浅出地介绍了Java语言的核心概念和技术,包括面向对象编程、集合框架、多线程、网络编程等众多主题。源码是...

    Thinking in Java Second Edition.doc

    总而言之,《Thinking in Java》第二版之所以备受推崇,是因为它不仅具备了一本优秀的编程书籍所需的所有特质——内容全面、结构合理、语言简洁,更重要的是它能够启迪思维,引导读者深入理解Java语言的本质,培养...

    《thinking in java》第三版完整PDF书籍+习题答案(中文版)

    《Thinking in Java》是Bruce Eckel的经典之作,被誉为学习Java编程的权威指南。该书以其深入浅出的方式,详尽地介绍了Java语言的核心概念和技术。第三版是此书的一个重要里程碑,它涵盖了Java语言的诸多关键特性,...

    Thinking In Java-Java 编程思想(中英文版 第四版)

    Thinking In Java-Java 编程思想(中英文版 第四版) Thinking In Java-Java 编程思想(中英文版 第四版)

    Thinkingin Java电子书

    《Thinking in Java》是一本备受推崇的Java编程教材,由Bruce Eckel撰写,被誉为Java学习者的必读之作。这本书深入浅出地介绍了Java语言的核心概念和技术,覆盖了从基础到高级的主题,对于有一定Java基础的读者来说...

    Thinking in Java 习题答案

    《Thinking in Java》是Bruce Eckel的经典编程教材,它深入浅出地介绍了Java语言的核心概念和技术。这本书以其详尽的解释、丰富的示例和实践性强的习题深受程序员喜爱。"Thinking in Java 习题答案"是配套的解答集,...

    thinking in java 第四版 源码

    《Thinking in Java》是Bruce Eckel的经典之作,第四版更是被广大Java开发者视为学习和进阶的重要参考书籍。这本书深入浅出地介绍了Java语言的核心概念和技术,包括面向对象编程、集合框架、多线程、网络编程、GUI...

    Thinking in java 电子书

    《Thinking in Java》是 Bruce Eckel 编著的一本经典的Java编程教材,它深受程序员喜爱,被誉为学习Java的必备参考书。这本书全面深入地探讨了Java语言的核心概念和技术,不仅适合初学者,也对有经验的程序员提供了...

    thinking in java annotated solution guide 电子书格式

    《Thinking in Java》是Bruce Eckel的经典Java编程教材,它以其深入浅出的讲解和全面系统的内容深受程序员喜爱。这本书的Annotated Solution Guide是作者为读者提供的配套解答指南,帮助读者理解和解决书中练习题,...

    Thinking In Java 源码

    《Thinking in Java》是Bruce Eckel的经典Java编程书籍,它深入浅出地讲解了Java语言的核心概念和技术。这本书不仅适合初学者,也对有经验的程序员提供了深入理解Java的宝贵资源。现在,我们有机会免费下载这本书的...

    thinking in java 源码

    《Thinking in Java》是Bruce Eckel的经典Java编程教材,它以其深入浅出的讲解和丰富的实例赢得了广大程序员的赞誉。这个源码包包含了第4版的开发源码,旨在帮助读者更好地理解书中所阐述的概念和原理。以下是基于...

Global site tag (gtag.js) - Google Analytics