Java是一种完全的面向对象的语言,作为对象的灵魂,类的种类是多种多样的。类大致可以分外部类和内部类两种,外部类就是我们通常使用的类,而内部类的使用要比外部类少的多,最常见的是GUI事件侦听器。内部类的应用虽然不多,但是如果能够有效的使用内部类,能达到事半功倍的效果。
内部类(Inner Classes)和嵌套类(Nested Classes)是指在一个类里面定义的另一个类。其次无论是内部类还是嵌套类,在编译时都被当作一个独立的整体。对于访问他们的其他对象来说(假如他们对这个类来说是可见的)他们的使用和我们通常用的类是一样的。
但是,内部类和嵌套类的区别在于:
1. 嵌套类是静态的,而内部类不是,也就是说嵌套类的实例化不需要外部类的实例。但是内部类是需要这个实例的。
2. 嵌套类可以任意声明静态成员,内部类不允许声明除了编译时常量以外的任何静态成员。这一限制也适用于静态初始化函数。
3. 嵌套类都是命名的,匿名的类声明不能声明运行时静态成员(不管声明是不是静态的)。
一 内部类介绍
内部类根据访问权限不同可以分为以下一种类型:普通内部类和局部内部类。
普通内部类和局部内部类主要的区别在于作用域和访问权限的不同,普通内部类可以被所有人访问(只要访问控制符允许),而局部内部类的作用域更像一个变量,只能在定义它的函数内部被使用,其他人是无法使用这个类的。而且局部类可以访问定义它的函数中的final变量。
根据声明方式不同又可以分为:命名内部类和匿名内部类
1 声明
命名类:
class OuterClass{
//Outer class deflation
class InnerNamedClass{
//Inner class definition
}
}
匿名类
class OuterClass{
//Outer class deflation
Object unnamedObject = new Object(){
//Inner class definition
}
}
2 实例化
外部或静态方法:
OuterClass outerObject = new OuterClass();
OuterClass.InnerNamedClass innerObject = outerObject.new InnerNamedClass();
内部
InnerNamedClass innerObject = new InnerNamedClass();
访问权限:
内部实例对外部实例的访问权限为:外部类定义或继承的所有字段
外部实例对内部实例的访问权限为:内部类定义或继承的所有字段
其他对象对内部实例的访问权限为:
若内部类不可见,则只能访问其超类定义的字段
若内部类可见,则可访问内部实例的非私有字段,具体情况与通常的类类似
二 局部内部类
局部内部类,是指在函数体内声明的类,这种类是局域性的,只在函数内声明后有效,他最大的特点是:可以访问定义它的函数中的final变量。
class OuterClass{
//Outer class deflation
void aMethod(){
class InnerNamedClass{
//Inner class definition
}
}
}
三 嵌套类
嵌套类(Nested Classes)其实是普通内部类的一种特殊形式,首先它的声明是静态的,这就表示了这个类不需要外部实例。也表示了他不能访问外部类的实例字段。但是相应的,嵌套类可以拥有非常量静态成员。事实上,JDK通常把嵌套类当成一个具有特殊名字的独立类。
另外,嵌套类还拥有一种特殊形式:匿名嵌套类。前面说过,匿名类都是内部类,但是匿名嵌套类是一个特例,从理论上讲,他既不属于嵌套类,也不属于内部类。匿名嵌套类 不允许拥有非常量静态成员,但是他也没有外部实例供访问。
class OuterClass{
//Outer class deflation
static class StaticInnerNamedClass{
//Inner class definition
}
}
或者
class OuterClass{
//Outer class deflation
static Object unnamedObject = new Object(){
//Inner class definition
}
}
实例化
内部
StaticInnerNamedClass staticInnerNamedObject = new StaticInnerNamedClass();
外部
OuterClass.StaticInnerNamedClass staticInnerNamedObject = new OuterClass.StaticInnerNamedClass();
分享到:
相关推荐
嵌套类主要分为两大类:静态嵌套类(Static Nested Class)和非静态嵌套类(Non-static Nested Class),后者通常被称为内部类(Inner Class)。 - **静态嵌套类**:此类嵌套类被声明为`static`,因此它们与外部类...
嵌套类主要分为两大类:**静态嵌套类**(Static Nested Class)和**内部类**(Inner Class)。这两类之间的主要区别在于它们是否可以访问外部类的实例变量。 ##### 2.1 静态嵌套类 - **定义**:被`static`关键字...
内部类分为几种类型,包括静态成员类(Static member class)、局部内部类(Local inner class)、匿名内部类(Anonymous inner class)以及嵌套接口(Nested interface)。在本讨论中,我们将主要聚焦于静态成员类...
Java中的静态内部类(Static Class),也称为嵌套静态类,是Java语言提供的一种独特机制,它允许我们在一个外部类内部定义一个静态的类。这种类的声明前面带有`static`关键字,与普通的内部类(非静态内部类)有所...
嵌套类,顾名思义,就是在类内部定义的另一个类,它可以是静态的,也可以是非静态的,根据其特性,可以分为内部类(Inner Class)和嵌套类(Nested Class)。在本文中,我们将深入探讨嵌套类的概念、分类、用法以及...
嵌套类(Nested Class)可以在一个类内部定义另一个类,这种类称为嵌套类(Nested Class)。嵌套类有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类较少使用,非静态嵌套类使用较多,也就是常说的内部类。 静态...
2. **静态嵌套类**(Static Nested Class) 3. **方法内部类**(Local Inner Class) 4. **匿名内部类**(Anonymous Inner Class) 这些内部类之间存在一些共性: - **编译后的文件格式**:内部类最终会被编译成...
第二种方法是使用 outerObject.new InnerClass(Constructor Parameters) 语法格式创建非静态内部类对象。在创建非静态内部类对象时,一定要先创建起相应的外部类对象。 非静态内部类对象的特点 非静态内部类对象...
静态嵌套类(Static Nested Classes)和内部类(Inner Classes)是嵌套类的两种主要类型。静态嵌套类是用static修饰的成员嵌套类。与成员嵌套类不同的是,静态嵌套类不能访问外部类的非static成员变量和方法。静态...
在Java编程语言中,内部类(Inner Class)或称为嵌套类(Nested Class),是一种定义在另一个类内部的类。根据不同的定义位置和作用域,Java内部类可以分为四类:成员内部类、局部内部类、匿名内部类和静态内部类。...
内部类分为四种类型:成员内部类、匿名内部类、局部内部类和静态嵌套类,每种都有其特定的使用场景和优势。通过熟练掌握内部类的使用,开发者能够更好地理解和利用Java的面向对象特性,提高代码的复用性和可维护性。
Java 嵌套类(nested classes)是指在一个类的内部定义另一个类,这种类有两种类型:静态嵌套类和非静态嵌套类。非静态嵌套类也称为内部类(inner classes)。在Java中,嵌套类从JDK1.1开始引入。 一、什么是嵌套类...
static class NestedClass {} // 静态嵌套类 ``` 2. **内部类**: - 定义:内部类是一种特殊的嵌套类,它没有`static`修饰符。 - 特性:可以直接访问外部类的所有成员,包括私有成员。 - 用途:通常用于处理...
创建静态嵌套类对象时,使用`OuterClass.StaticNestedClass inner = new OuterClass.StaticNestedClass();`。 3. 方法内部类 方法内部类定义在某个方法内部,它的生命周期与方法相同,仅在该方法内部可见。方法内部...
Java中的嵌套类和内部类是面向对象编程中一种特殊的类定义方式,允许在一个类的定义内部创建另一个类。这种特性使得代码结构更加紧凑,同时也提供了更高级别的封装和抽象。在Java中,嵌套类分为静态嵌套类和非静态...
2. **静态嵌套类**:与内部类不同,静态嵌套类(如`InnerClass.Inner`)不能直接访问外部类的非静态成员,但可以访问静态成员。它们更像普通的顶级类,只是它们被定义在另一个类内,这样可以限制它们的访问范围。 3...
`Static Nested Class` 和 `Inner Class` 在实例化和访问控制上有所不同;JSP中的动态和静态 `INCLUDE` 分别适用于不同的应用场景;而 `assert` 主要用作开发过程中的调试工具。了解并掌握这些概念对于编写高质量、...
此外,静态嵌套类可以包含静态成员和方法,而普通内部类不可以。这是因为静态嵌套类没有隐式的对外部类实例的引用: ```java class OuterClass { static class StaticNestedClass { // 静态嵌套类的代码 } } ...