内部类、final关键字、static关键字
一、内部类
在类中定义的类,有普通内部类,静态内部类和匿名内部类
示例:
public class Man {
String name;
Kid kid;
//内部类
class Kid{
String name;
Integer age;
}
//静态内部类
static class Children{
}
public static void main(String[] args) {
Man man = new Man();
Kid kid = man.new Kid();
}
}
二、final关键字
表述为“最终不可修改的”,用来修饰类、方法和变量
Final修饰的类不能被继承
Final修饰的方法不能被重写
Final修饰的常量,不可修改
常量
Final关键字修饰常量,常量名必须都是大写,如final string NAME;
1) 修饰基本数据类型,变量的值不能被改变
2) 修饰引用类型(对象),该对象的引用(内存地址)不能被改变,即对其初始化之后就不能让其指向另外的对象
示例:
final int NO = 12;
final String NAME = "abc";
三、static关键字
static关键字,表述为“静态的,全局的”,被static修饰的资源(变量或方法),可以直接通过类名调用,而不需要实例化(不需要创建对象)
JVM的类加载顺序
static声明的静态资源 > new > 构造方法constructor
特点:
- static声明的资源只能被初始化一次;
- 修饰变量,称为静态变量,局部变量(如方法中的变量)不能被static 修饰,因为static就有全局的意思;
- 修饰方法,称为静态方法,静态方法只能调用其他静态资源,不能调用非静态变量,不能应用this和super,因为静态资源的加载先于实例化;
- 被static修饰的变量和方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被该类的所有实例共享
-
修饰内部类(静态类),外部类不需要实例化,可以直接通过外部类名调用
示例:
public class Man {
//静态变量
public static int no;
//静态方法
public static void speak(String str) {
System.out.println(str);
}
//主方法
public static void main(String[] args) {
//调用静态变量
Man.no = 12;
//调用静态方法
Man.speak("hello");
}
}
补充:
-
实例方法和所属的实例绑定
解释:
同一个类中的各个对象都有各自的方法,互相没关系,互不影响。 -
静态(static)方法和所属的类绑定
解释:
静态方法不会在实例化创建对象时,为对象创建一个新的static方法,所有的对象公用一个static方法,即多个实例对象先后调用该静态方法,只保存最后一次造作的结果。 -
静态块
解释:
对静态变量进行初始化,每个静态代码块只会执行一次。
由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。 如果类中包含多个静态代码块,那么将按照“先定义的代码先执行,后定义的代码后执行”。
注意:
- 静态代码块不能存在于任何方法体内
-
静态代码块不能直接访问实例变量和实例方法。
问题
父类: 静态块 构造方法
子类:静态块 构造方法
子类继承父类,创建子类对象,观察加载顺序
答案:加载顺序为1父类静态块2子类静态块3父类构造方法4子类构造方法
示例:
public class Man {
static {
System.out.println(" man static");
}
public Man() {
System.out.println(" man constructor");
}
}
public class Kid extends Man{
static {
System.out.println(" kid static");
}
public Kid() {
System.out.println(" kid constructor");
}
public static void main(String[] args) {
Kid kid = new Kid();
}
}
版权声明:本文为dgvesrhetd原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。