为什么可以向上转型?
我们在继承的时候,为导出类提供方法和属性不是重要的,“导出类是基类的一种类型”,这种关系是需要我们重视的,对次关系最为合理的解释便是向上转型了。
class Instrument {
public void paly() {
System.out.println("1111111111");
}
static void function(Instrument instrument) {//自己调用自己
instrument.paly();
}
}
public class Wind extends Instrument {
public static void main(String[] args) {
Wind wind = new Wind();
Instrument.function(wind);//向function传入导出类(子类)的实例,会自己动转向基类(父类)的引用。(向上转型)
}
}
//Output:
1111111111
如果我们需要向上转型,那么我们必须要使用继承。
思考?普通的方法可以被继承覆写(重写),那么静态方法呢?静态域呢?<br /> java中静态域能被继承吗?
package com.it.chapter07;
class Foo{
static String name="asd";
static String str1="ccc";
public static void getName(){
System.out.println("Foo中的name"+name);
}
}
class Soo extends Foo{
static String name="foo";
/* @Override//不能被重写,所以也就不能实现多态
public static void getName(){
System.out.println("Foo中的name"+name);
}*/
}
public class StaticDemo {
public static void main(String[] args) {
Soo.getName();//调用的是父类的方法
System.out.println(Foo.name);
System.out.println(Soo.str1);
Foo foo=new Soo();
foo.getName();
}
}
Foo中的nameasd
asd
ccc
Foo中的nameasd
我们发现java中的静态域和静态方法不能被重写,但可以被继承。<br />到这里我们会思考?我们什么时候要去用向上转型呢?在那样的业务场景中会用到呢?
package com.zx.test07.test07_01;
import java.util.concurrent.CopyOnWriteArrayList;
class Computer {
//电脑主要硬件
String name;
public void frame(Computer computer) {
System.out.println("ASUA");
computer.yingpan();
}
//硬盘
void yingpan() {
System.out.println( "512硬盘");
}
}
public class UpDemo extends Computer {
void yingpan() {
System.out.println("机械硬盘");
}
public static void main(String[] args) {
Computer computer = new Computer();
computer.frame(computer);
System.out.println("为电脑换硬盘后+ ");
UpDemo upDemo = new UpDemo();
upDemo.frame(upDemo);
}
}
//Output:
ASUA
512硬盘
为电脑换硬盘后+
ASUA
机械硬盘
我们在为电脑更换硬盘时,并不需要为该变电脑的整体只需要更换硬盘就好。同样的,我们在程序中如果要固定某个流程,那么我们就可以把一些需要优化的拿出来,由子类去优化。