内部类
1.相当于说,我们可以在类的内部再定义类。外面的类:外部类;里面的类:内部类。
2.内部类的分类:成员内部类(声明在类的内部且方法之外) VS 局部内部类(声明在类的方法里)
3.成员内部类:
3.1.是外部类的一个成员:①可以有4种修饰符;②可以和类中的属性一样用static和final修饰。
3.2.具体类的特点:①可以和类一样用abstract修饰;②还可以在其内部定义属性、方法、构造器。
4.局部内部类
5.关于内部类需要掌握的三个点:
5.1.如何创建成员内部类的对象(静态成员内部类的对象 VS 非静态成员内部类的对象)
5.2.如何区分调用外部类、内部类的对象(尤其是变量重名时)
5.3.局部内部类的使用
成员内部类实例代码:
/**
* 成员内部类
*/
public class TestInnerClass {
public static void main(String[] args) {
//创建静态内部类的对象:可以直接通过外部类调用静态内部类的构造器
Man.Foot f = new Man.Foot();
//由于Foot类中的name属性为static修饰,所以可以直接调用
System.out.println(Man.Foot.name);
System.out.println(f.id);
//创建非静态内部类的对象:必须先创建外部类的对象,
//通过外部类的对象调用内部类的构造器
//方法一:
Man man = new Man();
Man.Head h1 = man.new Head();
//方法二:
Man.Head h2 = new Man("BIG" , 20).new Head("LITTLE" , 5);
h2.info("MID");
}
}
class Man {
String name;
int age;
//非静态成员内部类
class Head {
String name;
int id;
public Head() {
super();
}
public Head(String name, int id) {
super();
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public void info(String name) {
System.out.println("name="+ name );
System.out.println("this.name=" + this.name);
System.out.println("Man.this.name=" + Man.this.name);
}
}
//静态成员内部类
//Foot是类名,不是对象名,所以Man.Foot是一个未实例化的静态类
static/*这个static是表明这个类相对外部类Man是静态的,可以用Man.Foot*/class Foot {
static/*这个static是表明这个属性相对类Foot是静态的,可以用Foot.name*/ String name;
int id;
public Foot() {
super();
}
public Foot(int id) {
super();
this.id = id;
}
}
public Man() {
super();
}
public Man(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
局部内部类实例代码:
/**
* 局部内部类
*/
public class TestMethodInnerClass {
public static void main(String[] args) {
}
}
class OutClass {
//局部内部类
//如下的使用方式较少
public void method1() {
class InnerClass {
}
}
//常常使用一个方法,使其返回值为某个类或接口的对象,
//而这个类或接口在方法内创建
//方法一:
public Comparable getComparable() {
//1.创建一个实现Comparable接口的类:局部内部类
class MyComparable implements Comparable {
@Override
public int compareTo(java.lang.Object o) {
return 0;
}
}
//返回一个实现类对象
return new MyComparable();
}
//方法二:
//返回一个实现Comparable接口的匿名内部类的对象
public Comparable getComparable1() {
return new Comparable() {//实现Comparable接口的匿名类
@Override
public int compareTo(java.lang.Object o) {
return 0;
}
};
}
}