黑马程序员_继承

来源:互联网 发布:淘宝联盟如何身份认证 编辑:程序博客网 时间:2024/04/30 18:31

———– android培训、 java培训

、java学习型技术博客、期待与您交流! ——-

继承

 继承的好处。    1,提高了代码的复用性。    2,让类与类产生了关系,给第三个特征提供了前提。
class  Person{      String name;      int  age;}class Student extends Person{    //Student 这个类中是本来是没有姓名和年龄。但是他从Person这个类中继承了过来。所以,他具有了姓名和年龄。    System.out.println("student ....  学习");}class  Worker  extends  Person{    System.out.println("worker ....  工作");}class  Demo{    public  static void main(String[] args){        Student s=new  Student();        s.name="zs";        s.age=22;        s.study();    }}

单继承和多继承

  java中支持单继承,不直接支持多继承,但对C++中的多继承机制进行改良。 单继承:一个子类只能有一个直接父类。 多继承:一个子类可以有多个直接父类(java中不允许,进行改良)不直接支持,因为多个父类中有相同的成员,因为会产生调用的不确定性。            在java中通过“多实现”的方式来体现。java支持多层(多重)继承。C继承B,B继承A。就会出现继承体系当要使用一个继承体系时,  1,查看该体系中的顶层类,了解该体系的基本功能。  2,创建体系中的最子类对象,完成功能的使用。

什么时候定义继承?

 当类与类之间存在着所属关系的时候,就定义继承。xxx是yyy中的一种。xxx  extends    yyy 所属关系: is a关系。  谁是谁谁的一种简单举一个例子:学生是人的一种。这个句话就符合了is   a的关系,就可以使用继承体系。

继承中:子父类成员的特点体现

 1,成员变量。 2,成员函数。 3,构造函数。

1.成员变量

 当本类的成员和局部变量同名用this区分。 当子父类中的成员变量同名用super区分父类。 this 和super的用法很相似 this:代表一个本类对象的引用。 super:代表一个父类的空间。
class Fu{    int num=4;}class Zi extends Fu{    int num=5; //子类中有就不找父类    void show(){        System.out.println(this.num+"......"+super.num);    }    //子类不能直接访问父类中私有的方法。但是可以通过间接访问}public class Ten1 {    public static void main(String[] args) {        Zi z=new Zi();        z.show();        /*         * 在内存当中的运行过程         *          * 首先,main函数先进栈,产生z,然后在方法区中,会分别开辟         * 2个空间。Fu类和zi类 的空间,他们的方法会全部进去(构造函数,一般方法)。         * 同时在zi类中会有super指向Fu类的空间         *          * 然后,就会在堆中产生一个对象的地址,同时,在这个对象的所属空间中,         * 开辟2个小空间,分别代表子类和父类的空间。         *          * 然后,show方法进栈this.num就会指向堆中zi类小空间,super就会指向父类的小空间         *          *          *          * */    }}

2:子父类中成员函数的特点-覆盖

 当子父类中出现成员函数一模一样的情况,会 运行子类的函数。 这种现象,称为覆盖操作,这是函数在子父类中的特性。 函数两个特性:    1,重载。同一个类中。    2,覆盖。子类中。覆盖也成为重写,覆写。override 覆盖注意事项:  1,子类方法覆盖父类方法时,子类权限必须要大于等于父类的权限。  2,静态只能覆盖静态,或被静态覆盖
class Fu{    void show(){        System.out.println("sss");    }    /*void show1(){        System.out.println("fu show run");    }*/}class Zi extends Fu{    void show(){        System.out.println("ss111s");    }    /*    void show2(){        System.out.println("zi show run");    }*/}public class Twelve1 {    public static void main(String[] args) {        Zi z=new Zi();        z.show();    //z.show1();    //z.show2();        /*在内存中的运行过程         *          * 在方法区里面,开辟一个小空间,Fu类的构造函数,show1()方法都会进去,         * 同时子类也会开辟一个小空间,子类的构造方法和show2()都会进去方法区。         *          * main函数会进栈,产生一个z,在堆里面会出现一个地址,然后地址就会赋给z。         *          * z.show1(),首先会去方法区的中的子类的小空间找。看找不找的到show1。找不到就通过super关键字找父类的空间中有没有show1()。找到了。show1()就会进栈,然后运行         *          * */       }}

覆盖的应用

 什么时候使用覆盖操作?  当对一个类进行子类的扩展时,子类  需要保留父类的功能声明,  但是要定义子类中该功能的特有内容时,就使用覆盖操作完成。
class Phone{    void call(){}    void show(){//手机的来电显示,只能显示电话号码。        System.out.println("number");    }}class newPhone extends Phone{    void show(){//后来新一代的手机,可能显示,姓名,大头贴。同时还可以显示电话号码。    //在这种情况之下就因该使用覆盖。        System.out.println("name");        System.out.println("pic");        super.show();    }}
0 0