由类创建一个对象,JVM 内存中发生了哪些事情?
MyClassmg=newMyClass0:以这条语句为例,MyClassmc使虚拟机栈中生成了一个指向MyClass对象的地址:newMyClassO则在堆中分配了对象mc成员变量的空间
Integer缓冲池
在java的Integer类中包含一个缓存Integercache,当使用对象化的整数值时,如果缓存中己经存在,则不会新建立。默认缓存值的范围为-128到127之间
Integert1=-129;
Integert2=-129;
//针对两个Integer对象执行地址的比较
System.out.printin(t1==t2);//false
//调用t1对象中的equa1s方法进行数值的比较
System.out.printin(t1.equals(t2));
String缓冲池
String中包含一个缓存池,当使用某个字符串对象时会首先在缓存池中进行查找,如果存在则直接返回这个对象的地址;如果不存在则会在缓存池中进行创建,创建完成后返回地址
Strings1="abc";
Strings2="abc";
System.out.printin(s1==s2);
System.out.printin(s1.equals(s2));
Strings3="ab"+"c";
System.out.printin(s3==s1);
Strings4="ab";
Strings5=s4+"c";
System.out.printin(s1==s5);//false
Strings6=newString("abc");//创建了几个对象
System.out.printin(s6==s1);//false
多态性
多态性是发送消息给某个对象,让该对象自行决定响应何种行为。通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用
package demo;
public class work1 {
public static void main(String[] args) {
A1 a = new A1();
a.pp(); // A1....pp无参
a.pp(12); // A1....pp int
}
}
class A1 {
public void pp() {
System.out.println("A1....pp无参");
}
public int pp(int kk) {
System.out.println("A1....pp int");
return 100;
}
}
多态性通过允许同一界面指定一类动作减少了程序的复杂度,编译器工作就是选择适用于各个情况的特定动作,而程序员则无须手动进行选择,使用者仅仅是记得以及利用这个统一的界面
多态形成的三个必要条件:
- 有继承,父类定义方法,子类重写方法
- 父类的引用指向子类的对象
- 可以使用参数传递时多态,也可以直接创建对象时多态
多态可以用三个定义和两个方法来总结。三个定义分别是父类定义子类构建、接口定义实现类构建和抽 象类定义实体类构建,而两个方法分别是方法重载和方法重写。
多态分为两种:
- 编译时多态:方法的重载
- 运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行 时多态
方法的覆盖
- 方法覆盖要求方法的签名一致
- 方法名称必须一致
- 范围限定词要求子类种定义的方法范围需要大于等于父类种方法的范围
- 返回值类型应该一致,也可以是子类返回类型是父类类型的子类
- 参数必须一致,父子类型也不允许
- 如果方法抛出异常,子类方法抛出的异常应该等于父类异常或者是父类异常的子类型