内部类
内部类定义:把类定义在其他类的内部,这个类就被称为内部类。比如在一个类中定义了另外一个类,这个里面的类就是内部类。
内部类访问特点:
(1)内部类可以直接访问外部类的成员,包括私有。
(2)外部类要访问内部类的成员,必须创建对象。
(3)按照内部类位置分类可以分为:
a.成员位置:在类中方法外位置定义的类,被称为成员内部类。
b.局部位置:在方法中定义的类,被称为局部内部类。
(4)在测试类中直接访问内部类成员的格式:
外部类名.内部类名 对象名 = 外部类对象.内部类对象;成员内部类
Student类
public class Student {
private String name = "易烊千玺";
public int age = 18;
// 定义成员内部类
class Inner {
private String sname = "周杰伦";
public int age = 35;
private void aa() {
System.out.println("内部类私有成员方法");
}
public void bb() {
System.out.println("内部类公共成员方法");
System.out.println(name);
System.out.println(age);
}
}
// 定义成员方法
public void show() {
System.out.println("我是student的成员方法");
//不能在外部类中直接访问内部类的成员
//需要创建内部类的对象去访问方法
Inner inner = new Inner();
inner.aa();
inner.bb();
String sname = inner.sname;
System.out.println(sname);
}
}
Test类
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 外部类名.内部类名 对象名 = 外部类对象.内部类对象;
Student.Inner inner=new Student().new Inner();
inner.bb();
Student student = new Student();
student.show();
}
}
- 局部内部类
Outer类
public class Outer {
private String name = "周杰伦";
public int age = 35;
public void show() {
// 定义一个局部内部类
class Inner {
private String name = "刘德华";
public int age = 55;
public void nei() {
System.out.println(this.name);
System.out.println(this.age);
System.out.println(Outer.this.name);
System.out.println(Outer.this.age);
}
}
// 这里创建内部类的对象
Inner inner = new Inner();
//创建一个inner对象去调用nei方法
//在test调用show方法的时候就会显示除nei方法中的内容
inner.nei();
//以下只是通过inner去调用Inner中的age
int age2 = inner.age;
System.out.println(age2);
//可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能
}
public void test() {
show();
}
}
Test类
public class Test {
public static void main(String[] args) {
new Outer().show();
}
}
匿名内部类
- 是局部内部类的一种简写方式,而匿名内部类的本质其实是一个对象,是一个继承了该抽象类的子类对象,或者实现了该接口的子类对象
- 格式:
new 类名或者接口名(){
重写方法;} ;
Student类
public class Student {
public void show() {
System.out.println("学生的show方法");
}
}
Teacher类
public abstract class Teacher {
public abstract void look();
}
Test类
public class Test{
public static void main(String[] args) {
//采用匿名内部类来创建对象
new Student(){
public void show(){
System.out.println("重写学生类中的show方法");
}
}.show();
new Teacher() {
@Override
public void look() {
System.out.println("重写老师类中的抽象方法");
}
};
}
}