纠结了很久的一个问题, 内部类和静态内部类在使用上有啥区别
程序员文章站
2024-02-10 13:17:10
...
历史信息
- Java中的内部类是在Jdk1.1版本之后增加的,内部类是Java语言中一个比较重要的概念,如果能把内部类运用好,那么会明显增强Java程序的灵活性。
- 内部类无论是静态还是非静态, 本质上都是写在内部的一个类, 比如下面代码
public class Demo {
class Test {
}
}
对比
- 我们都知道Java的类是有封装性的, 比如我们将一个属性或者方法写成是private修饰的, 那么只能在类的内部进行使用, 外部是无法使用的
- 所以, 内部类是可以访问私有属性和私有方法的, 但是要清楚静态和非静态对私有的字段访问还是有差距的, 后面讲到哈~
第一,内部类可以访问其所在类的属性(包括所在类的私有属性)
public class Demo {
private static String name = "bike"; //外部类的私有静态变量
private int age = 10; //外部类的私有属性
private void play() { //外部类的私有方法
System.out.println("play");
}
class Stu { //内部类
int age = 20;
public void print() {
System.out.println(age); //20
System.out.println(this.age); //20
//通过外部类名加this可以访问外部类的所有属性和方法
System.out.println(Demo.this.age); //10
Demo.this.play(); //外部类的play方法
Stu stu = Demo.this.new Stu(); //初始化内部类实例
System.out.println(Demo.name); //访问外部类的私有静态变量
}
}
第二, 可以在方法体内定义一个内部类,方法体内的内部类可以完成一个基于虚方法形式的回调操作,看一个例子:
private Stu play() { //外部类的私有方法
System.out.println("play");
class Tea extends Stu {
@Override
public void print() {
super.print();
System.out.println("我是Tea执行的");
}
}
return new Tea();
}
第三, 内部类不能定义static元素,看一个例子:
第四, 内部类可以多嵌套,看一个例子:
也就是说内部类里可以有内部类
第五, 实例化一个内部类需要先实例化外部类
public static void main(String[] args) {
//实例化一个非静态内部类的时候需要先实例化外部类, 也就是需要实例化俩个对象
Stu stu = new Demo().new Stu();
}
- 对于静态内部类, 其实我们都知道一个类的静态属性字段, 都会在这个类在加载的时候就加载出来, 随着类对象一起出生, 将他们存放在方法区中, 所以本质上来说内部类还是属于实例的, 所以在实例化内部类的时候需要先实例化外部类, 而静态内部类就是属于类的, 那么他严格来说已经不算是一个完全的内部类
- 所以对于静态内部类, 他除了是写在内部类的位置上, 可以访问外部类静态的的私有属性和字段, 其余和外部类没有任何区别
- 也就是说静态内部类是一个还是比较高级的*类
第一, 静态内部类可以有静态属性和方法, 当然也可以有普通的
static class Per {
static String name = "listen";
int age = 30;
public static void print() {
System.out.println(name);
}
}
第二, 静态类可以访问外部类的私有静态变量, 普通属性不能访问了
static class Per {
static String name = "listen";
int age = 30;
public static void print() {
System.out.println(name);
//静态内部类访问外部类的私有静态属性
System.out.println(Demo.name);
//静态内部类访问外部类的普通属性
System.out.println(Demo.this.age); //报错了
}
}
第三, 实例化一个静态内部类只需要实例化一个对象
public static void main(String[] args) {
Demo.Per per = new Demo.Per();
}
上一篇: CSS控制鼠标光标样式
下一篇: 今天同学发来一个问题,让我很纠结!!