前言: 今天上了java课,老师讲的内部类,局部类,匿名类还是没搞太清楚,打算自己搜资料来复习一遍。
参考文章:https://blog.csdn.net/qq7342272/article/details/6671433
内部类: 在 Java 中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。下面就先来了解一下这四种内部类的用法。
1.成员内部类:
成员内部类是最普通的内部类,它的定义为位于另一个类的内部,形如下面的形式:
public class Circle {
double radius = 0;
public Circle(double radius) {
this.radius = radius;
}
class Draw { //内部类
public void drawSahpe() {
System.out.println("drawshape");
}
}
}
在这里,Circle被称作为外部类,也叫做封装类。Draw 被称为内部成员类。
这里我们需要注意的几个点是
1、非静态成员内部类(也就是成员内部类)可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。
2、非静态成员内部类(也就是成员内部类)只能定义非静态成员属性和成员方法
3、静态成员内部类只可以访问外部类中的静态成员属性和成员方法
4、静态成员内部类能定义静态成员属性和方法,也能定义非静态成员属性和方法
问题:如果内部类和外部类的成员属性冲突了,是重名那该如何是好呢?
上面的代码已经解释清楚了,当内部类和外部类的成员属性冲突,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:
访问封装类的非静态成员(包括属性和方法)
外部类.this.成员
访问封装类的静态成员(包括属性和方法)
外部类.静态成员
问题:如何在外部类之外创建静态成员类或者是非静态成员类呢?
创建内部静态成员类:
外部类名.静态内部成员类名 实例变量名 = new 外部类名.静态内部类()
Circle c1 = new Circle();
Circle.Tool to1 = new Circle.Tool(); // 创建静态内部类成员
创建内部非静态成员类:
外部类名.非静态内部成员类名 实例变量名 = 外部类的实例名.new 非静态内部成员类名()
Circle c1 = new Circle();
Circle.Draw to2 = c1.new Draw(); // 创建非静态内部类成员
1.局部内部类: 局部内部类是在封装类的方法中定义的内部类,与局部变量类似,其作用域是定义它的代码块。
利用: 典型用法是与接口配合,用局部类来实现接口,并在方法中返回接口类型。
特征:
1、局部类的类名不能和外部类的类名相同
2、局部类可以abstract和final型
3、访问修饰符只能是缺省的,也就是不可以是public、private、protected
4、局部类不允许包含静态成员属性和方法
5、局部类中只能访问它所在方法中的final型变量,不能访问非final型的变量。
第五点的证明:
public class Inside {
public void to_inside() {
int cc=22;
class Inside_one{
public void inside_one_a() {
System.out.println(cc);
}
}
Inside_one i1 = new Inside_one(); //局部类创建实例
i1.inside_one_a();
}
}
这样子是无法进行访问的,这个原因是由于inside_one_a方法调用完毕之后就从栈中弹出了,但是这个时候由于局部内部类中使用了这个方法中的局部变量,而这个类还是不会立即回收的,所以只能将局部变量声明为final,表示常量,也意味着是持久的意思。
匿名内部类: 一个没有显式的名字的内部类
本质: 匿名内部类会隐式的继承一个类或者实现一个接口,或者说,匿名内部类是一个继承了该类或者实现了该接口的子类匿名对象。
格式:new 父类(){子类内容};
匿名类的特点:
1、匿名类可以继承父类的方法,也可以重写父类的方法。
2、匿名类可以访问外部类的成员变量和方法,匿名类的类体不可以声明称static成员变量和static方法。
一个简单的匿名类的实现:
interface Cubic {
int getCubic(int n);
}
class A {
public void f(Cubic cubic) {
double result = cubic.getCubic(4);
System.out.println(result);
}
}
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
A a = new A();
a.f(new Cubic() {
public int getCubic(int n) {
return n*n;
}
});
}
}
参考文章:https://www.cnblogs.com/progor/p/8644634.html
参考文章:https://www.runoob.com/w3cnote/java-inner-class-intro.html