Java近期知识总结
在近期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 之间,会用【缓存常量池】,不会新建对象(地址相同)!超出这个范围,就会新建对象。
更多推荐
所有评论(0)