08.第十一章:继承和多态(1)

1. 面向对象的编程允许你从已经存在的类中定义新的类 , 这称为继承。
2. 继承使得你可以定义一个通用的类 ( 即父类 ) , 之后扩充该类为一个更加特定的类 ( 即子类 ) 。
3. super关键字
  • 调用父类的构造方法
    构造方法用于构建一个类的实例 。 不同于属性和普通方法 , 父类的构造方法不会被子类继承 。 它们只能使用关键字 super 从子类的构造方法中调用 。
    super () 或者 super ( parameters )
    • 构造方法链
      • 构造方法可以调用重载的构造方法或父类的构造方法 。 如果它们都没有被显式地调用 ,编译器就会自动地将 superO 作为构造方法的第一条语句 。
      • 在任何情况下 , 构造一个类的实例时 , 将会调用沿着继承链的所有父类的构造方法 。 当构造一个子类的对象时 , 子类构造方法会在完成自己的任务之前 , 首先调用它的父类的构造方法 。 如果父类继承自其他类 , 那么父类构造方法又会在完成自己的任务之前 , 调用它自己的父类的构造方法 。 这个过程持续到沿着这个继承体系结构的最后一个构造方法被调用为止。这就是构造方法链 ( constructor chaining ) 。
  • 调用父类的方法 super . 方法名 ( 参数 )
4.方法的重写

子类从父类中继承方法 。 有时 , 子类需要修改父类中定义的方法的实现 , 这称作方法重写 ( method overriding ) 。
注意:

  • 仅当实例方法是可访问时 , 它才能被覆盖 。 因为私有方法在它的类本身以外是不能访问的 , 所以它不能被覆盖 。 如果子类中定义的方法在父类中是私有的 , 那么这两个方法完全没有关系。
  • 与实例方法一样 , 静态方法也能被继承 。 但是 , 静态方法不能被重写。
  • 方法重写具有同样的签名和返回值类型 ; 方法重载具有同样的名字 , 但是不同的参数列表 。
5.多态
  • 使用父类对象的地方都可以使用子类的对象 ,这就是通常所说的多态。简单来说 , 多态意味着父类型的
    变量可以引用子类型的对象 。
  • 动态绑定
Object o = new CeometricObject () ;
System . out . println ( o . toString ( ) );

声明类型:一个变量必须被声明为某种类型 。 变量的这个类型称为它的声明类型 。 这里 , o 的声明类型是 Object 。
实际类型:被变量引用的对象的实际类。 这里 , o 的实际类型是 GeometricObject , 因为 o 指向使用 new GeometricObject()创建的对象。
o 调用哪个toString()方法由 o 的实际类型决定,这称为动态绑定。

6.示例:
  • 方法的重写(仅当实例方法是可访问时 , 它才能被覆盖 ,否则是完全不同的两个方法)
public class Test1 {
    public static void main(String[] args) {
        new Personl().printPerson();
        new Student().printPerson();
    }
}
    class Student extends Personl {
    //因为声明的是private,所以子类的方法与父类的同名方法毫无关系
    //没有重写父类的方法
        private String getlnfo(){
            return "Student";
        }
    }

     class Personl {
         private String getlnfo() {
             return "Person";
         }
         //父类调用父类的getInfo()方法
         public void printPerson() {
             System . out . println (getlnfo()) ;
         }
     }

结果为Person Person

public class Test1 {
    public static void main(String[] args) {
        new Personl().printPerson();
        new Student().printPerson();
    }
}
    class Student extends Personl {
     //声明为public,子类重写了父类的方法,在子类对象调用时,会使用重写的方法
        public String getlnfo(){
            return "Student";
        }
    }

     class Personl {
         public String getlnfo() {
             return "Person";
         }
         //父类调用父类的getInfo()方法,但如果是子类对象调用,父类的getInfo方法已经被重写
         public void printPerson() {
             System . out . println (getlnfo()) ;
         }
     }

结果 Person Student

  • 创建一个对象时 构造函数的运行过程:先调用父类的构造函数,再调用子类的构造函数
ackage java_04_基础习题练习.第11章_继承和多态;

/**
 *
 */
public class Test2_构造函数执行顺序 {
    public static void main(String[] args){
        A a=new A(3);
    }
}
class A extends B{
    public A(int t){
        System.out.println("A's constructor is invoked");
    }

}
class B{
    public B(){
        System.out.println("B's constructor is invoked");
    }
}
public class Test3 {
    public static void main(String[] args){
        //直接调用A1的构造函数,i=40
        new A1();
        //1.B1继承自A1,先去执行A1,给i赋值i=7;
        //2.调用A1的构造函数,由于setI()方法被子类重写,所以此时调用的是子类的setI()方法,i=60
        //3.i from A is 60
        //4.调用B1的构造函数,i在A1中已经被赋值60,所以i from B is 60
        new B1();
    }
}

class A1{
    int i=7;
    public A1(){
        setI(20);
        System.out.println("i from A is "+i);
    }

    public void setI(int i){
        this.i=2*i;
    }
}

class B1 extends A1{
    public B1(){
        System.out.println("i from B is "+i);
    }
    public void setI(int i){
        this.i=3*i;
    }
}
  • instanceof:
    在尝试转换之前确保该对象是另一个对象的实例,可以利用运算符 instanceof来实现。
    警告 : 对象成员访问运算符 ( . ) 优先于类型转换运算符 。 使用圆括号保证在点运算符 ( • )
    之前进行转换 , 例如 :( ( Circle) object ) . getArea();
7.Object 类的 equals 方法

Object类中方法的默认实现:

//这个实现使用 == 运算符检测两个引用变量是否指向同一个对象。
//因此 , 应该在自己的客户类中重写这个方法 , 以测试两个不同的对象是否具有相同的内容 。
public boolean equals ( Object o ){
   return(this==obj);
}

调用语法:object1. equals ( object2 ) ;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容