7.11. 内部类
(注:所有使用内部类的地方都可以不用内部类,但使用内部类可以使程序更加的简洁,便于命名规范和划分层次结构)。
内部类是指在一个外部类的内部再定义一个类。
*内部类可为静态,可用PROTECTED和PRIVATE修饰。(而外部类不可以:顶级类只能使用PUBLIC和DEFAULT)。
*JAVA文件中没有publie class 可以类名和文件不同名。
7.11.1. 内部类的分类
成员内部类、
局部内部类、
静态内部类、
匿名内部类(图形是要用到,必须掌握)。
7.11.2. 成员内部类
作为外部类的一个成员存在,与外部类的属性、方法并列。
内部类和外部类的实例变量可以共存。
在内部类中访问实例变量:this.属性
在内部类访问外部类的实例变量:外部类名.this.属性。
在外部类的外部访问内部类,使用out.inner.
成员内部类的特点:
1.内部类作为外部类的成员,可以访问外部类的私有成员或属性。(即使将外部类声明为PRIVATE,但是对于处于其内部的内部类还是可见的。)
2.用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的private还要小的访问权限。
注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。
对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。
3.成员内部类不能有静态属性
建立内部类对象时应注意:
在外部类的内部可以直接使用inner s=new inner();(因为外部类知道inner是哪个类,所以可以生成对象。)
而在外部类的外部,要生成(new)一个内部类对象,需要首先建立一个外部类对象(外部类可用),然后在生成一个内部类对象。
Outer o=new Outer();
Outer.Inner in=o.new.Inner()。
7.11.3. 局部内部类
在方法中定义的内部类称为局部内部类。
与局部变量类似,在局部内部类前不加修饰符public和private,其范围为定义它的代码块。
注意:
局部内部类不仅可以访问外部类实例变量,但可以访问外部类的局部常量
在类外不可直接访问局部内部类(保证局部内部类对外是不可见的)。
在方法中才能调用其局部内部类。
7.11.4. 静态内部类
(注意:前三种内部类与变量类似,所以可以对照参考变量)
静态内部类定义在类中,任何方法外,用static定义。
静态内部类只能访问外部类的静态成员。
生成(new)一个静态内部类不需要外部类成员:这是静态内部类和成员内部类的区别。静态内部类的对象可以直接生成:
Outer.Inner in=new Outer.Inner();
而不需要通过生成外部类对象来生成。这样实际上使静态内部类成为了一个顶级类。静态内部类不可用private来进行定义。
注意:当类与接口(或者是接口与接口)发生方法命名冲突的时候,此时必须使用内部类来实现。
用接口不能完全地实现多继承,用接口配合内部类才能实现真正的多继承。
例子:
对于两个类,拥有相同的方法:
class People
{
run();
}
interface Machine{
run();
}
此时有一个robot类:
class Robot extends People implement Machine.
此时run()不可直接实现。
interface Machine
{
void run();
}
class Person
{
void run(){System.out.println("run");}
}
class Robot extends Person
{
private class MachineHeart implements Machine
{
public void run(){System.out.println("heart run");}
}
public void run(){System.out.println("Robot run");}
Machine getMachine(){return new MachineHeart();}
}
class Test
{
public static void main(String[] args)
{
Robot robot=new Robot();
Machine m=robot.getMachine();
m.run();
robot.run();
}
}
7.11.5. 匿名内部类
匿名内部类是一种特殊的局部内部类,它是通过匿名类实现接口。
IA被定义为接口。
IA I=new IA(){};
注:一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类,没有类名,根据多态,我们使用其父类名。
因其为局部内部类,那么局部内部类的所有限制都对其生效。
匿名内部类是唯一一种无构造方法类。
匿名内部类在编译的时候由系统自动起名Out$1.class。
如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。
因匿名内部类无构造方法,所以其使用范围非常的有限。
分享到:
相关推荐
每种内部类都有其特点和应用场景。 一、成员内部类 成员内部类是指定义在外部类中的内部类。它们可以访问外部类的所有成员变量和方法,无论是否是私有的。成员内部类不能含有静态变量和方法,因为它们需要先创建了...
Java内部类详解 Java内部类是Java语言中的一种特殊类别,它是指定义在另外一个类内部的类。内部类可以访问外部类的所有成员变量和方法,包括私有的变量和方法。内部类可以分为四种:...每种内部类都有其特点和用途。
非静态成员内部类是最常见的一种内部类形式,它具有以下特点: 1. **访问权限**:非静态成员内部类可以访问外部类的所有成员,包括私有成员。 2. **实例化**:实例化一个非静态成员内部类时,必须先有一个外部类的...
内部类可以分为四种类型:静态内部类、成员内部类(非静态内部类)、局部内部类和匿名内部类。 1. **静态内部类**: 静态内部类与普通的成员内部类不同,它不持有对外部类的引用。因此,可以像其他静态成员一样,...
首先,内部类分为四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。成员内部类就像其他成员变量一样,可以直接访问外部类的所有成员,包括私有成员。局部内部类只存在于某个方法内,它的作用范围更小,...
#### 四、静态内部类的应用 静态内部类主要用于以下情况: 1. **减少内存消耗**:当内部类不需要访问外部类的实例变量时,使用静态内部类可以避免为外部类创建不必要的实例,从而节省内存。 2. **提高代码可读性**...
在Java语言中,内部类(Inner Class)作为一种特殊的存在,为开发者提供了更为灵活的面向对象编程方式。通过本文,我们将深入探讨Java内部类的四个典型应用场景,并对每个场景进行详细分析,帮助初学者更好地理解并...
内部类分为四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。成员内部类就像普通的类成员,可以有自己的访问修饰符;局部内部类只存在于方法或块的范围内;匿名内部类通常用于快速创建一个简单的类实例,...
#### 四、非静态内部类不能有静态声明 非静态内部类不能包含任何静态成员(如静态变量、静态方法等),因为它们依赖于外部类的实例。如果尝试在非静态内部类中声明静态成员,将会导致编译错误。 ```java public ...
成员内部类具有以下几个特点: - **访问外部类的成员**:成员内部类可以直接访问外部类的所有成员,包括私有成员。 - **作用域**:成员内部类的作用域是整个外部类。 - **实例化**:为了实例化成员内部类的对象,...
内部类分为四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。 成员内部类,如同普通成员变量一样,可以拥有访问权限(public、protected、private或默认)。在给定的例子中,`Outer`类有一个成员内部类`...
在本节中,我们将详细介绍内部类和异常类的概念、特点和使用方法。 一、内部类 内部类是指在一个类的内部定义的类。内部类可以访问外部类的所有成员变量和方法,包括私有成员变量和方法。内部类可以分为两种:静态...
内部类分为四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。成员内部类就像是一个类的成员,它可以直接访问外部类的所有成员,包括私有成员。局部内部类定义在方法或作用域内,它的生命周期仅限于该方法...
内部类可以进一步分为成员内部类、局部内部类和匿名内部类三种类型。 ##### 1. 成员内部类 成员内部类是在外部类中直接定义的内部类,它可以被看作是外部类的一个成员。因此,成员内部类可以访问外部类的所有成员...
首先,内部类可以分为四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。在给定的代码示例中,我们看到的是成员内部类的应用。成员内部类就像普通的类成员,可以访问外部类的所有成员,包括私有成员。在 `...
内部类可以分为四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。本文主要讨论非静态内部类(也称为实例内部类)的使用及其特点。 首先,非静态内部类的一个关键特性是它拥有对外部类的隐式引用。这意味...
#### 二、内部类的分类及特点 内部类主要可以分为以下几类: 1. **成员内部类**(Member Inner Class) 2. **静态嵌套类**(Static Nested Class) 3. **方法内部类**(Local Inner Class) 4. **匿名内部类**...
内部类(Inner Classes)是定义在另一个类或接口中的类,它们主要分为四种类型:成员内部类、静态嵌套类、方法内部类和匿名内部类。这些内部类在功能上具有一定的共性,同时又各具特色,适用于不同的场景。 **共性...