Java常用类
内部类
概念
- 在一个类的内部再定义一个完整的类
特点
- 编译之后可生成独立的字节码文件(class文件)
- 内部类可直接访问外部类的私有成员而不破坏封装
- 可为外部类提供必要的内部功能组件
成员内部类
- 在类的内部定义,与实例变量,实例方法同级别的类
- 外部类的一个实例部分,创建内部类对象时,必须依赖外部类
- Outer out=new Outer()
- Inner in=out.new Inner()
举例:
public class Demo01 {
private String name="张三";
private int age=20;
class Inner{//前面也可以加private,public之类的修饰符
private String address="北京";
private String phone="110";
public void show(){
//打印外部类的属性
System.out.println(name);
System.out.println(age);
//打印内部类的属性
System.out.println(address);
System.out.println(phone);
}
}
}
可以发现,成员内部类要是想访问外部类的属性时,可以直接调用
public class Test01 {
public static void main(String[] args) {
//1、创建外部类对象
Demo01 outer = new Demo01();
//2、创建内部类对象
Demo01.Inner inner = outer.new Inner();//一定要写上外部类对象
inner.show();
}
}
其中测试类中的1.2步可替换为
Demo01.Inner inner=new Demo01().new Inner();//本质还是先创建外部类对象,再创建内部类对象
输出结果为
张三
20
北京
110
- 当外部类、内部类存在重名属性时,会优先访问内部类属性
当我们给内部类Inner其中再定义一个同名属性name
private String name="李四";
这时候再次运行代码,会发现原本输出应为“张三”,此时却输出了“李四”
李四
20
北京
110
要是想输出外部类的属性,需要特定的修饰符
格式为:外部类名.this.属性
System.out.println(Demo01.this.name);
System.out.println(Demo01.this.age);
- 成员内部类不能定义静态成员,但可以包含静态常量
这样会报错
private static String country="中国";
但这样就可以
private final static String country="中国";
静态内部类
(相当于在成员内部类前添加static关键字)(普通类前是不能添加static的)
- 不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员
public class Demo02 {
private String name="更生";
private int age=20;
//静态内部类:级别和外部类相同
static class Inner{
private String address="上海";
private String phone="111";
//静态成员
private static int count=1000;
public void show(){
//调用外部类的属性
//1、创建外部类对象
Demo02 outer = new Demo02();
//2、调用外部类对象的属性
System.out.println(outer.name);
System.out.println(outer.age);
//调用静态内部类的属性和方法
System.out.println(address);
System.out.println(phone);
//调用静态内部类的静态属性
System.out.println(Inner.count);
}
}
}
可以这么想,当你把静态内部类拿出来时,要想访问另一个类的属性,是需要创建对象的,因此静态内部类也需要首先创建外部类的对象。可以把静态内部类当做一个外面的类来看待
public class Test02 {
public static void main(String[] args) {
//直接创建静态内部类对象
Demo02.Inner inner=new Demo02.Inner();
//调用方法
inner.show();
}
}
new的是inner而不是Demo02