众所周知,外部顶级类的类名需和类文件名相同,只能使用public和default。而内部类是指在外部类的内部再定义一个类,类名不需要和文件名相同。内部类可以是静态static的,也可用public,default(包限定),protected和private修饰。
内部类:
概念:
我们所说的内部类,官方的叫法是嵌套类(Nested Classes)。嵌套类包括静态内部类(Static Nested Classes)和内部类(Inner Classes)。而内部类分为成员内部类,局部内部类(Local Classes)和匿名内部类(Anonymous Classes)。
内部类是一个编译是的概念,一旦编译成功,就会成为完全不同的两个类,分别为outer.class和outer$inner.class类。所以内部类的成员变量/方法名可以和外部类的相同。
内部类有什么作用?
1.内部类可以很好的实现隐藏
一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
2.内部类拥有外围类的所有元素的访问权限 (private修饰也能访问)
3.可是实现多重继承 (让多个内部类分别继承多个其他类,使外部类可以同时获取多个其他类的属性)
4.可以避免修改接口而实现同一个类中两种同名方法的调用。(外部类继承,让内部类实现接口)
静态内部类:
形如:
public class OuterClass { private String name; static class StaticInerCls{ private String name; } }
静态内部类除了访问权限修饰符比外围类多以外, 和外围类没有区别, 只是代码上将静态内部类组织在了外部类里面。
创建静态内部类:以Class.Iner的形式
OuterClass.StaticInerCls staticInerCls = new OuterClass.StaticInerCls();
非静态内部类:
非静态内部类能访问外部类的一切成员, 包括私有成员。外部类虽然不能直接访问内部类的成员, 但是可以通过内部类的实例访问内部类的私有成员。
成员内部类:
形如:
public class OuterCls { private String name; public String getName(){ return name; } class InerCls{ private String name; public String getName(){ return name; } } }
成员内部类可以直接使用外部类的所有成员和方法,即使是private修饰的。而外部类要访问内部类的所有成员变量和方法,内需要通过内部类的对象来获取。(谁叫它是亲儿子呢?) 要注意的是,成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己的。
创建内部类对象方法,以object.new Iner的形式:
OuterCls outerCls = new OuterCls(); OuterCls.InerCls inerCls = outerCls.new InerCls();
成员内部类不能有static修饰的成员,但是却允许定义常量。
public class OuterClass { private String name; static class StaticInerCls{ private String name; } class InerCls{ private String name; private static int id; //不允许,会报错 private static final int TYPE = 0; //允许 } }
局部内部类:
指内部类定义在方法体内,只能在该方法或条件的作用域内才能使用,退出这写作用域就无法引用。
public class OuterCls { private String name; public String getName(){ return name; } public void getInerCls(){ class InerCls{ private String name; public String getName(){ return name; } } } }
作为非静态内部类的一种特殊形式, 非静态内部类的所有限制对局部类同样成立。局部类不仅可以访问外部类的所有成员,还可以访问方法体的局部变量,但必须是final修饰的局部变量。
为什么局部类访问局部变量,变量必须加上final?
场景:
public static void main(String[] args){ Outer out = new Outer(); Object obj = out.method(); } Object method(){ int localVariable = 0; class Inner{ void println(){ System.out.println("localVariable " + localVariable); } } Object in = new Inner(); return in; } }
这里的localVariable会变红,提示需要给localVariable变量加final修饰。
解析:这是作用域的问题。在方法method执行完成后,局部变量value就失效了,而在new Inner()产生的in对象还存在obj的引用,这样对象就访问了一个不存在的变量,是不允许的。iner还存在,在外面和后续调用该局部变量时,这个局部变量可能已经失效了。但为什么加上final就可以保证能访问呢?这里Java采用了一种copy local variable的方法实现,定义为final的变量,会拷贝一份存到局部内部类中,后续使用持续维护这个对象在生命周期内,所以可以继续访问。
注:final可以修饰的范围有类,方法,属性。修饰类,该类不可以被继承;修饰方法,该方法不可以被子类重写;修饰变量,该变量值不能被修改。
匿名内部类:
为了免去给内部类命名,或者只想使用一次,就可以选择使用匿名内部类。
public void countDown(){ new Thread(){ @Override public void run() { } }.start(); }
相关推荐
本篇文章将深入探讨Java中的四种内部类:实例内部类、局部内部类、匿名类和静态内部类,并通过实例代码进行详细解析。 1. **实例内部类**:这是最常见的内部类形式,它在外部类的实例方法或成员位置定义。实例内部...
本文将深入探讨Java中的四种内部类:非静态内部类、静态内部类、局部内部类和匿名内部类。 1. 非静态内部类(也称为成员内部类) 非静态内部类是定义在外部类的成员位置的类,它可以访问外部类的所有成员,包括私有...
内部类主要分为四种类型:成员内部类、静态嵌套类、方法内部类和匿名内部类。 1. 成员内部类 成员内部类如同外部类的成员变量,它可以访问外部类的所有成员,包括私有的。成员内部类不能包含静态成员,因为它们是与...
### Java内部类解析 #### 什么是Java内部类? 在Java中,内部类是一个在其另一个类的内部声明的类。这种内部关系意味着内部类是外部类的一部分,并且可以访问外部类的所有成员,包括私有成员。这为Java提供了一种...
2. **成员内部类(Instance Inner Classes)**:成员内部类是定义在一个类内部的非静态类。它们可以访问外部类的所有成员,包括私有的。一个成员内部类的实例总是与外部类的一个实例相关联,因此,你不能在没有外部...
- **强大的功能**:内部类可以实现其他编程语言中难以实现的功能,如匿名内部类和局部内部类。 总之,Java内部类为开发者提供了更多灵活性和设计选项,是实现复杂程序结构和高级功能的重要工具。理解并熟练运用...
内部类有四种主要类型:成员内部类、静态嵌套类、方法内部类和匿名内部类。 1. 成员内部类:这类内部类就像外部类的成员,可以访问外部类的所有成员,包括私有成员。它们可以有自己的修饰符,但不能是`static`。...
内部类主要分为四种类型:成员内部类、局部内部类、静态内部类和匿名内部类。 1. **成员内部类**:作为外部类的一个成员存在,类似于外部类的属性或方法。它能够访问外部类的所有成员,包括私有的。但成员内部类...
- **静态嵌套类(静态内部类)**:如果内部类前添加了`static`关键字,它将被视为静态成员,无需外部类实例即可创建。静态内部类不能直接访问外部类的非静态成员,但可以通过外部类实例访问。 - **方法内部类**:...
内部类(Inner Classes)是定义在另一个类或接口中的类,它们主要分为四种类型:成员内部类、静态嵌套类、方法内部类和匿名内部类。这些内部类在功能上具有一定的共性,同时又各具特色,适用于不同的场景。 **共性...
本篇将深入探讨四种类型的内部类:成员内部类、局部内部类、匿名内部类和静态内部类,并通过实例来解析它们的定义、实例化和引用方式。 1. **成员内部类**: 成员内部类就像是外部类的成员,可以是私有的或具有...
- `demo8`可能是一个展示如何在类中定义和使用内部类的示例,包括成员内部类和静态内部类的用法,以及如何通过外部类对象访问内部类对象。 - `task03`可能是关于枚举类的练习,涵盖了枚举常量的定义、枚举方法的添加...
### JAVA技术专题综述之内部类篇:深入解析与应用 #### 内部类概念与类型 在JAVA中,内部类是一种特殊的类,它被定义在另一个类的内部。内部类可以访问其外部类的所有成员,包括私有成员,这是外部类无法做到的。...
匿名内部类是一种特殊的局部内部类,它没有名字,通常用于简化代码。匿名内部类主要用于实现接口或者作为参数传递给方法。 ### 关键概念解析 - **static 关键字**:static 关键字用来声明类的静态成员。静态成员...
内部类分为四种类型:静态内部类、成员内部类、局部内部类和匿名内部类。内部类可以提供更好的封装和隐藏,使得代码结构更加清晰。例如,成员内部类可以直接访问外部类的私有变量,而在需要时可以实例化,增强了代码...
根据定义的位置不同,内部类可以分为几种不同的类型:成员内部类、局部内部类、静态内部类和匿名内部类。这里我们主要讨论的是成员内部类。 #### 二、内部类的特点 1. **成员内部类**: - 成员内部类是作为外部类...
- 匿名内部类可以访问和修改final的局部变量,这是因为这些变量在匿名内部类的生命周期内不可变。 5. **匿名内部类的限制**: - 由于其匿名性,匿名内部类不能声明公共构造器。 - 匿名内部类中定义的方法数量...
锐利体验系列课程(3):局部类型、空属类型、静态类"中,我们将深入探讨C#编程语言的几个关键特性,这些特性极大地提升了代码的灵活性和效率。让我们逐一解析这些核心概念。 首先,我们要讨论的是**局部类型(Local ...
- **嵌套类和内部类**:嵌套类可以分为静态和非静态两种,非静态内部类(成员内部类)与外部类有强耦合关系,可以访问外部类的私有属性和方法。静态嵌套类(静态内部类)不依赖于外部类的实例,可以独立存在。 - ...