深究继承示例(多态,继承,构造函数)

关于继承,为什么一直说在含有构造函数的继承中,父类中一定要有不含参数的构造函数才可以。

首先说明默认值的一个知识点:在定义全局变量的时候,即使不给变量赋值,变量也是有值的,比如整形变量的默认值是0

package day07;

public class Trys {
    private static int  p ;
    public static void main(String[] args) {

        System.out.println(p);
    }

}0

*但是局部变量就必须赋值,不赋值是没法输出的。

其次说明一个多态的知识点:

像Father father = new Son(); 这样的吧,这有一种专业说法,叫“父类引用指向子类对象”。 首先 new Son();是肯定动态创建了一个子类对象的 。 Father father 则是一个创建了一个父类引用对象。 Father father = new Son(); 就是将父类引用指向子类对象,这是java里很常用的用法。 这时候如果用father调用方法father.method() ;如果method()方法只有父类有,子类里没有写。那么就调用父类里那个方法体。如果在子类里有对method()进行了重写(注意是重写不是重载), 那么就调用子类里的那个方法体。

当创建的子类对象需要访问到父类构造函数的时候,如果父类中没有显写的构造函数,那么会访问父类中默认的空构造,如果有构造函数,那么空构造失效,如果显写的构造函数不含参数,那么当子类需要访问到父类构造函数的时候不需要用到super关键字,但是如果父类中的构造函数含有参数的话,子类中需要访问到父类的构造函数的话需要在函数的首行写super(参数)举个例子(注意私有变量只能在本类中有效)

package day07;

class SuperClass {
    private int number;

    public SuperClass() {
        this.number = 0;
        System.out.println(this.number+" "+number+" "+"1111111111111111111");
    }

    public SuperClass(int number) {
        this.number = number;
        System.out.println(this.number+" "+number+" "+"22222222222222222222");

    }

    public int getNumber() {
        System.out.println(this.number+" "+number+" "+"0000000000000000000");
        number++;
        System.out.println(this.number+" "+number+" "+"0000000000000000000");
        return number;
    }
}

class SubClass1 extends SuperClass {
    public SubClass1(int number) {
//        super(number);
    }

}

class SubClass2 extends SuperClass {
    private int number;

    public SubClass2(int number) {
//        super(number);
        System.out.println("77777777777777777"+"  "+number);
    }
    }

public class Extends1 extends SuperClass {

    private int number;//有默认值,默认值为0

    public Extends1(int number) {
//        super(number);
        System.out.println("44444444444444"+"  "+number);
    }

    public int getNumber() {
        System.out.println(this.number+" "+number+" "+"55555555555555555555");
        number++;
        System.out.println(this.number+" "+number+" "+"55555555555555555555");
        return number;
    }

    public static void main(String[] args) {
        SuperClass ss = new SuperClass(20);
        System.out.println(ss.getNumber());
        System.out.println("\n\n");

        SuperClass s = new Extends1(20);
        System.out.println(s.getNumber());
        System.out.println("\n\n");

        SuperClass s1 = new SubClass1(20);
        System.out.println(s1.getNumber());
        System.out.println("\n\n");

        SuperClass s2 = new SubClass2(20);
        System.out.println(s2.getNumber());
        //结论一:多态时,当子类覆盖了父类的方法,使用子类覆盖的方法
        //结论二:当子类覆盖父类的成员变量时,父类方法使用的是父类的成员变量,子类方法使用的是子类的成员变量
    }

}

20 20 22222222222222222222
20 20 0000000000000000000
21 21 0000000000000000000
21



0 0 1111111111111111111
44444444444444 20
0 0 55555555555555555555
1 1 55555555555555555555
1



0 0 1111111111111111111
0 0 0000000000000000000
1 1 0000000000000000000
1



0 0 1111111111111111111
77777777777777777 20
0 0 0000000000000000000
1 1 0000000000000000000
1

 

再比如:

package day07;

class SuperClass {
    private int number;

//    public SuperClass() {
//        this.number = 0;
//        System.out.println(this.number+" "+number+" "+"1111111111111111111");
//    }

    public SuperClass(int number) {
        this.number = number;
        System.out.println(this.number+" "+number+" "+"22222222222222222222");

    }

    public int getNumber() {
        System.out.println(this.number+" "+number+" "+"0000000000000000000");
        number++;
        System.out.println(this.number+" "+number+" "+"0000000000000000000");
        return number;
    }
}

class SubClass1 extends SuperClass {
    public SubClass1(int number) {
        super(number);
    }

}

class SubClass2 extends SuperClass {
    private int number;

    public SubClass2(int number) {
        super(number);
        System.out.println("77777777777777777"+"  "+number);
    }
    }

public class Extends1 extends SuperClass {

    private int number;//有默认值,默认值为0

    public Extends1(int number) {
        super(number);
        System.out.println("44444444444444"+"  "+number);
    }

    public int getNumber() {
        System.out.println(this.number+" "+number+" "+"55555555555555555555");
        number++;
        System.out.println(this.number+" "+number+" "+"55555555555555555555");
        return number;
    }

    public static void main(String[] args) {
        SuperClass ss = new SuperClass(20);
        System.out.println(ss.getNumber());
        System.out.println("\n\n");

        SuperClass s = new Extends1(20);
        System.out.println(s.getNumber());
        System.out.println("\n\n");

        SuperClass s1 = new SubClass1(20);
        System.out.println(s1.getNumber());
        System.out.println("\n\n");

        SuperClass s2 = new SubClass2(20);
        System.out.println(s2.getNumber());
        //结论一:多态时,当子类覆盖了父类的方法,使用子类覆盖的方法
        //结论二:当子类覆盖父类的成员变量时,父类方法使用的是父类的成员变量,子类方法使用的是子类的成员变量
    }

}

20 20 22222222222222222222
20 20 0000000000000000000
21 21 0000000000000000000
21



20 20 22222222222222222222
44444444444444 20
0 0 55555555555555555555
1 1 55555555555555555555
1



20 20 22222222222222222222
20 20 0000000000000000000
21 21 0000000000000000000
21



20 20 22222222222222222222
77777777777777777 20
20 20 0000000000000000000
21 21 0000000000000000000
21

 

再比如:

package day07;

class SuperClass {
    private int number;

    public SuperClass() {
        this.number = 0;
        System.out.println(this.number+" "+number+" "+"1111111111111111111");
    }

    public SuperClass(int number) {
        this.number = number;
        System.out.println(this.number+" "+number+" "+"22222222222222222222");

    }

    public int getNumber() {
        System.out.println(this.number+" "+number+" "+"0000000000000000000");
        number++;
        System.out.println(this.number+" "+number+" "+"0000000000000000000");
        return number;
    }
}

class SubClass1 extends SuperClass {
    public SubClass1(int number) {
        super(number);
    }

}

class SubClass2 extends SuperClass {
    private int number;

    public SubClass2(int number) {
        super(number);
        System.out.println("77777777777777777"+"  "+number);
    }
    }

public class Extends1 extends SuperClass {

    private int number;//有默认值,默认值为0

    public Extends1(int number) {
        super(number);
        System.out.println("44444444444444"+"  "+number);
    }

    public int getNumber() {
        System.out.println(this.number+" "+number+" "+"55555555555555555555");
        number++;
        System.out.println(this.number+" "+number+" "+"55555555555555555555");
        return number;
    }

    public static void main(String[] args) {
        SuperClass ss = new SuperClass(20);
        System.out.println(ss.getNumber());
        System.out.println("\n\n");

        SuperClass s = new Extends1(20);
        System.out.println(s.getNumber());
        System.out.println("\n\n");

        SuperClass s1 = new SubClass1(20);
        System.out.println(s1.getNumber());
        System.out.println("\n\n");

        SuperClass s2 = new SubClass2(20);
        System.out.println(s2.getNumber());
        //结论一:多态时,当子类覆盖了父类的方法,使用子类覆盖的方法
        //结论二:当子类覆盖父类的成员变量时,父类方法使用的是父类的成员变量,子类方法使用的是子类的成员变量
    }

}

20 20 22222222222222222222
20 20 0000000000000000000
21 21 0000000000000000000
21



20 20 22222222222222222222
44444444444444 20
0 0 55555555555555555555
1 1 55555555555555555555
1



20 20 22222222222222222222
20 20 0000000000000000000
21 21 0000000000000000000
21



20 20 22222222222222222222
77777777777777777 20
20 20 0000000000000000000
21 21 0000000000000000000
21

 
时间: 2024-10-23 02:47:27

深究继承示例(多态,继承,构造函数)的相关文章

课堂笔记--初识继承和多态 继承

第六章 初始继承和多态 继承:一个类可以使用另一个类的属性和方法(成为该类的成员) 子类继承父类使用的符号是冒号 子类不能继承父类的构造方法 子类不能访问父类的私有字段和方法 在调用子类构造的时候,没有使用base关键字调用父类的指定构造,那么默认调用父类的无参构造. 定义一个Person类 class Person { public string Name { get; set; } public Gender Sex { get; set; } public void SayHello()

面向对象的封装、继承、多态以及构造函数

1.面向对象特点:封装.继承.多态.2.构造函数 = 构造器 + 原型对象;(1)父类function UserClass(name,age,word){ //构造器 constructor this.name=name; this.age =age; this.word =word; this.init =function(){ return `${this.name} ----init初始化`; }}UserClass.prototype={ //原型对象 prototype 只能实例化之后

(一)Python入门-6面向对象编程:07面向对象三大特征(封装、继承、多态)-继承

一:面向对象三大特征介绍 Python是面向对象的语言,也支持面向对象编程的三大特性:继承.封装(隐藏).多态. 封装(隐藏) 隐藏对象的属性和实现细节,只对外提供必要的方法.相当于将“细节封装起来”,只 对外暴露“相关调用方法”. 通过前面学习的“私有属性.私有方法”的方式,实现“封装”.Python 追求简洁的语法,没有严格的语法级别的“访问控制符”,更多的是依靠程序员自觉实现. 继承 继承可以让子类具有父类的特性,提高了代码的重用性. 从设计上是一种增量进化,原有父类设计不变的情况下,可以

面向对象的三大特性(封装、继承、多态)-----继承

继承有几点应该注意的是: 继承要在子类加上父类的类名 子类和父类都有的方法,优先找子类的方法 python里面可以继承多个类C#,java 不可以多继承 如果继承多个类,继承顺序为从左至右 Python 3 里面的继承可以多继承,通过继承,可以获得父类的功能,继承的时候,如果父类中有重复的方法,优先找自己. class A: def f(self): print('a') class B: def f(self): print('b') def f1(self): print('bbbb') c

c/c++ 继承与多态 继承中的public, protected, private

问题:类B私有继承类A,类A有个protected成员,那么在类B的成员函数里是否可以使用类A的protected成员? 可以使用. 估计有的同学说不对吧,类B都私有继承了类A了,怎么还能访问类A的protect成员呢?请看下面的例子.在类Pri_derv的f()成员函数里是可以方位父类Base的pub_mem();和prot_mem;的. class Base{ public: void pub_mem(); protected: int prot_mem; private: char pri

3. 第一章:C#面向对象编程之继承和多态

第一章:C#面向对象编程 第二节:继承和多态 继承可以让class具有一种特殊的能力,即实现class本身定义的所有功能外,还可以对父类(或称为基类.超类)的某些属性和功能进行扩展,这样的类我们称之为子类(或派生类). 继承有如下的几个规则: 1. 可传递性: 如: C是B的子类,B是A的子类,那么C会同时继承B和A:(object为所有类的基类) 2. 唯扩展性: 子类应是对父类的扩展,而不能在子类除去父类里面的定义: 3. 构造函数和析构函数不能被继承: 除去构造函数和析构函数不能被继承,其

面向对象(一)—继承与多态

又一次深入的学习设计模式,发现了很多以前感觉不是问题的问题,这才发现原来自己不是真的理解了.通过这次的深入学习,才开始慢慢感受到OO的魅力所在. 从C#学习到设计模式,再到机房收费系统个人版和合作版,再到我们做的项目,我们真正的朝着面向对象编程了吗?我的项目中,先不说泛型.委托.集合的利用率,就是基本的继承.多态用的少之又少. 下面将为大家解说"OO引领编程"之--继承和多态 继承篇 一.简介 俗话说:龙生龙凤生凤,老鼠的儿子会打洞.可以理解为,继承就是小辈拥有父辈流传下来的东西. 在

Python 面向对象的三大特性:封装,继承,多态

# 面向对象的三大特性:封装,继承,多态 # 继承的影响:资源的继承,资源的使用,资源的覆盖,资源的累加 # 资源的继承,在Python中的继承是指能使用父类的资源,而不是说在子类也复制一份父类代码到子类中 class Animate: a = 1 # 公有的资源 _b = 2 # 受保护的资源 __c = 3 # 私有的资源 def t1(self): print("t1") def _t2(self): print("t2") def __t3(self): p

c# 中面相对性的三个特点:封装,继承,多态, 以及c#中隐藏(new)和方法重写(override)和重载(overload)的区别

封装 1)封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问,通常有两种访问方式:set 设置,get 获取. 2)封装结果:存在但是不可见. 3) 访问修饰符 声明的可访问性                                 含义 public                                    访问不受限制. protected                              访问仅限于本类或者其子类(可以跨程序集). p

Java基础——封装、继承、多态

Java基础--封装.继承.多态 --小实例快速成长 抽象: 1.目的:将复杂的东西简单化,将繁乱的内容有序化. 2.过程:对相同.相似的东西合而为一,对不同的内容进行归门别类. 3.结果:类.接口. 封装: 1.目的:化零为整,将零散的内容进行归属,进行权限控制. 2.过程:将某对象的属性.方法(功能)统一到其名下,并分别设置.适当的权限进行控制管理. 3.结果:对象,接口. 继承: 1.求大同存小异:在一个系列内,大部分都有的内容,就划归父类:子类将父类的内容继承过来,可以有自身的一些发展和