为了不重复代码太多,致使代码很差维护,你们须要学会如何复用代码,代码复用的两种方式,组合和继承安全
组合:在新类中建立现有类的对象
继承:建立现有类的新类ide
class Instrument { public void play() { System.out.println("Instrument.play()"); } } public class Wind extends Instrument { public void play() { System.out.println("Wind.play()"); } } public class Music { public static void tune(Instrument i){ i.play(); } public static void main(String[] args) { Wind flute = new Wind(); Music.tune(flute); // 向上转型 } }
从一个更具体的类型转化为更通常的类型,因此向上转型用挂失安全的。子类可能会比父类包含更多的方法,必须至少具备和父类同样的方法。code
final方法的做用是防止子类经过重写改变方法的行为
类中全部的private方法都是隐式的指定为final,由于不能访问private方法,因此不能重写它。给private方法加上final修饰并不会给方法带来额外的含义。重写一个private方法时编译并不会报错,一个方法是private的,他就不属于父类的一部分,只是建立了一个同名的方法而已对象
final类的做用是该类不容许被继承继承
对于上述向上转型的例子,编译器如何知道该调用哪一个方法,方法的入参只是一个Instrument引用
java采用后期绑定,在运行时根据对象的类型进行绑定,在运行时判断对象的类型,从而调用方法,在编译时编译器不知道对象的类型,java对于static和final方法没法采用后期绑定(private方法也是隐式的final)get
注:多态只是针对于普通方法,对于属性和静态方法不会存在多态
属性在编译时就会被解析编译器
public class Parent { public int field = 0; public int getField(){ return field; } } public class Child extends Parent { public int field = 1; @Override public int getField(){ return field; } } public class TestField { public static void main(String[] args) { Parent parent = new Child(); System.out.println("parent.field= "+parent.field); System.out.println("parent.getField= "+parent.getField()); Child child = new Child(); System.out.println("child.field= "+child.field); System.out.println("child.getField= "+child.getField()); } }
执行结果博客
parent.field= 0 parent.getField= 1 child.field= 1 child.getField= 1
Parent.field和Child。field被分配了不一样的存储空间,Child实际上是存在两个filed属性的:自己的以及父类的,可是在引用Child的field的时候,默认的field属性是来自于自己的,若是要获取父类的该属性,须要使用super.field来显示地指定获取父类属性
可是这种状况通常不会发生,首先属性通常来讲都是私有private的,其次子类和父类通常也不会起相同的属性名字编译
对于静态方法的话,静态方法只与类关联,与对象无关
因为自己的博客百度没有收录,博客地址http://zhhll.icu