内部类
是在一个类的内部定义的新类型。即内部类,与之相反的类称之为外部类。
内部类可以根据位置不同进行以下划分:
1、成员内部类
2、方法内部类(局部内部类)
3、带static修饰词的类 静态内部类
4、没有名称的类:匿名内部类
最不常用的内部类:方法内部类,静态内部类
方法内部类:定义在方法中,相当于局部变量,仅限于在方法中使用,定义时不能使用修饰词,可以直接访问外部类的非静态成员变量
练习代码
/**
* 方法内部类的学习
* */
public class A {
char gender;
public void run() {
class B{
String name;
int age;
public B(String name,int age) {
this.name = name;
this.age = age;
}
public void showB() {
System.out.println(name+","+age+","+gender);
}
}
B b = new B("翠花",13);
b.showB();
}
public static void main(String[] args) {
A a = new A();
a.run();
}
}
静态内部类:也是以类的成员来定义的,只不过多了一个修饰词static,可以直接访问外部类的静态成员
练习代码
/**
* 静态内部类
* @author michael
*
*/
public class C {
String name;
D d = new D(12);
public void run() {
}
static class D{
int age;
public D(int age) {
this.age = age;
}
//静态内部类可以直接访问外部类的静态成员
public void showD() {
//System.out.println(age+","+name);
}
}
}
相对而言,成员内部类和匿名内部类比较常用。
成员内部类:以类的成员来定义,可以使用任何修饰词来修饰。
成员内部类访问外部类的成员,方法内隐藏一个指向外部类对象的引用。
外部类名.this.
成员内部类的使用:
创建对象:要先创建一个外部类的对象outer,然后使用外部类对象去使用new调用内部类的构造器实例化,Inner inner = outer.new Inner(有参传参);
外部类访问成员内部类的成员:在外部类添加一个内部类的成员变量进行访问
练习代码
public class Mom {
char gender;
int age;
/**添加一个内部类的成员变量*/
Baby baby;
public Mom(char gender,int age) {
this.gender = gender;
this.age = age;
baby = new Baby('m');
}
public void sport() {
System.out.println("正在走路");
/**访问成员变量的信息*/
System.out.println("为了肚子里的对象:"+baby.toString()+","+baby.gender);
baby.show();
}
/**以成员的身份来定义胎儿类型*/
class Baby{
char gender;
public Baby(char gender) {
this.gender = gender;
}
/**展示自己的行为*/
public void show() {
/**内部类访问外部类的成员
*
* 方法内隐藏一个指向外部类对象的引用。
* 外部类名.this.
* */
System.out.println("妈妈的年龄:"+Mom.this.age+",我自己的性别:"+gender);
}
}
}
匿名内部类:没有名字的类型,写在外部类的方法中,只用一次,不需要定义类的结构,通常都是为了实现接口,抽象类或某一现有的类的子类,子类没有名称,所以称之匿名
当我们先使用接口\抽象类的子类时,因为我们用一次,我们就可以不去定义子类的结构,因此我们可以使用匿名内部类的写法,没有子类名称,我们 可向上造型 =后是new 父类的子类(可以有参){
重写接口/抽象类中所有的抽象方法,或重写某一个实现方法
};
练习代码
public class Test01 {
public static void main(String[] args) {
InterX x = new InterX() {
@Override
public void sum(int a, int b) {
System.out.println("和:"+(a+b));
}
@Override
public void product(int a, int b) {
System.out.println("乘积:"+(a*b));
}
};
x.sum(10, 5);
x.product(10, 5);
}
}
interface InterX{
public void sum(int a,int b);
public void product(int a,int b);
}