Java基础(二)继承剖析

继承剖析

若是要直接调用父类的构造方法,不调用子类的方法则需要使用的是super()关键字

Publicclass Child extends Parent

{

         Public Child()

         {

                   Super(1);//此方法是显示的调用父类的方法,不会再采用默认的方法机制

                   System.out.println(“child!”);

}

 

Public static void main(String[] args)

{

         Child child = new Child();

}

}

 

ClassParent

{

         Public Parent(int i)

         {

                   System.out.println(“Parent!”);

}

}

 

当生成子类的时候,Java默认先调用父类的不带参数的构造方法,然后再执行子类的构造方法,生成子类对象

 

3super关键字:super表示对父类对象的引用

如果子类使用的是super()显式调用父类的某个构造方法,那么在执行的时候就会寻找与super()所对应的构造方法而不会去寻找父类的不带参数的构造方法,与this一样,sueper

也必须作为构造方法的第一条执行语句,前面不能有其他可执行语句

 

例子程序;

Publicclass InhertanceTest

{

         Public static void main(String[] args)

         {

                   Apple apple = new Apple();

                   System.out.println(apple.name);

}

}

ClassFruit

{

         String name=”fruit”;

}

ClassApple extends Fruit

{

         String name=”apple”;

}

关于继承的三点:

 

(a)   父类有的,子类也有

(b)   父类没有的,子类也可以增加

(c)    父类有的,子类可以改变他

关于继承的注意事项

(a)   构造方法不能被继承

(b)   方法和属性可以被继承

(c)    子类的构造方法隐式调用父类的不带参数的构造方法

(d)   当父类没有不带参数的构造方法的时候,子类需要使用super()来显式的调用父类的构造方法 ,super指的是对父类的引用

(e)   Super关键字必须是构造方法的第一行语句

 

 

继承举例:

 

public class InheritanceTest

{

         Public static void  main(String[] args)

         {

                   Dog dog = new Dog();

                   Dog.run();

}

}

 

ClassAnimal

{

         Public void run()

         {

                   System.out.println(“animal is running!”);

}

}

ClassDog extends Animal

{

         Public void run()

         {

                   System.out.println(“dog is running!”);

}

 

/*我采用这种方式来写代码看看执行的结果是什么*/

Public void run(int I )

{

         System.out.println(“dogis running!”)

}

}

 

6方法重写(Override):子类与父类的方法返回类型一样,方法名称一样,参数一样,这样我们说子类与父类构成了重写关系

方法的重写和方法重载的关系:重载发生在一个类内部的两个或者多个方法,重写发生在父类和子类之间。【重写一定伴随着继承发生的】

8super关键字:super表示对父类对象的引用

9如果子类使用super()显式调用父类的某个构造方法,那么在执行的时候就会寻找与super()所对应的构造方法而不会再去寻找父类的不带参数的构造方法 与this一样 super也要作为构造方法里的第一句所执行的代码

 

继承肯定生成了多个对象,比如儿子继承父亲,那一定生成2个对象

10

当两个方法构成重写关系的时候,可以在子类方法中通过super.run()形式调用父类的run()方法,其中super.run()不必放在第一句语句,因此此时父类的对象已经构造完毕,先调用父类的run()方法还是先调用子类的run()方法是根据程序的逻辑顺序所决定的

11 在定义一个类的时候,若是没有显式的调用某个父类,那么该类就会继承于java.lang.Object类(JDK提供的一个类,Object类是Java中所有类的直接或间接的父类)

Publicclass InheritenceTest3

{

         Public static void main(String[] args)

         {

                   Son son=new Son();

}

}

ClassGrandpa

{

         Public Grandpa()

{

     System.out.println(“gandpa”);

}

}

 

ClassFather extends Grandpa

{

         Public Father()

         {

                   System.out.println(“father”);

}

}

 

ClassSon extends Father

{

         Father()

         {

                   System.out.println(“Son”);

}

}///继承了3次 所以应该会生成3个对象  依次从上往下进行构造

 

12 多态(Polymorphsim)

 

Publicclass PolyTest

{

         Public static void main(String[] args)

         {

         //     Rose rose = new Rose();

 

Flower rose =new Rose();//多态的应用   父类型的引用可以指向子类的对象---》多态

                   Rose.sing();

}

}

 

ClassFlower

{

         Public Flower()

         {

                  

}

Public void sing()

{

         System.out.println(“floweris singing !”);

}

}

 

ClassRose extends Flower

{

         Public Rose()

         {

 

}

}

 

JavaSE  多态

1      多态;

2        public class PolyTest

3        {

   Public static void main(String[] args)

{

      Parent parent = newParent();

      Parent.sing();

                   Child child = new Child();

                   Child.sing();

                   Parent p = new Parent();  //父类引用指向子类对象

                   p.sing();//指向谁就会调用谁的方法

                  

}   

4        }

 

5        Class Parent

 

6        {

 

7         Public void sing()

 

{       

         System.out.println(“parent is singing!”);

}

 

8        }

 

ClassChild extends Parent

{

         Public void sing()

         {

                   System.out.println(“child issinging!”);        

}       

}

对象转型

Publicclass PolyTest2

{

         Public static void main(String[] args)

         {

                   Animal a = new Dog();

                   Dog  dog = Dog(a);//父类型的引用强制转化成了子类型的引用,因为a实际指向的是dog类型的对象所以可以将a强制转化成Dog类型

                   dog.sing();

}

}

ClassAnimal

{

         Public void sing()

         {

                   System.out.println(“animalis singing!”);

}

        

}

ClassDog extends Animal

{

         Public void sing()

         {

                   System.out.println(“Dog is singing!”);

 

}

}

ClassCat extends Animal

{

        

}

多态是一种运行期的行为,而不是编译期的行为

 

一共有2种类型的强制转化:

向上类型的强制转化 (upcast) 比如:Cat类型转化成Animal类型【将子类型转化成父类型】Cat转化成Animal类型,不需要显式的指定

 

//向上类型转化

Catcat = new Cat();

Animalanimal = (Animal)cat;

Animal.sing();//子类就是父类  cat is singing

向下类型转换(downcast) 比如:将Animal类型转化成Cat类型,即将父类型转化成子类型,对于向下类型转化,必须要显式指定(必须要使用强制类型转换)

//向下类型转换

Animal a = new Cat();

Cat cat = (Cat)a;

Cat.sing();

 

向下类型转换使用的条件:当父类和子类所拥有的方法个数不同的时候,要使用子类所特有的方法,则用强制类型转换。

 

Publicclass PolyTest3

{

         Public static void main(String[] args)

         {

                   Fruit f = new Fruit();

                   f.run();

                   Pear p = new Pear();

                   p.run();

                   System.out.println(“----------------------------------”);

//下面的用法是错误的不使用强制类型转化的时候会出现找不到该方法

                   Fruit f = new Pear();

                   f.grow();

///下面使用强制类型转化的方法来写程序就是对的

                 Fruitf = new Fruit();

                   Pear p = (Pear)f;

                   p.grow();

}

}

 

ClassFruit

{

         Public void run()

         {

                   System.out.println(“fruit isrunning!”);

}

}

ClassPear extends Fruit

{

         Public void run()

         {

                   System.out.println(“pear isrunning!”);

}

 

Public void grow()

{

         System.out.println(“fruitis running!”);

}

}

 

体会多态是运行期的行为例子程序:

Public class PolyTest4

{

       Public staticvoid  main(String[] args)

       {

              Publicstatic void main(String[] args)

              {

                     Aa = null;

                     ///通过命令行来传参数,接收用户的参数

                     If(args[0].equals(“1”))

{

       a = new B();

}

Else if(args[0].equals(“2”))

{

       a = new C();

}else if(args[0].equals(“3”))

{

       A = new D();

}

a.method();

}

}

}

Class A

{

       Public voidmethod()

       {

              System.out.println(“A”);

}

}

class B extends A

{

       Public voidmethod()

       {

              System.out.println(“B”);

}

}

Class C extends B

{

       Public voidmethod()

       {

              System.out.println(“C”);

}

}

Class D extends A

{

       Publicvoid mthod()

{

       System.out.println(“D”);

}

}

 

Publicclass PolyTest5

{

/*原先的写法:*/

/*Publicvoid run(BMW bmw)

{

    Bmw.run();

}

 

  Public voidrun(QQ qq)

{

        qq.run();

}

*/

///一个方法可以搞定所有的方法多态特性

//声明一个父类型的对象作为参数然后根据实际情况new对象

       Public void run(Car car)

       {

                     Car.run();

}

 

       Public static void main(String[] args)

       {

              //先前写法的调用方式

              /*   PolyTest5test = new PolyTest5();

                 BMW bmw = new BMW();

                     Test.run(bmw);

     

                    

              QQ qq = new QQ();

                            Test.run(qq);

*/

 

              //改进过后的调用方式

              PolyTest5  test = new PolyTest5();

              Carcar = new Car();

              Test.run(car);

              QQqq = new QQ();

              Test.run(qq);

}

}

ClassCar

{

       Public void run()

       {

              System.out.println(“car isrunning!”);

    ?    ?}

}

 

}

ClassBMW

{

       Public void run()

?    ?{

    ?    ?System.out.println(“BMWis running”);

    ?}

 

}

 

ClassQQ extends Car

{

       Public void run()

       {

              Public void run()

              {

                     System.out.println(“QQ isrunning”);

    ?    ?    ?    ?}

    ?    ?}

}

 

 

 

 

时间: 2024-12-27 19:33:29

Java基础(二)继承剖析的相关文章

Java基础08 继承(转载)

继承(inheritance)是面向对象的重要概念.继承是除组合(composition)之外,提高代码重复可用性(reusibility)的另一种重要方式.组合是重复调用对象的功能接口.继承可以重复利用已有的类的定义. 类的继承 我们之前定义类的时候,都是从头开始,详细的定义该类的每一个成员.比如下面的Human类: 从上面的类定义,我们可以了解该类的所有细节: 该类的数据成员,该类的方法,该类的接口. 现在要定义一个新的类,比如Woman类,并假设Woman与Human类相当类似: 可以像以

黑马程序员——java基础--面向对象--继承

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 继承: 1.当一个类中包含了另一个类的所有变量个方法时,但另一个类中不包含另一个类的所有变量和方法时,表示范围比较小的就可以作为另一个的父类. 集合表示:A属于B,B不属于A,A就可以作为B的父类,B继承A 2.当只是为了获取其他类的功能的时候,不能为了简化代码而继承. 3.必须是类与类之间的所属关系才可以继承,所属关系看前面集合 继承的特点: 1.不支持多继承,只支持单继承: 多继承的话容易

黑马程序员——Java基础——面向对象——继承、抽象类、接口、多态、包、内部类、异常等

第一讲 继承 1.继承: 当多个类拥有相同的功能时,那么这些类不需要每个都写这些相同的功能,只需要把相同功能抽到 一个单独的类中,继承这个类就能获得这些相同的功能: (1)继承的体系结构:就是对要描述的事物进行不断的向上抽取,就出现了体系结构. 要了解这个体系结构中最共性的内容,就看最顶层的类. 要使用这个体系的功能,就用最底层的类创建对象 (2)好处: A.提高代码复用性: B.继承的出现,让类与类之间产生关系,为多态的前提 (3)特点: A.只能单继承(准确的说是java对多继承进行优化,避

黑马程序员-Java基础-面向对象—继承、构造函数、重写、final、抽象类、接口

第一讲  继承 1.  继承的作用 1) 提高代码复用性: 2) 让类与类之间产生了关系: 2.  java继承特点 1) java只支持单继承,不支持多继承 因为多继承容易带来安全隐患:当多个父类中定义了相同功能,但功能内容不同时,子类对象不确定要运行哪一个. 2) java支持多层继承:可以形成一个继承体系 利用一个继承体系的方法:阅读体系父类,了解共性功能(该体系的基本功能),具体要调用这些基本功能时,需要创建最子类的对象,为什是最子类: 一是:父类有可能不能创建兑现(如,静态类或接口):

Java 基础 (二)

接上 Java 基础(一) 大纲:(1)类的高级特性 (2)集合类 (3)异常处理 (4)输入/输出 (5)Swing程序设计 抽象类:只申明方法的存在,而不去实现它的类:抽象类不能被实例化,也就是说不能创建其对象; 语法格式如下: abstract class 类名 { 类体 } 在抽象类中创建,没有实际意义,必须在子类中重写的方法为抽象方法:抽象方法只有方法的申明,没有方法的实现: 基本定义格式如下: abstract <返回值> 方法名(参数列表) PS:抽象方法不能用Private和S

java基础知识--继承

继承 1.继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. 1.类的继承格式 在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下: class 父类 { } class 子类 extends 父类 { } 2.继承的特性 子类拥有父类非private的属性,方法. 子类可以拥有自己的属性

Java基础笔记-继承、抽象类、接口、多态、内部类、异常

继承:多个类具有相同的属性和行为时,将这些内容单独抽取到一个单独的类中,那么多个类无需再定义这些属性和行为,直接继承那个类即可 1)  多个类称为子类,单独的类称为父类或者超类 2)  子类可以继承父类中非私有的属性和方法 3)  通过extends关键字让类与类之间建立继承关系 4)  继承的出现提高了代码的复用性,让类与类之间产生了关系,为多态的出现提供了前提 5)  不能为了实现某类的功能,简化代码而继承,必须是类与类之间具有所属关系才可以继承,所属关系:is a 6)  特点:java只

6、JAVA基础-二维数组 及 面向对象理解

1:二维数组(理解) (1)元素是一维数组的数组. (2)格式: A:数据类型[][] 数组名 = new 数据类型[m][n]; B:数据类型[][] 数组名 = new 数据类型[m][]; C:数据类型[][] 数组名 = new 数据类型[][]{{...},{...},{...}}; D:数据类型[][] 数组名 = {{...},{...},{...}}; (3)案例(掌握): A:二维数组的遍历 B:二维数组的求和 C:杨辉三角形 2:两个思考题(理解) (1)Java中的参数传递

【Java基础】继承的一些总结

什么是继承 把一些类的具有共性的东西剥离出来形成一个新的类,然后各个其他类保留自己独有的特性,并用关键字extends继承这个剥离出来的新的类,可以最终达到各类原始相同效果,但是在每个类中,单用一个“extends 新类” 就可以减少新类里差不多相同量级的代码量. 继承的格式 class 类1 extends 新类{} 其中新类就是剥离出的有共同特性的类. 继承的适用场景 存在“is a”的关系时,例如猫is a 动物,狗is a 动物. 继承的特点 Java中类只支持单继承 Java中可以多层