1.代码块例题:
当代码块中有静态代码块、普通代码块、继承关系、构造方法时的代码块先后的调用顺序:
先看完整代码:
public class Zuoye {
public static void main(String[] args) {
Zi zi = new Zi();
}
}
class Zi extends Fu {
private static int A = getA();
private int A1 = getA1();
public static int getA() {
System.out.println("子类的静态方法被调用");
return 1;
}
public int getA1() {
System.out.println("子类的普通方法被调用");
return 2;
}
static {
System.out.println("子类的静态代码块被调用");
}
{
System.out.println("子类的普通代码块被调用");
}
public Zi() {
System.out.println("子类的构造器被调用");
}
}
class Fu {
private static int B = getB();
private int B1 = getB1();
public static int getB() {
System.out.println("父类的静态方法被调用");
return 3;
}
public int getB1() {
System.out.println("父类的普通方法被调用");
return 4;
}
static {
System.out.println("父类的静态代码块被调用");
}
{
System.out.println("父类的普通代码块被调用");
}
public Fu() {
System.out.println("父类的构造器被调用");
}
}
在这里我们定义两个实体类,每个实体类中都写一个静态代码块、普通代码块、构造器以及一个方法。再添加一个继承关系。创建一个子类的对象,运行代码,看看输出的效果:
父类的静态方法被调用
父类的静态代码块被调用
子类的静态方法被调用
子类的静态代码块被调用
父类的普通方法被调用
父类的普通代码块被调用
父类的构造器被调用
子类的普通方法被调用
子类的普通代码块被调用
子类的构造器被调用
进程已结束,退出代码 0
在这里可以看出,最先输出的是与静态代码块有关的代码,而后优先执行和父类相关的代码。那么得出与静态代码块有关的最先执行,然后是父类的代码,最后是子类的代码。
而静态的代码块也是父类的先执行,从而得出优先顺序:
1.父类的静态代码块和静态属性(优先级一样)
2.子类的静态代码块和静态属性(优先级一样)
3.父类的普通代码块和普通属性初始化
4.父类的构造方法
5.子类的普通代码块和子类的普通属性初始化
6.子类的构造方法
7.注意: 静态代码块只能直接调用静态成员,普通代码块可以调用任意成员
(在本类中)
理解:
因为每个构造器都有共同内容:
{
1.super()
2.普通代码块和普通属性初始化
3.。。。。。。
}
父类和子类走完静态相关之后,会首先来访问子类的构造器;而子类的构造器里面包含了
{
1.super()
2.普通代码块和普通属性初始化
3.。。。。。。
}
所以,首先会访问父类的构造器,父类的默认继承object,没有输出语句,所以先执行
1.普通代码块和普通属性初始化
2.在执行父类构造方法中的内容。
最后返回,子类的构造方法中也先执行子类的
1. 普通代码块和普通属性初始化
2. 在执行构造器中的内容
2. 枚举类
1.概述:
我们学习过单例模式,即一个类只有一个实例。而枚举其实就是多例,一个类有多个实例,但实例的个数不是无穷的,是有限个数的。
2.自定义枚举类:
特点:
1.构造器私有化
2.本类的内部创建一组固定的对象
3.对外提供一个对象(通过为对象添加public final static 修饰符)
4.可以通过get方法,但是不要提供set,防止属性值被修改。
代码:
public class Zuoye03 {
public static void main(String[] args) {
System.out.println(Season.AUTNUM);
}
}
class Season {
private String name;
private String desc;//描述
public static final Season SPRING = new Season("春天", "温暖");
public static final Season WINTER = new Season("冬天", "寒冷");
public static final Season AUTNUM = new Season("秋天", "凉爽");
public static final Season SUMMER = new Season("夏天", "炎热");
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
输出:
Season{name='秋天', desc='凉爽'}
3.enum枚举类:
1.概述:
1.使用关键字 enum 替代class
2. public static final Season SPRING = new Season(“春天”, “温暖”);
直接用SPRING(“春天”, “温暖”),来代替常量名(实参列表)
3.如果有多个常量(对象),那么就用,号隔开
4.如果使用enum 来实现枚举类,要求将定义常量的对象写在最前面
2.常用方法:
1.tostring 方法:
Enum已经重写过了,返回的是当前的对象名,子类可以重写该方法,用于返回对象的属性信息。
2.name:返回的是当前对象名(常量名),子类中不能重写
3.ordinal:返回当前对象的位置号,默认0开始
4.values:返回当前枚举类中所有的常量
5.valueof:将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则包异常。
6.compareto:比较两个枚举常量,比较的是索引序列,用前面的减后面的。为0就是相等。为负就是前面的常量索引序列在前面。