继承剖析

若是要直接调用父类的构造方法,不调用子类的方法则需要使用的是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”);

    ​    ​    ​    ​}

    ​    ​}

}

 

 

 

 

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

  1. Java基础-hashMap原理剖析

    Java基础-hashMap原理剖析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.什么是哈希(Hash) 答:Hash就是散列,即把对象打散.举个例子,有100000条数 ...

  2. Java面试题总结之Java基础(二)

    Java面试题总结之Java基础(二) 1.写clone()方法时,通常都有一行代码,是什么? 答:super.clone(),他负责产生正确大小的空间,并逐位复制. 2.GC 是什么? 为什么要有G ...

  3. 第二十八节:Java基础-进阶继承,抽象类,接口

    前言 Java基础-进阶继承,抽象类,接口 进阶继承 class Stu { int age = 1; } class Stuo extends Stu { int agee = 2; } class ...

  4. Java入土--Java基础(二)

    Java基础(二) 接上一讲,我们接着来聊聊Java的一些基础知识,下一讲就会进行流程的控制. 类型转换 首先呢,是类型的转换,接上一个内容的数据类型,类型转换就是数据类型更进一步的应用. 由于Jav ...

  5. java基础(二)-----java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  6. Java基础学习-- 继承 的简单总结

    代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...

  7. java基础之继承(一)

    虽然说java中的面向对象的概念不多,但是具体的细节还是值得大家学习研究,java中的继承实际上就是子类拥有父类所有的内容(除私有信息外),并对其进行扩展.下面是我的笔记,主要包含以下一些内容点: 构 ...

  8. java基础二(阅读Head First Java记录)

    写在前面的话 本部分是在语法基础上的一些内容,比如内部java函数库,继承多态等   “与”和“或”运算符 1.短运算符(&&,||)    &&与,必须表达式两边都为 ...

  9. [ 转载 ] Java基础二

    前言 关于赢在面试的Java题系列基本收集整理完成了,所有题目都是经过精心挑选的,很基础又考验求职者的基本功,应该说被面试到的几率很大.这里整理挑选出来供大家面试前拿来看一看,所有题目整理自网络,有一 ...

  10. Java基础(二) 基本类型数据类型、包装类及自动拆装箱

    我们知道基本数据类型包括byte, short, int, long, float, double, char, boolean,对应的包装类分别是Byte, Short, Integer, Long ...

随机推荐

  1. 3. ETCD数据备份与恢复

    首先为运行在https://127.0.0.1:2379 上的现有etcd实例创建快照并将快照保存到 /srv/data/etcd-snapshot.db. 注:为给定实例创建快照预计能在几秒钟内完成 ...

  2. 实验1 在MAX10 FPGA上实现组合逻辑

    实验1 在MAX10 FPGA上实现组合逻辑 实验前的准备工作:参照讲义步骤安装Quartus,Modelsim和System Builder.阅读材料:1)推荐的文件组织形式:2)Verilog 1 ...

  3. 如何对一个新的 VSCode 配置 LaTeX

    texlive 的安装件参考资料 [1]. 往 VSCode 里面装 LaTeX Workshop 插件,也可以直接搜 James-Yu.latex-workshop. Ctrl+Shift+P 打开 ...

  4. neovim 使用系统剪贴板

    neovim 使用系统剪贴板 1.vim 与 neovim 使用系统剪切板的不同 Nvim has no direct connection to the system clipboard. Inst ...

  5. ansible系列(23)--ansible的when控制语句

    目录 1 when控制语句 1.1 根据不同操作系统安装相同的软件 1.2 为不同centos版本安装httpd软件 1.3 为特定的主机添加Nginx仓库 1.4 判断服务是否正常运行 1 when ...

  6. python教程3.1:数据类型:字符串+列表list

    一.字符串 字符串是⼀个有序的字符的集合,⽤于在计算机⾥存储和表示⽂本信息  常用方法--str.fun() 全局函数 二.列表list []内以逗号分隔,按照索引,存放各种数据类型,每个位置代表⼀个 ...

  7. three.js教程5-几何体顶点UV坐标、纹理贴图TextureLoader

    1.纹理贴图 纹理贴图,是给MeshLambertMaterial等材质一些纹理图片,以达到更好的视觉效果. 使用方法:通过纹理贴图加载器TextureLoader的load()方法加载一张图片可以返 ...

  8. UE4 绘制Gizmo

    Unity的Gizmos可以很方便的在编辑器下进行调试,Unreal中也有一些办法可以达到效果. 本文主要参考:https://zhuanlan.zhihu.com/p/363625037,进行了一些 ...

  9. 简易的 Linux 流量实时监控工具 watch+ifstat

    非常简单小巧的流量实时监控工具,贵在不需要安装,Linux 操作系统自带,在不出外网的环境中很是实用. watch -d ifstat eth1 如果连 ifstat 都没有的环境中也可以使用 ifc ...

  10. ASP.NET Core的全局拦截器(在页面回发时,如果判断当前请求不合法,不执行OnPost处理器)

    ASP.NET Core RazorPages中,我们可以在页面模型基类中重载OnPageHandlerExecuting方法. 下面的例子中,BaseModel继承自 PageModel,是所有页面 ...