内部类之成员内部类
内部类的概念:
所谓内部类就是将一个类定义在另一个类的内部。内部的类称为内部类
内部类的主要特点:
- 内部类可以很好的实现隐藏,可以使用protected private修饰符
- 内部类可以直接访问外部类的所有成员,包括私有的成员
- 外部类不能直接访问内部类的成员,必须首先建立内部类的对象才能访问
成员内部类及应用:
- 成员内部类属于外部类的实例成员,成员内部类可以有public private default protected权限修饰符。在成员内部类中访问外部类成员的方法和属性,要使用“外部类名.this.成员”的形式
- 创建成员内部类的实例使用“外部类名.内部类名 实例 = 外部类实例名.new 内部类名构造方法(参数)”的形式
class Outer{
int data;
private String name;
private void printf(){
System.out.println("外部类打印");
}
void catInter(){
Inter i = new Inter();
i.age =21;//外部类不能直接访问内部类成员,需要建立内部类对象才能访问
System.out.println("inter age = "+i.age);
}
class Inter{
int age;
void interPrintf(){
Outer.this.name = "小海";//内部类可以直接访问外部类所有成员,包括private类型的成员
System.out.println("outer name = "+Outer.this.name);
System.out.println("内部类打印");
Outer.this.printf();
}
}
}
public class Test {
public static void main(String[] args) {
Outer o = new Outer();
//创建成员内部类的实例使用“外部类名.内部类名 实例 = 外部类实例名.new 内部类名构造方法(参数)”的形式
Outer.Inter i = o.new Inter();
i.interPrintf();
}
}
内部类之匿名内部类
匿名内部类的特点:
- 匿名内部类是没有名称的内部类,没有办法引用它们。必须在创建时,作为new语句的一部分来声明并创建它们的实例。
- 匿名内部类必须继承一个类(抽象的,非抽象的都可以)或者实现一个接口,所有父类(或者父接口)是抽象类,则匿名内部类必须实现其所有抽象方法
语法:实例
new interface/superclass(){类体}
这种形式的new语句声明一个新的匿名类,他对一个给定的类进行扩展,或者实现一个给定的接口,并同时创建该匿名类的一个新实例
abstract class demo1{//抽象类
abstract void mothd1();
abstract void mothd2();
}
interface demo2{
abstract void mothd3();
}
public class Test {
public static void main(String[] args) {
new demo1() {//匿名内部类必须继承其所有抽象类
void mothd2() {
// TODO Auto-generated method stub
System.out.println("这不是抽象类,而是匿名内部类");
}
void mothd1() {
// TODO Auto-generated method stub
}
}.mothd2();
new demo2() {//匿名类
public void mothd3() {
// TODO Auto-generated method stub
System.out.println("这不是接口,而是匿名内部类");
}
}.mothd3();
}
}