未分类
2020-08-17 15:16:59
1822677238@qq.com
手机扫码查看
内部类与常用类
内部类
内部类的分类
成员内部类、静态内部类、局部内部类、匿名内部类
什么是内部类
概念:在一个的内部在定义一个完整的类
class Outer{
class Inner{
}
}
特点:
编译之后可生成独立的字节码文件(Outer$Inner.class,Outer.class)
内部类可直接访问外部类的私有成员,而不破坏封装
class Outer{
class Inner{
int b;
public void m2(){
System.out.println("inner m2()"+b);
}
}
}
可为外部类提供必要的内部功能组件
成员内部类
在类的内部定义,与实例变量、实例方法同级别的类
在外部类的一个实例部分,创建内部对象时,必须依赖外部类对象
Out out=new Oout();
Inner in=out.new Inner();
当外部类、内部类存在重名时,会优先访问内部类属性
class Outer{
private int a=10;
/**
成员内部类,依赖内部对对象
*/
class Inner{
int a=20;
public void m2(){
int a=30;
//内部类可以访问自身局部变量
System.out.println(a);
//内部类可以访问内部类的实例变量
System.out.println(this.a);
//内部类可以访问外部类实例变量
System.out.println(Outer.this.a);
}
}
}
成员内部类不能定义静态成员
静态内部类
不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员
只能直接访问外部类的静态成员(实例成员需实例化外部类对象)
public class demos{
public static void main(String[] args) {
//外部类的静态属性
System.out.println(Outer.a);
//外部类的静态方法
Outer.m1();
//静态内部类 创建,不依赖外部类的对象
//创建静态内部类对象时,可以直接通过完整名称进行创建
Outer.Inner in=new Outer.Inner();
//创建内部类对象后,访问实例属性和方法
System.out.println(in.a);
in.m2();
//额外比成员内部类多了一个定义的内容(静态属性和静态方法)
//通过外部类类名.内部类类名.内部类的静态属性
System.out.println(Outer.Inner.str);
//通过外部类类名.内部类类名.内部类的静态方法
Outer.Inner.m3();
}
}
class Outer{
static int a=10;
static class Inner{
int a=20;
static String str="abc";
public void m2(){
System.out.println("Inner m2()");
}
public static void m3(){
System.out.println("Inner m3()");
}
}
static void m1(){
System.out.println("Outer m1()");
}
}
局部内部类
定义在外部类方法中,作用范围和创建对象范围仅限于当前方法
局部内部类访问外部类当前方法的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final
限制类的使用范围
匿名内部类
没有类名的局部内部类(一切特征都与局部内部类相同)
必须继承一个父类或实现一个接口
定义类、实现类、创建对象的语法合并,只能创建一个该类的对象
优点:减少代码量
缺点:可读性较差
public class demos{
public static void main(String[] args) {
Teacher t = School.RandomT(3);
t.tech();
}
}
class School{
public static Teacher RandomT(int n){
class Gt extends Teacher{
@Override
public void tech() {
System.out.println("高级老师正在上课。。。");
}
}
Teacher t=null;
if(n%2==0){
//匿名内部类
t=new Teacher(){
@Override
public void tech() {
System.out.println("初级老师正在上课。。。");
}
};
}else{
t=new Gt();
}
return t;
}
}
abstract class Teacher{
public abstract void tech();
}



发表回复