[JavaSE] 第一篇 -> 继承
1.什么是继承
继承是 对不同类中相同代码(共性)的抽取 这三个类里面都有名字,都要画画。干脆把这些共有的特征(名字,画画)抽取出来,把这些特征放在Shape类里,让这3个类当Shape类的子类。 class Shape { protected String name; //子类的对象都有名字 public Shape(String name){ //这里子类帮父类构造时要传一个String的参数 this.name=name; } protected void draw(){ //子类的对象对需要画画 System.out.println(this.name+" 在画画"); } } class Cycle extends Shape{ public Cycle(String name) { super(name); //调用父类的构造方法,使子类的实例化对象里有父类的实例 } //重写draw方法 @Override protected void draw() { System.out.println(this.name+" 在画○"); } } class Triangle extends Shape{ public Triangle(String name) { super(name); //调用父类的构造方法 } //重写draw方法 @Override protected void draw() { System.out.println(this.name+" 在画△"); } } 注: 1.语法: 子类 extends 父类 即子类继承父类。 2.继承了除构造方法外的所有东西。 理解:要想继承父类,把父类的成员变量,成员属性统统拿来,要先调用父类的构造方法,再调用自己的构造方法,才能实例化一个对象。这个对象里面才会拥有 -> [父类的成员变量,成员方法] 。即:当前类的对象的空间里一块空间放父类的东西,一块空间放子类自己的东西。 所以 子类的实例包含父类的实例 3.子类的构造方法体中,必须把父类构造方法的调用放在第一行。确保父类构造完在开始子类的构造 4.super :指的是父类对象的引用 a. super( ) :调用父类的构造方法 b. super.data :得到父类的属性 c. super.fun() :调用父类的方法 super是父类的引用,只能调用父类的东西
重写:
1.语法:1. 子类的方法名==父类的方法名 2.参数个数,参数类型同 3.返回类型同 2.用法:当对继承过来的父类的方法不满意时,我们可以在子类中对该方法进行重写。 3.子类重写方法的访问修饰限定符要>=父类被重写方法的访问修饰限定符 ( public > protected > 不写【包访问权限】> private ) 4.重写方法不能被 (以下三个) 修饰 a. private ->私有就不能被其他类访问(包括子类) b. static -> 其修饰的方法可以被继承,但不会被重写。 c. final ->修饰方法(不能被重写)/ 修类(不能被继承)/ 修变量(变常量)
向上转型:
meab: 父类引用 ,引用子类对象 public class Test { public static void play(Shape o){ //父类引用 System.out.println("Shape的儿子们来啦"); o.draw(); } public static void main(String[] args) { Cycle cycle=new Cycle("圈圈"); //子类对象 play(cycle); } //输出: //Shape的儿子们来啦 //圈圈 在画○ 理解:按理说,父类引用只能调用父类的东西,那么这个draw方法应该是打印出“圈圈 在画画”。可是,现在却打印出子类的draw方法(圈圈 在画○)。 这是为啥呢? 因为发生了多态
多态
多态(包含2点): a. 向上转型: 父类引用 ,引用子类对象 b. 运行时绑定: 通过父类引用调用父类和子类同名的覆盖方法 注:1.覆盖/重写/覆写 意思是相同的 2.运行时绑定:编译的时候,那个draw显示的是父类的draw方法,运行的时候却调用的 是子类的同名方法(子类的draw方法) 好处:把不同的子类当父类来看,屏蔽不同子类对象之间的差异,写出通用的代码 用法:A, B ,C 是 D的子类,子类们都重写了父类D的 fun()方法,把子类对象传给父类引用,让父类引用调用fun()方法。 输出的是子类自己的东西 。 这能够使你忘记子类的类型。 只要你是子类对象,传给父类引用就完事了,让父类去调用,管你子类是什么类型
如果有 错误/ 建议/ 小知识拓展/ 补充,欢迎uu们来指点
上一篇:
通过多线程提高代码的执行效率例子