在做京东笔试的时候,有几道涉及到类加载机制的题,目前结果大概搞明白了,但是原理没有搞明白。先把结果放在这,等搞明白了原理再来修改。 程序代码大概是这样的:
public static final String str = "Base";
public class ClassLoadTest {
public static void main(String[] args) {
// new Child();
System.out.println(Child.str);
//new Child();
}
}
class Base {
// public static String str = "Base";
public static final String str = "Base";
public Base() {
System.out.println("Base Construct Statement");
}
{
System.out.println("Base Normal Statement");
}
static {
System.out.println("Base Static Statement");
}
}
class Child extends Base {
// public static String str = "Child";
// public static final String str = "Child";
public Child() {
System.out.println("Child Construct Statement");
}
{
System.out.println("Child Normal Statement");
}
static {
System.out.println("Child Static Statement");
}
}
将会输出:
Base
可以看出并没有加载父类 Base 与子类 Child
public static String str = "Base";
package exam.jingdong180909;
public class ClassLoadTest {
public static void main(String[] args) {
// new Child();
System.out.println(Child.str);
//new Child();
}
}
class Base {
public static String str = "Base";
// public static final String str = "Base";
public Base() {
System.out.println("Base Construct Statement");
}
{
System.out.println("Base Normal Statement");
}
static {
System.out.println("Base Static Statement");
}
}
class Child extends Base {
// public static String str = "Child";
// public static final String str = "Child";
public Child() {
System.out.println("Child Construct Statement");
}
{
System.out.println("Child Normal Statement");
}
static {
System.out.println("Child Static Statement");
}
}
将会输出:
Base Static Statement
Base
可以看出并没有加载子类 Child
public static final String str = "Child";
public class ClassLoadTest {
public static void main(String[] args) {
// new Child();
System.out.println(Child.str);
//new Child();
}
}
class Base {
// public static String str = "Base";
// public static final String str = "Base";
public Base() {
System.out.println("Base Construct Statement");
}
{
System.out.println("Base Normal Statement");
}
static {
System.out.println("Base Static Statement");
}
}
class Child extends Base {
// public static String str = "Child";
public static final String str = "Child";
public Child() {
System.out.println("Child Construct Statement");
}
{
System.out.println("Child Normal Statement");
}
static {
System.out.println("Child Static Statement");
}
}
将会输出:
Child
public static String str = "Child";
public class ClassLoadTest {
public static void main(String[] args) {
// new Child();
System.out.println(Child.str);
//new Child();
}
}
class Base {
// public static String str = "Base";
// public static final String str = "Base";
public Base() {
System.out.println("Base Construct Statement");
}
{
System.out.println("Base Normal Statement");
}
static {
System.out.println("Base Static Statement");
}
}
class Child extends Base {
public static String str = "Child";
// public static final String str = "Child";
public Child() {
System.out.println("Child Construct Statement");
}
{
System.out.println("Child Normal Statement");
}
static {
System.out.println("Child Static Statement");
}
}
将会输出:
Base Static Statement
Child Static Statement
Child
- 同时添加
public static String str = "Base";与public static String str = "Child";
public class ClassLoadTest {
public static void main(String[] args) {
// new Child();
System.out.println(Child.str);
//new Child();
}
}
class Base {
public static String str = "Base";
// public static final String str = "Base";
public Base() {
System.out.println("Base Construct Statement");
}
{
System.out.println("Base Normal Statement");
}
static {
System.out.println("Base Static Statement");
}
}
class Child extends Base {
public static String str = "Child";
// public static final String str = "Child";
public Child() {
System.out.println("Child Construct Statement");
}
{
System.out.println("Child Normal Statement");
}
static {
System.out.println("Child Static Statement");
}
}
Child 将会覆盖 Base 类 str 属性,将会输出:
Base Static Statement
Child Static Statement
Child
- 同时添加
public static final String str = "Base";与public static final String str = "Child";:
public class ClassLoadTest {
public static void main(String[] args) {
// new Child();
System.out.println(Child.str);
//new Child();
}
}
class Base {
// public static String str = "Base";
public static final String str = "Base";
public Base() {
System.out.println("Base Construct Statement");
}
{
System.out.println("Base Normal Statement");
}
static {
System.out.println("Base Static Statement");
}
}
class Child extends Base {
// public static String str = "Child";
public static final String str = "Child";
public Child() {
System.out.println("Child Construct Statement");
}
{
System.out.println("Child Normal Statement");
}
static {
System.out.println("Child Static Statement");
}
}
Child 将会覆盖 Base 类 str 属性,将会输出:
Child
- 添加
new Child():
public class ClassLoadTest {
public static void main(String[] args) {
// new Child();
System.out.println(Child.str);
new Child();
}
}
class Base {
// public static String str = "Base";
public static final String str = "Base";
public Base() {
System.out.println("Base Construct Statement");
}
{
System.out.println("Base Normal Statement");
}
static {
System.out.println("Base Static Statement");
}
}
class Child extends Base {
// public static String str = "Child";
public static final String str = "Child";
public Child() {
System.out.println("Child Construct Statement");
}
{
System.out.println("Child Normal Statement");
}
static {
System.out.println("Child Static Statement");
}
}
将会输出:
Child
- 若给
Main添加静态语句块,构造函数,匿名构造函数:
public class ClassLoadTest {
static {
System.out.println("Main Static Statement");
}
{
System.out.println("Main Normal Statement");
}
public ClassLoadTest() {
System.out.println("Main Construct Statement");
}
public static void main(String[] args) {
// new Child();
System.out.println(Child.str);
new Child();
}
}
class Base {
// public static String str = "Base";
public static final String str = "Base";
public Base() {
System.out.println("Base Construct Statement");
}
{
System.out.println("Base Normal Statement");
}
static {
System.out.println("Base Static Statement");
}
}
class Child extends Base {
// public static String str = "Child";
public static final String str = "Child";
public Child() {
System.out.println("Child Construct Statement");
}
{
System.out.println("Child Normal Statement");
}
static {
System.out.println("Child Static Statement");
}
}
则输出:
Main Static Statement
Child
Base Static Statement
Child Static Statement
Base Normal Statement
Base Construct Statement
Child Normal Statement
Child Construct Statement