`

内部类

阅读更多

Inner Class 这个机制是在JDK1.1版本之后才添加到java语言中的, 它的存在主要有两个目的:

  • 可以让程序设计中逻辑上相关的类结合在一起
  • Inner Class可以直接访问外部类的成员

按照Inner Class声明的位置,大致上可以把它分成两种, 一个是类成员式的,就是像属性,方法一样. 把一个类声明为另一个类的成员. 第二个方法是区域式, 也就是把类声明在一个方法之中. 由这两种方式所派生出来的,按存在的范围又分成四种级别, 第一是类级别的, 第二是对象级别的, 第三是区域变量级别,第四是匿名级别.前两个级别是属于成员式的,后两个级别是属于区域式的.

成员式内部类

Inner Class的声明方式哏一般的类没什么两样,不过以成员式来说,既然是外部类的成员,那么别的类也可以访问它,因此Inner Class 可以使用任一个访问权修饰符. 类级别的Inner Class就是加 了static这个修饰符, 让别的类在访问时可以直接通过外部类的名称来访问. 而成员级别的Inner Class 就必须无产生外部类的对象后,才能通过这个对象来访问.

public class InnerClasses {
	private static String staticAttribute = "Outter class static attribute";
	private String instantiateAttribute = "Outter class instantiate attribute";
	
	public void instantiateMethod(){
		System.out.println("Outter class instantiate method");
	}
	
	public static void staticMethod(){
		System.out.println("Outer class static method");
	}
	
	public static class StaticInnerClass{
		public StaticInnerClass(){
			System.out.println("static Inner class");
		}
		
		public void access(){
			System.out.println(staticAttribute);
			staticMethod();
		}
	}
	
	public class InstantiateInnerClass{
		public InstantiateInnerClass(){
			System.out.println("Instantiate Inner class");
		}
		
		public void access(){
			System.out.println(instantiateAttribute);
			instantiateMethod();
		}
	}
}
 
public class InnerClassExample1 {

	public static void main(String[] args) {
		InnerClasses.StaticInnerClass in = new InnerClasses.StaticInnerClass();
		in.access();
	}

}
 
public class InnerClassExample2 {

	public static void main(String[] args) {
		InnerClasses.InstantiateInnerClass in;
		InnerClasses out = new InnerClasses();
		/**
		 * 注意这里写法,因为我们现在要访问的是对象级别的Inner Class,所以必须产生外部类的对象(out)后,
		 * 再通过out对象使用new 的方式来产生InstantiateInnerClass类的对象
		 */
		in = out.new InstantiateInnerClass(); 
		in.access();
	}

}

 

public class InnerClassExample3 {

	private int att = 0;
	
	public static void main(String[] args) {
		new InnerClassExample3();
	}

	public InnerClassExample3() {
		new Inner(2);
	}
	
	public class Inner{
		private int att = 1;

		public Inner(int att) {
			System.out.println(att);
			/*
			 * 访问的是Inner类的att属性
			 */
			System.out.println(this.att); 
			
			/*
			 * 访问的是外部类的att属性. 注意这里的this的用法
			 */
			System.out.println(InnerClassExample3.this.att); 
		}
	}
}

 Inner Class还可以声明为抽象类

public class AbstractInnerClassExample extends Outter5.StaticAbstractInnerClass{

}

class Outter5{
	public static abstract class StaticAbstractInnerClass{
		
	}
	
	/**
	 * 对象级别的Inner Class只能被外部类中的其它Inner Class继承.
	 * 因为按extends语法后面接的必须是类的名称,对象级别的Inner Class没办法直接访问
	 */
	public abstract class AbstractInnerClass{
		
	}
	
	
	public class Inner extends AbstractInnerClass{
		
	}
}

 Inner class为接口

public class InnerInterfaceExample implements Outter6.StaticInnerInterface{
	
}

class Outter6{
	static interface StaticInnerInterface{
		
	}
	
	interface InnerInterface{
		
	}
	
	class InnerClass implements InnerInterface{
		
	}
}

 

区域式内部类

区域级别的变量指的是在方法中声明的变量,同样区域式的就是在方法中声明的类. 限制是如果要访问包含它的方法中的变量的话, 该变量必须是个学时,也就是说声明时要加上 "final"这个关键字. 这种类型的没有什么大用处.

public class InnerClassExample4 {

	public static void main(String[] args) {
		Outter4 out = new Outter4();
		Object obj = out.methodWithInnerClass();
		System.out.println(obj);
	}

}

class Outter4{
	
	/*
	 * 返回值只能用Object的对象类型, 因为在这个方法之外,根本无法取得Inner Class的任务信息 
	 */
	public Object methodWithInnerClass(){
		
		class Inner{
			@Override
			public String toString(){
				return "this is an Inner class in a method";
			}
		}
		
		return new Inner();
	}
}

 

匿名式内部类

这种方式经常可以在我们的代码里看到,特别是写事件程序时.

import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;


public class AnonymousInnerClassExample {

	public static void main(String[] args) {
		Frame f = new Frame("Anonymous Inner Class Example");
		f.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosed(WindowEvent e) {
				System.exit(1);
			}
		});
		
		f.setSize(200, 100);
		f.setVisible(true);
	}

}

 

总结

  • Inner class 可以访问类成员和对象成员,若要访问方法的变量,则该变量必须为final变量.
  • Inner class 可以是一个抽象类
  • Inner class 可以是一个接口
  • Inner class 可以使用任一个访问权限修饰符
  • Inner class 可以使用static修饰符(类成员)
  • Inner class 中的成员若要使用static修饰符,则该inner class必须也是static
  • Inner class 中若要使用外部类的类成员,则该inner calss必须也是static

 

1
0
分享到:
评论

相关推荐

    内部类分类及应用

    在使用匿名内部类时,要记住以下几个原则:匿名内部类不能有构造方法、匿名内部类不能是public、protected、private、static、只能创建匿名内部类的一个实例、匿名内部类不能定义任何静态成员、静态方法、一个匿名...

    内部类 匿名内部类 内部接口 对比说明

    内部类是Java编程语言中的一种特性,它允许我们在一个类的内部定义另一个类。这种设计模式在Android开发中尤其常见,因为它可以有效地管理代码和实现特定的功能。本文将详细探讨内部类、匿名内部类以及内部接口的...

    Java4Android 35_内部类和匿名内部类

    在Java编程语言中,内部类和匿名内部类是两种特殊类型的类,它们为代码的组织和功能实现提供了独特的灵活性。本教程"Java4Android 35_内部类和匿名内部类"深入探讨了这两个概念,旨在帮助开发者更好地理解和运用它们...

    java 内部类使用(内部匿名类)

    内部类分为几种类型,包括成员内部类、局部内部类、匿名内部类以及方法参数内部类。 1. **成员内部类**:成员内部类就像是外部类的一个普通成员,可以是静态或非静态的。非静态内部类拥有对外部类的引用,可以直接...

    java 匿名内部类的使用规范

    Java匿名内部类是Java语言中一个独特且强大的特性,它允许我们在不需要定义一个单独的类的情况下创建类的实例。这在处理回调、事件监听、单例模式以及其他需要短时间内定义一个简单类的情况时非常有用。本篇文章将...

    Java语法总结 - 内部类

    内部类可以分为四种:成员内部类、静态嵌套类、方法内部类和匿名内部类。 成员内部类 成员内部类是定义在外部类的成员变量中的一种内部类。它可以访问外部类的所有成员变量和方法,包括私有的变量和方法。成员内部...

    java 内部类 局部内部类 匿名类 实例代码

    本篇文章将深入探讨Java中的四种内部类:实例内部类、局部内部类、匿名类和静态内部类,并通过实例代码进行详细解析。 1. **实例内部类**:这是最常见的内部类形式,它在外部类的实例方法或成员位置定义。实例内部...

    java基础第七章内部类与异常类.doc

    Java 基础第七章内部类与异常类 Java 语言支持在一个类中定义另一个类,这样的类称做内部类。内部类和外嵌类之间存在着紧密的关系:内部类可以访问外嵌类的成员变量和方法,而外嵌类也可以使用内部类声明的对象作为...

    java内部类的讲解

    ### Java内部类详解 #### 一、内部类的分类与概念 Java的内部类机制是其强大特性之一,它允许类作为另一个类的成员存在,从而增强了代码的封装性和复用性。根据定义和作用域的不同,Java内部类主要分为四类: 1. ...

    Handler对象中使用匿名内部类或非静态内部类正确地释放消息避免内存泄漏或增加Native内存

    然而,不当使用Handler,尤其是结合匿名内部类或非静态内部类,可能导致内存泄漏和Native内存增加,这对应用性能和稳定性造成负面影响。 首先,我们要理解内存泄漏的概念。内存泄漏是指程序中已分配的内存没有被...

    内部类的分类及各自用法

    根据不同的应用场景和特性,内部类可以分为多种类型:成员内部类、局部内部类、静态内部类、匿名内部类。下面将详细介绍每种类型的内部类及其特点和使用方法。 #### 成员内部类 成员内部类(也称为非静态内部类)...

    反射私有内部类的例子

    ### 反射私有内部类的例子 #### 一、引言 在Java编程语言中,反射(Reflection)是一项强大的功能,允许程序在运行时检查和修改自身结构与行为。通过反射,可以动态地获取类的信息并操作其字段、方法以及构造器等。...

    JAVA 内部类 PPT

    Java内部类是Java语言的一个独特特性,它允许我们在一个类的内部定义另一个类。这种设计提供了更高级别的封装和组织代码的方式。以下是关于内部类及其相关知识点的详细说明: 1. **内部类基本语法** - **实例内部...

    内部类的使用

    首先,内部类分为四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。成员内部类就像其他成员变量一样,可以直接访问外部类的所有成员,包括私有成员。局部内部类只存在于某个方法内,它的作用范围更小,...

    java内部类详解

    内部类主要分为四种类型:静态内部类、成员内部类、局部内部类和匿名内部类。 1. 静态内部类(Static Inner Class) 静态内部类与普通的类类似,只是它们定义在外部类中,并且前面带有 `static` 关键字。它们不会...

    Java 深入理解嵌套类和内部类

    Java 嵌套类和内部类详解 Java 中的嵌套类和内部类是指在一个类的内部定义另一个类,这种类称为嵌套类(nested classes)。嵌套类有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,非静态嵌套类也即被称...

    Java内部类总结

    Java内部类主要包括以下几种类型:成员内部类(非静态内部类)、静态内部类(也称为静态嵌套类)、局部内部类和匿名内部类。 - **成员内部类**:这种类型的内部类是定义在外部类的一个成员位置上,它可以访问外部类...

    浅谈内部类与静态内部类的应用

    内部类可以分为四类:成员内部类、局部内部类、匿名内部类和静态内部类。在这里,我们重点关注成员内部类和静态内部类。 成员内部类,就像它的名字一样,是类的一个成员,与字段和方法处于同一级别。它可以访问外部...

    Java内部类(DOC)

    ### Java内部类(DOC)详解 #### 一、概述 Java内部类是Java语言中一个重要的概念,它指的是那些类定义被嵌套在其他类定义中的类。与之相对应的是顶层类,即那些类定义没有被嵌套在其他类中的类。内部类又可以...

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

    内部类可以分为四种类型:静态内部类、成员内部类(非静态内部类)、局部内部类和匿名内部类。 1. **静态内部类**: 静态内部类与普通的成员内部类不同,它不持有对外部类的引用。因此,可以像其他静态成员一样,...

Global site tag (gtag.js) - Google Analytics