[转载] java-继承和多态

参考链接: Java中的继承

继承: 

继承就是保持已有类的特性而构造新类的过程。继承后,子类能够利用父类中定义的变量和方法,就像它们属于子类本身一样。 

单继承:在类层次中,子类只继承一个父类的数据结构和方法,一个类只有一个父类 

多继承:在类层次中,子类继承了多个父类的数据结构和方法,一个类允许有多个继承 

(java支持多层继承) 

//父类

public class file{

    public long size;     //文件大小

    public String name;    //文件名

    public void info()    //显示文件信息

    {

        System.out.println(name + " " + size);

    }

}

//子类

public class videofile extends file()

{

    //父类的public成员自动继承

    //private不能被继承,子类无权访问    

    //只需要添加子类的特性

    public int duration //时长    

    public void play()

    {

       System.out.println("播放" + this.name);

    }

    public void stop()

    {

        System.out.println("停止" + this.name);

    }

成员变量隐藏:是指在子类中定义了一个与直接超类的某个成员变量同名的成员变量,从而使超类中的那个成员变量不能直接被子类继承。 

当成员变量隐藏时,在超类类题代码中用简单变量命名访问的一定是超类中的成员变量,而在子类类体代码中用简单变量名访问的则一定是在子类中的成员变量 

可以用下列各式访问超类中被隐藏的成员变量 

super.<变量名>                                    在子类类体里,访问直接超类中被隐藏的成员变量 

((<超类名>)<子类实例引用>).变量名    访问指定超类中被隐藏的成员变量 

<超类名>.<变量名>                               访问指定超类中被隐藏的类变量 

public class number {

    int x;

    static int y; //类变量

    void set(int a)

    {

        x = a;

        y = a;

    }

    void print()

    {

        System.out.println("x" + "\t" + x);

    }

}

 

public class newnumber extends number {

    int x;

    static int y;

    void newset(int a)

    {

        x = a;

        y = a;

    }

    void newprint()

    {

        System.out.println("x" + "\t" + x);     //x = 100

        System.out.println("y" + "\t" + y);     //y = 100

        System.out.println("x" + "\t" + super.x);     //x = 10

        //在子类类体里,访问直接超类中被隐藏的成员变量

        System.out.println("y" + "\t" + super.y);     //y = 10

    }

}

 

public class HelloWorld {

    public static void main(String[] args) {

        newnumber n = new newnumber();

        n.set(10);

        n.print(); 

        n.newset(100);

        n.newprint();

        System.out.println("y" + "\t" + number.y);     //y = 10

        System.out.println("x" + "\t" + ((number)n).x);     //x= 10

    }

若子类和父类里都有相同的名字定义的方法,但是实现不一致。覆盖的方法是按照子类中重定义的方法进行调用,而继承的方法直接调用父类的方法 

覆盖 (重写)(Override): 

1、方法名称要一样 

2、返回值数据类型要一样 

3、所使用的参数列表要一样,参数列表包括参数个数及每个参数的数据类型,不包括参数的变量名 

4、访问修饰符只能越来越开放,不能越来越封闭 

public class file {

    public long size;

    public String name;

    public void info()

    {

        System.out.println(name +  "\t" + size);

    }

}

 

public class vediofile extends file{

    public int duration;

    public void play()

    {

        System.out.println("播放" + this.name);

    }

    public void stop()

    {

        System.out.println("停止" + this.name);

    }

     //Override 覆盖

    public void info() {

         System.out.println("name : " + name + "  size : " + size + " time : " + time);

        }

}

 

public class HelloWorld {

    public static void main(String[] args) {

        vediofile v = new vediofile();

    v.size = 20000;

    v.name = "abc.mp4";

    v.duration = 70;

    v.info(); 

    //name : abc.mp4  size : 20000  time : 70

    }

泛化: 

抽取调整代码到父类的过程,称为泛化 

Eclipse自动添加覆盖功能: 

点击source,选择Override/Implement Methods 

 

选择要覆盖的方法 

 

创建完成 

 

子类可以选择完全重写或者在父类方法中补充 

public void info() {

        // TODO Auto-generated method stub

        super.info();    //调用父类的实现

        System.out.println("time : " + duration);                                                                 

        //name : abc.mp4  size : 20000  time : 70

    } 

构造方法的继承: 

创建子类对象时,父类的构造方法会被自动调用 

public class parent {

    public parent()

    {

        System.out.println("父类构造...");

    }

}

 

public class child extends parent {

    public child()

    {

        System.out.println("子类构造...");

    }

}

 

public class HelloWorld {

    public static void main(String[] args) {

        child c = new child();            

    }

 

若父类有很多个构造方法,可以在子类里显示指定用哪个构造方法 

public class parent {

    private int a;

    public parent()    //默认构造

    {

        System.out.println("父类构造...");

    }

    public parent(int a)     //带参构造

    {

        this.a = a;

        System.out.println("带参父类构造...");

    }

}

 

public class child extends parent {

    public child()

    {

        super(23);    //调用带参构造

        System.out.println("子类构造...");

    }

}

 

public class HelloWorld {

    public static void main(String[] args) {

    child c = new child();    

    }

单根继承:Java语言里,一个类只能继承一个父类 

如果一个类没有指定父类,则它的默认父类就是Object 

toString() 方法返回此对象本身(它已经是一个字符串) 

public class Student {

    public String id;

    public String name;

    public boolean sex;

    @Override

    public String toString() {

        String s = " 学号 : " + id + " 姓名 : " + name;

        if(sex)

        {

            s = s + "(男)";

        }

        else

        {

            s = s + "(女)";

        }

        return s;

    } 

}

 

public class HelloWorld {

    public static void main(String[] args) {

        Student s = new Student();

        s.id = "20003";

        s.name = "lisi";

        System.out.println(s.toString());    // 学号 20003 姓名 lisi(女)

    }

多态 

1、使用父类类型的引用只想子类的对象 

2、该引用只能调用父类中定义的方法和变量 

3、如果子类中重写(覆盖)了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法 

4、变量不能被重写(覆盖),重写只针对方法,如果在子类中重写了父类的变量,编译时会报错 

子类转成父类是可以的(隐式转换) 

当调用一个方法的时候,不是看引用类型,而是看对象的实际类型。 

转化原则 

子类对象可以当作父类对象使用 

父类对象不能当作子类对象使用 

如果父类引用实际只想的是子类对象,那么该父类引用可以通过强制转化成子类对象使用 

public class file {

    public long size;

    public String name;

    public void info()

    {

        System.out.println("name : " + name + "  size : " + size);

    }

}

 

public class vediofile extends file{

    public int duration;

    public void play()

    {

        System.out.println("播放" + this.name);

    }

    public void stop()

    {

        System.out.println("停止" + this.name);

    }

    @Override

    public void info() {

        // TODO Auto-generated method stub

        super.info();

        System.out.println("time : " + duration);

    }    

}

 

public class HelloWorld {

    public static void main(String[] args) {

        vediofile v = new vediofile();

        v.size = 20000;

        v.name = "abc.mp4";

        v.duration = 70;

        file f = v;

        f.info();     //调用的子类的info

    }

覆盖是动态绑定 

重载是静态绑定 

用instanceof操作符测试一个对象是否是一个类的实例 

instanceof返回值是true或false 

对象名 instanceof 类名 -> true or false 

class SchoolMember

{  

    public void introduce()

    {

        System.out.println("a schoolmember");

    }

 }

 

class Student extends SchoolMember

    public void study()

    {

        System.out.println("study");

    }       

}

class Teacher extends SchoolMember

{

    public void teach()

    {

        System.out.println("teach");

    }

}

class Test

{

    static void use(SchoolMember obj)

    {

        obj.introduce();

        //判断实例化的对象是Student还是Teacher

        if(obj instanceof Student)     

        {

            Student s = (Student)obj;

            s.study();

        }

        if(obj instanceof Teacher)

        {

            Teacher t = (Teacher)obj;

            t.teach();

        }

    }

    public static void main(String[] args)

    {

        Student s1 = new Student();

        //Teacher t1 = new Teacher();

        use(s1);

        //use(t1);

    }

}

 

eg:

a schoolmember

study

 

方法看右侧,属性看左侧 

先访问父类的构造方法再访问子类的构造方法 

eg1: 

class A

    {     String  s="class A";    }

    class B extends A

    {     String  s="class B";    }

    public class TypeConvert

    {

        public static void main(String args[])

        {

            B b1,b2=new B();

            A a1,a2;

            a1=(A)b2;

            a2=b2;

            System.out.println(a1.s);    //class A

            System.out.println(a2.s);    //class A

            b1=(B)a1;

            System.out.println(b1.s);    //class B

            System.out.println(b2.s);    //class B

 

        }

    }

 

 

eg2 : 

class A

    {     String s="class A";  

          void show()    {       System.out.println(s);}

  }

    class B extends A

    {     String s="class B";    

        void show()      {   System.out.println(s);}

}

    public class TypeConvert

    {    public static void main(String args[])        {

            B b1;

            B b2=new B();

            A a1,a2;

            a1=(A)b2;

            a2=b2;

            System.out.println(a1.s);    //class A

            a1.show();    //class B

            System.out.println(a2.s);    //class A

            a2.show();    //class B

            b1=(B)a1;

            System.out.println(b1.s);    //class B

            b1.show();    //class B

            System.out.println(b2.s);    //class B

            b2.show();    //class B

        }

    } 

eg3: 

class A

{

    public A()

    {

        System.out.println(“The default constructor of A is invoked”);

}

}

class B extends A

{

    public B()

    {

    }

}

public class C

{

    public static void main(String[] args)

    {

        B b = new B();

    }

}

输出 The default constructor of A is invoked

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

走进SQL Server 2005:备份与恢复功能

每当有任何新的软件发布的时候&#xff0c;你通常都会发现一些你从来不知道或者从来不知道你需要的新的特性。SQL Server 2000中存在的许多的备份和恢复特性都同样保留在了SQL Server 2005中&#xff0c;但是有一些新的提高同样值得你的关注。 镜像备份 SQL Server 2005让你可以…

[转载] Java对返回值的封装

参考链接&#xff1a; 用Java封装 定义自己所需要的返回值类型 public class CodeMsg implements Cloneable { private int retCode; private String message; // 通用异常 public static CodeMsg SUCCESS new CodeMsg(0, "success"); public static CodeMsg EMP…

stateful set 学习笔记

2019独角兽企业重金招聘Python工程师标准>>> 1、创建pv # cat pv.yaml kind: PersistentVolume apiVersion: v1 metadata:name: task-pv-volumelabels:type: local spec:capacity:storage: 3GiaccessModes:- ReadWriteOncehostPath:path: "/tmp/data" 2、…

[转载] Java中对象数组的使用

参考链接&#xff1a; 如何在Java中交换或交换对象 Java对象数组使用 一、Java数组的使用二、Java的对象数组2.1 问题提出2.2 问题解析2.3 问题拆分2.4 代码实现 一、Java数组的使用 对象数组其实和Java的数组类似的&#xff0c;所以要很清楚Java的数组是如何使用的&#xf…

Python自动化开发学习13-联合唯一

联合唯一 联合唯一&#xff0c;就是一个表中的多个字段的组合需要唯一。 使用mysql语句创建 比如创建一张hosts表&#xff0c;记录登录的ip地址或者hostname&#xff08;表中对应字段host&#xff09;和 端口号&#xff08;表中对应字段port&#xff09;&#xff0c;要求host 和…

[转载] Java获取泛型T的类型 T.class

参考链接&#xff1a; Java中的抽象 import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public class Main{ public static void main(String[] args) { Foo<String> foo new Foo<String>(){}; // 在类的外部这样获取 Type type ((…

自定义控件---重写Listbox实现item图标变换和item点击事件

博客开通有一阵了&#xff0c;就是没有时间写&#xff0c;遗憾啊。&#xff01; 这几天做了个排序的自定义控件&#xff0c;在listbox item里放是button 并支持图标的交替变换 效果如下&#xff1a; 把代码贴上&#xff1a;1using System; 2using System.Collections.…

[转载] Spring面试题整理

参考链接&#xff1a; Java中的动态方法Dispatch和运行时多态 Spring面试题整理 2018年03月07日 21:11:46 hrbeuwhw 阅读数&#xff1a;49116 Spring 概述 1. 什么是spring? spring 是个Java企业级应用的开源开发框架。Spring主要用来开发Java应用&#xff0c;但是有…

ansible: Linux批量管理神器

我们已经知道&#xff0c;基于集群可实现服务器横向扩展slace out。可是&#xff0c;当上百台主机集合成共同为一个站点提供web页面访问的形式时&#xff0c;怎么管理整个集群体呢&#xff1f; 一些小伙伴大概听说过pxe等可实现自动安装系统。可是&#xff0c;要我们一台一台主…

[转载] Python numpy函数:all()和any()比较矩阵

参考链接&#xff1a; Python中的any和all 数组元素的比对&#xff0c;我们可以直接使用“”进行比较&#xff0c;比如&#xff1a; 但是当数组元素较多时&#xff0c;查看输出结果便变得很麻烦&#xff0c;这时我们可以使用all&#xff08;&#xff09;方法&#xff0c;直接…

MySQL初识-架构-安装-初始化-连接-管理工具-数据文件

MySQL架构和结构分析 官方架构图 内部组件结构图 MySQL安装方式 MySQL初始化 MySQL工作模式及常用命令 交互式模式&#xff1a;mysql> 1234567891011121314# 交互式模式下的客户端命令mysql> help # 获取命令帮助 mysql> \? # 同上 mysql> \c # 取消命令执行 mysq…

[转载] Java基础——关联、聚合、组合

参考链接&#xff1a; Java中的关联 | 组合和聚合 一.引言 其实自己也不知道&#xff0c;在需求设计、架构设计、开发阶段是否真正需要弄明白“关联、聚合、组合”。原本计划这篇博文写“继承“和”多态”&#xff0c;但是一翻阅资料&#xff0c;基本上都会把“继承”和“组…

[转载] WSDL2Java详细使用说明【官方最全说明】

参考链接&#xff1a; Java中的this说明 WSDL to Java 命名 wsdl2java - 获取WSDL文档并生成完全带注释的Java代码&#xff0c;并实现相关服务。 概要 用例 : wsdl2java -fe|-frontend <front-end-name> -db|-databinding <data-binding-name> -wv <…

mdm.Dialogs.promptModal()使用

这是prompt的扩展&#xff0c;提供了更多的功能&#xff0c;比如可以添加其他按钮和图标import mdm.*;mdm.Application.init(this, onInit);function onInit():void {// 启动程序...}quit.addEventListener(MouseEvent.CLICK,quitProgram);function quitProgram(evt:MouseEvent…

[转载] JAVA 构造函数及其重载

参考链接&#xff1a; Java重载Overload public class Student{ public int stuId; public String stuName; public int stuAge; public int stuScore; public Student(){ } public Student(int sId,String sName){ stuId sId; sName stuName; } public Student(int sld,S…

学生机房虚拟化(十)系统操作设计实现

引入&#xff1a; 在前篇思路的指导下&#xff0c;进行了为期三个星期的调试最终建立了一个初步成熟的&#xff0c;具有亲和力的配置界面&#xff0c;现在此虚拟系统已经初步部署了一个机房&#xff0c;用来学生日常上课。在本篇中&#xff0c;本人并不试图去花篇幅讲解彼此之间…

[转载] java之重写toString

参考链接&#xff1a; Java程序的输出| 重写Override 1.toString()就是是重写&#xff0c;对于一般的对象来说都会有这个方法&#xff0c;其实这个方法的目的&#xff0c;主要就是将对象按字符串的方式输出出来&#xff1a;打个比方&#xff0c;比如一个People类&#xff0c;里…

Gson的使用,对于不需要html escape的情况的处理

引入&#xff1a; 虽然是小问题&#xff0c;但是我还是需要记录下&#xff0c;我们知道&#xff0c;Google提供了一个Gson框架让我们高效的吧普通对象&#xff08;一般VO为佳&#xff09; 和json字符串之间进行互转。因为转换多数是和浏览器打交道的&#xff0c;所以一般默认的…

[转载] Java 重写paint绘图

参考链接&#xff1a; 用Java重写Override 感谢原文&#xff1a;https://zhidao.baidu.com/question/260060153.html 这个方法需要注意的地方不多&#xff0c;也就是重写时&#xff0c;先调用 super.paint(g) 方法 paint方法不需要编写代码调用&#xff0c;只需要重写。 其他…

教你如何进入有密码的 XP 系统(下)

自动登录时禁用Shift键 当使用自动登录功能时&#xff0c;用户可通过按住Shift键忽略登录进程&#xff0c;输入其他用户名及密码进入电脑。该技巧可以禁用自动登录时的Shift键功能。操作步骤如下&#xff1a;打开“注册表编辑器”&#xff0c;找到[HKEY_LOCAL_MACHINE\Softwar…