内部类
- 1.内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据
- 2.内部类可以对统一包中的其他数据隐藏起来,增强面向对象的封装性
- 3.当想定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷
例如在使用comparator时定义一个它不想另外写出一个类
Comparator comparator = new Comparator(){
public int compare(Object o1,Object o2){
int[] arr= (int[]) o1;
int[] arr1 = ((int[]) o2);
if(arr[0]!=arr1[0]){
return arr1[0]-arr[0];
}
if(arr[1]!=arr1[1]){
return arr1[1]-arr[1];
}
if(arr[2]!=arr1[2]){
return arr1[2]-arr[2];
}
return 0;
}
};
一个小栗子
public class Person {
//人在出生的时候选择性别
private String[] sex = {"男性","女性"};
class Xiaoming{
private String xiaoming_sex;
private String showSex() {0
// TODO Auto-generated method stub
xiaoming_sex = sex[1];
return xiaoming_sex;
}
}
//在外部类当中定义一个方法展示小明的性别
private void show_XiaoMing_sex() {
// TODO Auto-generated method stub
Xiaoming xiaoming = new Xiaoming();
System.out.println(xiaoming.showSex());
}
public static void main(String[] args) {
Person person = new Person();
person.show_XiaoMing_sex();
}
}
一、成员式内部类
定义:成员式内部类如同外部类的一个普通方法
成员式内部类有以下特性:
1.持有父类引用,故可以访问父类任何访问权限的变量、方法
2.非静态内部类中不能声明static成员
外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
Person.Xiaoming xiaoming = new Person().new Xiaoming();
二、局部内部类
定义:局部内部类就是定义在代码块、方法体内、作用域({})内的类。
public class Person {
//人在出生的时候选择性别
private static String[] sex = {"男性","女性"};
public void print() {
class People {
private String name = "xiaoming";
public void print() {
System.out.println("hello world");
}
}
People people = new People();
people.print();
}
}
局部内部类有以下特性:
- 1.不能使用public、private、protected、static等这些修饰符
- 2.局部内部类只能在当前方方法中使用,作用域范围仅限于当前方法中
- 3.局部内部类和成员内部类一样,不能拥有静态成员,但可以访问外部成员的所有变量
- 4.局部内部类访问的局部变量必须使用fianl修饰,在jdk8中自动隐士的加上了final,但是依然是常量,值不能被改变(不知道为什么)
不推荐使用局部内部类(所以我印象没有那么深刻)
三、匿名内部类
定义:匿名内部类是局部内部类的一种特殊形式,是一个没有名称的内部类。(个人感觉最常用,当lambda函数不容易表达的话可以使用这个)
就是第一个例子,comparator的匿名内部类定义。
四、静态内部类
有时候,使用内部类只是为了把一个类隐藏在另一个类的内部,并不需要内部类引用外围类对象。为此,我们可以将内部类声明为static,以便取消产生的引用。
特点:
- 1.在创建外部类实例的时候不必创建外部类实例。
- OuterClass.InnerClass in = new OuterClass.InnerClass();
- 2.静态内部类可以直接访问访问外部类的静态成员
- 3.在静态内部类可以定义静态和非静态的成员
- 4.外部类可以通过完整的类名直接访问静态内部类的静态成员。