为什么Java所有事情都要在类中完成?
其实这很简单,因为Java是纯面向对象语言(oop),所有对象都是由类封装起来的,这也是面向对象很重要的封装特性。至于之前学过的比如C++语言,它并不是纯面向对象,所以可以看到比如它的main方法不是在类中完成
Java向上转型、向下转型
1、向上转型
将子类对象转化为父类对象
Animal t = new Dog();
父类Animal
package com.xxxx;
public class Animal {
//睡觉方法
public void sleep() {
System.out.println("Animal sleep");
}
//吃方法
public void eat() {
System.out.println("Animal eat");
}
}
子类Dog
package com.xxxx;
public class Dog extends Animal {
//睡觉方法
public void sleep() {
System.out.println("Dog sleep");
}
//玩方法
public void play() {
System.out.println("Dog play");
}
}
启动类
package com.xxxx;
public class main {
public static void main(String[] args) {
//向上转型
Animal t=new Dog();
t.sleep();//子类的sleep
t.eat();//父类的eat
}
}
此时子类对象Dog转化为父类对象Animal,这时t这个引用调用的方法是子类方法
注意:向上转型时,子类单独定义的方法会丢失,比如Dog类的play方法无法访问了
package com.xxxx;
public class main {
public static void main(String[] args) {
//向上转型
Animal t=new Dog();
t.sleep();//子类的sleep
t.eat();//父类的eat
t.play();
}
}
注意:子类引用不能指向父类对象
Dog t = (Dog)new Animal()//报错
向上转型好处:
减少重复代码
比如很多动物都会睡觉,不用向上转型的话,就要每个动物都写睡觉的方法
public void sleep(Cat c){
c.sleep();
}public void sleep(Dog d){
d.sleep();
}sleep(new Cat());
sleep(new Cat());
sleep(new Dog());
而使用向上转型,则不需要每个动物都写睡觉方法
public void sleep(Animal a){
a.sleep();
}
sleep(new Cat());
sleep(new Cat());
sleep(new Dog());
向下转型
把父类对象转为子类对象
Animal t = new Dog();
Dog g = Dog(t);
启动类
package com.xxxx;
public class main {
public static void main(String[] args) {
//向下转型
Animal t = new Dog();
Dog g = (Dog)t;
g.eat();
g.sleep();
g.play();
}
}
可以看出,向下转型前提是:父类对象指向子类对象,所以得先向上转型
下面是一个案例感觉类型转换instanceof
public void eat(Animal a){
if(a instanceof Dog){
Dog d = (Dog)a;
d.eat();
d.run();
}
if(a instanceof Cat){
Cat c = (Cat)a;
c.eat();
c.run();
}
a.eat();//其他动物只会吃
}