在近期Java的学习中,知识点有些冗杂,这期就简单整理一下,供大家了解和我自己的复习。
我印象最深的,也是老师强调最多的语句理解是,父类型引用指向子类型对象,这句话听着就晦涩难懂,例如具体语句:Animal cat = new Cat( );根据名称,显然Animal是父类,Cat是子类,这样就可以在表面上初步认识上面那就话了。想要深入理解它,首先还需要明白等号两边各是什么,new的作用以及对方法的理解。
1.new的作用:
(1)创造一块内存空间用于创造一个对象;
(2)object arrtibute assign default value,即关于对象属性默认值赋值,当创建一个对象时,如果类的字段没有显式初始化,它们会被赋予默认值。
(3)在构造方法中的执行过程和调用的构造方法。
当new关键字创建一个对象时,JVM会:在堆中分配一块内存空间;初始化为默认值;执行构造方法体中的代码。其中如果有父类,构造顺序为:父类->实例->当前类。例如:

class Parent {
    Parent() {
        System.out.println("Parent");
    }
}

class Child extends Parent {
    int score = 100;  // 实例变量初始化

    Child() {
        super();       // 可选,默认会调用
        System.out.println("Child, score=" + score);
    }
}

public class Main {
    public static void main(String[] args) {
        Child c = new Child();
    }
}

这里我们需要重点理解(1)和(3)的内容。
2.等号两边的作用:
通常对其的理解为:用于将右侧的值或表达式的结果存储到左侧的变量中。其应理解为:左边是理想,右边是实现(本质)。
3.构造方法:
构造方法不会创造对象,它只可以对对象填充属性。
并且在new创建时它就已经取消返回值类型。
(父类的构造方法中一定要有无参构造)
基本方法:

class ClassName {
    // 构造方法
    ClassName(参数列表) {
        // 初始化代码
    }
}

其中参数列表中一定有一个参数this。
合理使用构造方法重载、this() 和 super() 可以写出更清晰代码。
this(参数):在同一类的构造方法中调用另一个构造方法,避免重复代码。必须放在第一行。
super(参数):在子类构造方法中调用父类的构造方法,也必须放在第一行。两者不能同时使用(因为都要占用第一行)。

class Person {
    String name;
    Person(String name) {
        this.name = name;
    }
}
class Student extends Person {
    int grade;
    Student(String name, int grade) {
        super(name);      // 调用父类构造方法
        this.grade = grade;
    }
}

通过上面三个方面的理解,下面我们可以进行深入的理解。父类和子类的关系图:
在这里插入图片描述
上面为逻辑关系图;
在这里插入图片描述
上面为内存中的关系图;
由上面的图示来看,子类的功能要大于父类,父类只有普通的,通用的方法,而子类具有其特殊的,独特的方法。为什么只能父类型引用指向子类型对象呢,为啥
Cat cat = new Animal( );就不行呢?
因为不能以下犯上,还是上面的解释子类是包含父类的,父类只有简单的通用方法,子类去引用使用父类这是不符合逻辑的。
接着我们继续了解方法:
在这里插入图片描述
内存运行图示:
在这里插入图片描述
现在看来是顺理成章的,其中String()是一个方法;
但是int,char,boolen等是基本数据类型,不是方法(注意:数组引用类型)。
int的包装类是Integer,关系为:
int:栈里直接放数字
Integer:栈里放地址,地址指向堆里的对象。Integer 缓存机制(-128~127)。
在这里插入图片描述
答案为false,因为num与num1的地址不相同,Integer num1 = 12; → 直接用缓存里的对象,
new Integer(12); → 强制新建对象,不走缓存。

在这里插入图片描述
在这里插入图片描述
而这样:

public class Main {
    public static void main(String[] args) {
        String a = new String("hello");
        Integer num = 127;
        Integer num1 = 127;
        System.out.println(num == num1);
    }
}

答案为true;

public class Main {
    public static void main(String[] args) {
        String a = new String("hello");
        Integer num = 128;
        Integer num1 = 128;
        System.out.println(num == num1);
    }
}

答案为false;
因为Integer 在 -128 ~ 127 之间,会用【缓存常量池】,不会新建对象(地址相同)!超出这个范围,就会新建对象。

更多推荐