从一道例题看Java类、实例初始化的顺序

例题:

class Father{
	private int i = test();	
	private static int j = method();
		
	static {
		System.out.print("(F1)");
	}
	
	Father(){
		System.out.print("(F2)");
	}
	
	{
		System.out.print("(F3)");
	}
	
	public int test() {
		System.out.print("(F4)");
		return 1;
	}
	
	public static int method() {
		System.out.print("(F5)");
		return 1;
	}
	
}

class Son extends Father{
    private int i = test();	
	private static int j = method();
	
	static {
		System.out.print("(S6)");
	}
	
	Son(){
		System.out.print("(S7)");
	}
	
	{
		System.out.print("(S8)");
	}
	
	public int test() {
		System.out.print("(S9)");
		return 1;
	}
	
	public static int method() {
		System.out.print("(S10)");
		return 1;
	}
}

public class ClassInitOrder {
	public static void main(String[] args) {
		Son s1 = new Son();    // (F5)(F1)(S10)(S6)(S9)(F3)(F2)(S9)(S8)(S7)
		System.out.println();		
		Son s2 = new Son();	   // (S9)(F3)(F2)(S9)(S8)(S7)

	}
}

summarize:

类初始化的过程:

  1. 一个类要创建实例需要先加载并初始化该类 (main方法所在的类需要先加载和初始化)
  2. 一个子类要初始化需要先初始化父类
  3. 一个类初始化就是执行<clinit>()方法

   

 

实例初始化的过程:

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我了解了您的问题。让我来回答您的问题。 MyDate 是一个日期,它可以存储年、月、日的信息,并且能够对日期进行一些操作。下面是完善后的 MyDate 的代码示例: ```java public class MyDate { private int year; private int month; private int day; public MyDate(int year, int month, int day) { this.year = year; this.month = month; this.day = day; } public int getYear() { return year; } public int getMonth() { return month; } public int getDay() { return day; } public void setYear(int year) { this.year = year; } public void setMonth(int month) { this.month = month; } public void setDay(int day) { this.day = day; } public void setDate(int year, int month, int day) { this.year = year; this.month = month; this.day = day; } public String toString() { return String.format("%04d-%02d-%02d", year, month, day); } public boolean equals(Object obj) { if (obj instanceof MyDate) { MyDate date = (MyDate) obj; return year == date.year && month == date.month && day == date.day; } return false; } public int hashCode() { final int prime = 31; int result = 1; result = prime * result + day; result = prime * result + month; result = prime * result + year; return result; } public MyDate nextDay() { int nextDay = day + 1; int nextMonth = month; int nextYear = year; if (nextDay > getDaysInMonth(year, month)) { nextDay = 1; nextMonth++; if (nextMonth > 12) { nextMonth = 1; nextYear++; } } return new MyDate(nextYear, nextMonth, nextDay); } public MyDate nextMonth() { int nextMonth = month + 1; int nextYear = year; if (nextMonth > 12) { nextMonth = 1; nextYear++; } int maxDay = getDaysInMonth(nextYear, nextMonth); int nextDay = Math.min(day, maxDay); return new MyDate(nextYear, nextMonth, nextDay); } public MyDate nextYear() { int nextYear = year + 1; int maxDay = getDaysInMonth(nextYear, month); int nextDay = Math.min(day, maxDay); return new MyDate(nextYear, month, nextDay); } private int getDaysInMonth(int year, int month) { switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; case 2: if (isLeapYear(year)) { return 29; } else { return 28; } default: throw new IllegalArgumentException("Invalid month: " + month); } } private boolean isLeapYear(int year) { if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { return true; } else { return false; } } } ``` 在这个中,我们实现了以下方法: - 构造方法 MyDate(int year, int month, int day):用于创建一个日期对象。 - getYear()、getMonth()、getDay():用于获取年、月、日。 - setYear()、setMonth()、setDay():用于设置年、月、日。 - setDate(int year, int month, int day):用于设置年、月、日。 - toString():用于以字符串形式返回当前日期。 - equals(Object obj):用于判断当前日期是否与另一个日期相等。 - hashCode():用于生成当前日期的哈希码。 - nextDay()、nextMonth()、nextYear():用于获取当前日期的下一天、下一个月、下一年。 - getDaysInMonth(int year, int month):用于获取指定年月的天数。 - isLeapYear(int year):用于判断指定年是否为闰年。 这些方法可以帮助我们对日期进行各种操作,比如获取下一天的日期、判断两个日期是否相等等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值