第11章 类的高级特性--内部类

在类中再定义一个类,则将在类中再定义的那个类称为内部类;

内部类可分为成员内部类、局部内部类、匿名类

1、成员内部类

在内部类中可以随意使用外部类的成员方法以及成员变量,尽管这些类成员被修饰为private;

但内部类的成员只有在内部类的范围之内是可知的,不能被外部类使用

内部类的对象实例化操作必须在外部类

使用this关键字获取内部类与外部类的引用

public class TheSameName{
    private int x;
    private class Inner{
        private int x=9;
        public void doit(int_x){
            x++;  //调用的是形参x
            this.x++;   //调用内部类的变量x
            TheSameName.this.x++;    //调用外部类的变量x
        }
   }
}

2、局部内部类

interface OutInterface2{
}
class OuterClass3{
    public OutInterface2  doit(final String x){
        class InnerClass2 implements OutInterface2{
            InnerClass2(String s){
                s=x;
                System.out.println(s);
            }
        }
        return new InnerClass2("doit");
    }
}

内部类被定义在了doit()方法内部,内部类InnerClass2是doit()方法的一部分,并非OuterClass3类中的一部分,所以在doit()方法的外部不能访问该内部类,但是该内部类可以访问当前代码快的常量以及外部类的所有成员。

3、匿名内部类

匿名类的所有实现代码都需要在大括号之间进行编写

return new A(){
    ...//内部类体
};

匿名内部类没有名称,实质上这种内部类的作用就是创建一个实现于OutInterface2接口的匿名类的对象:

class OuterClass4{
    public OutInterface2 doit(){
        return new OutInterface2(){
            private int i=0;
            public int getValue(){
                return i;
            }
        };  //这个分号并不是代表定义内部类结束的标识,而是代表创建OuterInterface2引用表达式的标识
    }
}

4、静态内部类

在内部类前添加修饰符static,这个内部类就变成静态内部类了;

一个静态内部类中可以声明static成员,但是在非静态内部类中不可以声明静态成员;

静态内部类不可以使用外部类的非静态成员;

5、内部类的继承

public class OutputInnerClass extends ClassA.ClassB{ //继承内部类ClassB
    public OutputInnerClass(ClassA a){
        a.super();
    }
}
class ClassA{
    class ClassB{
    }
}

在某个类继承内部类时,必须硬性给予这个类一个带参数的构造方法,并且该构造方法的参数为需要继承内部类的外部类的引用,同时在构造方法中使用a.super()语句,这样才能为继承提供了必要的对象引用。

时间: 2024-10-07 06:09:30

第11章 类的高级特性--内部类的相关文章

第11章 类的高级特性--final

1.final变量 (1)final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值.通常,由final定义的变量为常量.例如:final double PI=3.14; final关键字定义的变量必须在声明时对其进行赋值操作. 被定义为final的常量定义时需要使用大写字母命名,并且中间使用下划线进行连接. 例如:private final int VALUE_1=9; (2)final还可以修饰对象引用 一旦一个对象引用修饰为final后,它只能恒定指向一个对象无法将其改变以

第11章 类的高级特性--类名冲突

类名冲突 在程序中定义了一个login类,因业务需要,还要定义一个名称为login的类,但是这两个类所实现的功能完全不同,于是问题就产生了,编译器不会允许存在同名的类文件. 解决这类问题的办法是将这两个类放置在不同的类包中.

技术篇7.0类的高级特性

类除了具有普通的特性之外,还具有一些高级特性,如包.内部类等.包在整个管理中起到了非常重要的作用,使用包可以有效地管理繁杂的类文件,解决类重名问题,当在类中配合与权限修饰符使用时,可以控制其他人对类成员的访问.同时在Java语言中一个更为有效的隐藏实现细节的技巧是使用内部类,通过使用内部类机制可以向上转型为被内部类实现的公共接口.由于在类中可以定义多个内部类,所以实现接口的方式也不止一个,只要将内部类中的方法设置为类最小范围的修饰权限即可将内部类的实现细节有效地隐藏. 抽象类 (概念)所谓抽象类

第8章 类的高级概念

1.局部变量不能加访问修饰符,成员变量可以. 2.static 的类属性,不属于对象所有,所有对象共享该属性.尽量使用类名调用类属性,而不是对象名. 3.类本身也有访问修饰符,但是类的访问修饰符只有共有的和默认(无访问修饰符)的两种.默认访问的类只能被同一包中的其他类使用. 4.封装也被称为数据隐藏. 5.类的成员变量可以成为只读或者只写的. 6.类的静态成员被称为类成员,因为静态成员与类相关,而不是类的某个实例. 7.静态成员变量和方法不能使用引用来访问,因为引用是指类的实例. 8.静态方法是

No2_5.类的高级特性_Java学习笔记_抽象类和成员内部类

一.抽象类1.所谓抽象类,只声明方法的存在而不去实现它的类:2.抽象类不能被实例化,即不能实现其对象:3.abstract class 类名{ 类体 }4.包含一个或多个抽象方法的类必须声明成抽象类:5.abstract <方法返回值类型> 方法名(参数列表) 二.内部类1.如果在一个类中再定义一个类,就将在类中定义的那个类称为内部类:2.内部类分为成员内部类,局部内部类以及匿名内部类:3.成员内部类: a.可以在内部类中直接存取其所在类的私有成员变量: b.外部类不可以直接访问内部类成员变量

七、类的高级特性

1.抽象类 抽象类:只声明方法而不去具体实现.不能被实例化创建对象. 语法:abstract class 类名{...} 抽象方法:只有方法的声明,没有方法的实现,需要子类重写. 语法:abstract <返回值类型> 方法名(参数列表) 2.内部类 (1)成员内部类 在一个类中使用内部类可以在内部类中直接存取其所在类的私有成员变量及成员方法. 内部类的实例一定要绑在外部类的实例上,如果外部类中初始化一个内部类对象,那么内部类对象就会绑定在外部类对象上,内部类初始化使用new关键字. 语法:p

类的高级特性(二)

1.局部内部类 局部内部类:在类的方法中定义 作用范围:方法内 2.匿名内部类 内部类不一定要有名字. 匿名内部类的所有实现代码都需要在大括号之间进行编写. 语法格式: return new A(){ .......//内部类体 }; A表示对象名. 3.静态内部类 内部类前加修饰符static,就是静态内部类. 特点:不可调用外部类的非静态成员. a.创建静态内部类的对象,不需要其外部类的对象. b.不能从静态内部类的对象中访问非静态外部类对象.

JAVA高级特性--内部类

内部类概念 public class Outer{ class inner{ } } 特点 可以很好的实现隐藏,可以使用procted,private 可以直接访问外部类的所有成员 ,包括私有成员. 外部内不能访问内部类的成员,必须首先建立内部类的 对象才可访问 成员内部内及应用 //外部内不能访问内部内属性和方法,必须创建对象 //内部类中不能有静态方法和属性 //内部类可以访问Outer.this.name外部内属性 //静态常量在内部类中是可以的 package com.tanlei.ne

java程序-类的高级特性

创建Employee类,在类中定义三个属性:编号,姓名,年龄,然后在构造方法里初始化这三个属性,最后在实现接口中的定义的CompareTo方法,将对象按编号升序排列. 代码如下:(程序可能有些错误,方法是对的,见谅) import java.awt.List; import java.util.ArrayList; import java.util,Collection; import java.util,Collections; import java.util,Iterator; impor