创建字符串对象两种方式的区别
-
通过构造方法创建
通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同
-
直接赋值方式创建
以“ ”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护
向上转型和向下转型的综合使用
在这里,通过Animal和Cat以及Dog三个类来实现向上转型和向下转型的基本实现
- animal.java
在这里,定义了子类所共有的eat方法
// 父类
public class Animal {
public void eat(){
}
}
-Cat.java
Dog继承animal类,如何重写eat方法,并定义了自己特有的catchMouse方法
//子类
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("吃鱼");
}
public void catchMouse(){
System.out.println("抓老鼠!");
}
}
- Dog.java
Dog继承animal类,如何重写eat方法,并定义了自己特有的watchHouse方法
//子类
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("吃骨头");
}
public void watchHouse(){
System.out.println("看家");
}
}
- 测试类
在这里实现向上转型,以及综合使用instanceof,通过定义父类,判断属于哪一个子类
//测试类
public class Test {
public static void main(String[] args) {
//多态形式,创建对象
Animal d = new Dog();
//调用的是Dog的eat
d.eat();//吃骨头
//向上转型
Animal a = new Cat();
//调用的是Cat的eat
a.eat();//吃鱼
//向下转型
Cat c1 = (Cat) a;
//调用的是Cat的catchMouse
c1.catchMouse();//抓老鼠!
//报错方法
//向下转型
Dog d1 = (Dog) c;
// 调用的是Dog的watcHours
// 这段代码可以通过编译,但是运行时,却报出了 ClassCastException,类型转换异常
d1.watchHouse();
/*
* 原因:因为,明明创建了Cat类型对象,运行时,当然不能转换成Dog对象的。
* 这两个类型并没有任何继承关系,不符合类型转换的定义。
为了避免ClassCastException的发生,
Java提供了 instanceof 关键字,给引用变量做类型的校验
*/
/*
* 变量名?instanceof?数据类型
如果变量属于该数据类型,返回true。
如果变量不属于该数据类型,返回false。
*/
//多态形式,创建对象
//向上转型
Animal c = new Cat();
//调用的是Cat的eat
c.eat();//吃鱼
//向下转型
if(c instanceof Cat){
Cat c2 = (Cat)c;
//调用的是Cat的catchMouse
((Cat) c).catchMouse();//抓老鼠!
}else if(c instanceof Dog){
Dog dd = (Dog)c;
//调用的是Dog的watchHouse
dd.watchHouse();//看家
}
}
}