Java 覆写

  继承性的主要特征是子类可以根据父类已有的功能进行功能扩展,但是在子类定义属性或方法的时候有可能定义属性和方法和父类同名,在此类情况下就称为:“覆写”。

方法的覆写:【改良原本功能不足的方法】

子类定义的方法与父类方法名称相同、参数的类型及个数、返回值相同的方法。

class A {

         public void fun() {

                   System.out.println("A.fun()方法") ;

         }

}

class B extends A {

         public void fun() {

                   System.out.println("B.fun()方法") ;

         }

}

public class TestAB {

         public static void main(String args[]) {

                   B b = new B() ;

                   b.fun() ;

         }

}

当发生覆写之后,此时会调用实例化子类中被覆写的方法;{注意:覆写的方法,要和父类的一模一样才可以称为覆写操作}

  一个类可能会产生(被继承)多个子类,那么每个子类都会有一个自己的代码方法,子类被实例化后只会执行自己被覆写的方法。【没有被覆写的方法,则调用父类的方法】

  但是被覆写的方法不能拥有比父类更严格的访问控制权限

  访问控制权限:     Public  >  default  >  private(最严格的)

  同理:如果父类使用了public,子类的覆写方法只能是public;如果父类使用了default,子类的覆写方法只能是public和default ……

class A {

         public void fun() {

                   print() ;

         }

         public void print() {

                   System.out.println("A") ;

         }

}

class B extends A {

         public void print() {

              System.out.println("B") ;

         }

}

public class TestAB {

         public static void main(String args[]) {

                   B b = new B() ;

                   b.fun() ;

         }

}

说明:实例化子类B,所以fun方法是在B类中执行的,调用的就是B类中的print方法;

class A {

         public void fun() {

                   print() ;

         }

         private void print() {

                   System.out.println("A") ;

         }

}

class B extends A {

         public void print() {

                   System.out.println("B") ;

         }

}

public class TestAB {

         public static void main(String args[]) {

                   B b = new B() ;

                   b.fun() ;

         }

}

说明:这个例子中,就会发现子类中根本没有覆写print()方法,也就是说使用了private对于子类而言是不可见的,就算子类定义一个符合要求的覆写语句,也不可以发生覆写;这个时候子类使用的方法,实际上就相当于子类自己定义了一个新的方法而已。

覆写之后,默认情况下子类所能够调用的一定是被覆写过的方法,如果还想调用父类中的方法,可以使用super.* 关键字;

class A {

              public void fun() {

                   print() ;

              }

              public void print() {

                   System.out.println("A") ;

              }

}

class B extends A {

              public void print() {

                   super.print() ;

                   System.out.println("B") ;

              }

}

public class TestAB {

              public static void main(String args[]) {

                   B b = new B() ;

                   b.fun() ;

              }

}

super()和this()问题研究:

1、 super(参数):调用基类(父类)中的某一个构造函数(默认)

2、  this(参数):调用本类中的另一种形成的构造函数

3、  super()和this()都在构造函数第一行,但不可以同时存在

4、 super:引用当前对象的直接父类的成员(用来访问父类中的隐式继承属性和方法函数)

5、  this:表示引用当前对象名,调用的只是本类中的属性和方法函数

—   this()和super()都要在构造函数的首行。

面试题:解释重载与覆写的区别?(Overloading与Overrid的区别)

区别

重载

覆写

名字

Overloading

Overrid

范围

发生在一个类中

发生在子类和父类之中

定义

方法名称、参数类型及个数相同

方法名称、参数类型、个数、方法返回值相同

权限

没有权限的限制

被覆写的方法不能拥有比父类严格的访问控制权限

在Overloading时,返回值类型是否可以不同?

   在发生重载的时候,返回值类型可以不同,但是考虑到程序设计的统一性,重载时,尽量保证返回值类型相同。

 

属性覆盖:【无意义】

    如果子类定义了和父类完全相同的属性名称的时候,就称为属性的覆盖。

class A {

    String info = "Hello" ;

}

class B extends A {

    int info = 100 ;

    public void print() {

        System.out.println(this.info) ;  //查找本类中的info

        System.out.println(super.info); //查找父类的info

    }

}

public class TestAB {

    public static void main(String args[]) {

        B b = new B() ;

        b.print() ;

    }

}

·发生继承关系后,就会应用覆写操作,覆写的应用主要以 方法覆写 为主;

·如果子类需要使用父类指定的方法,但是发现父类的方法不能满足功能需求,就可以利用覆写方法,来完善父类方法的功能的同时保留父类的方法不被改变。

·被子类覆写的方法不能拥有比父类更为严格的访问控制权限。

Java 覆写初探的更多相关文章

  1. java覆写hashcode方法

    覆写hashcode 1. 把某个非零常数值,例如17,保存在int变量result中: 2. 对于对象中每一个关键域f(指equals方法中考虑的每一个域): 3, boolean型,计算(f? 0 ...

  2. java覆写equals方法

    何时需要重写equals() 当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念). object规范规定,如果要重写equals(),也要重写hashcode() 如何覆写equals() ...

  3. JAVA覆写Request过滤XSS跨站脚本攻击

    注:本文非本人原著. demo的地址:链接:http://pan.baidu.com/s/1miEmHMo 密码:k5ca 如何过滤Xss跨站脚本攻击,我想,Xss跨站脚本攻击令人为之头疼.为什么呢. ...

  4. 【转】 Java多态特性:重载和覆写的比较

    Java重载: 在同一个类中 方法具有相同的名字,相同或不同的返回值,但参数不同的多个方法(参数个数或参数类型) public class MethoDemo{ public static void ...

  5. Java多态特性:重载和覆写的比較

    Java重载: 在同一个类中 方法具有同样的名字,同样或不同的返回值,但參数不同的多个方法(參数个数或參数类型) public class MethoDemo{ public static void ...

  6. JAVA继承与覆写

    实例:数组操作 首先是开发一个整型数组父类,要求从外部控制数组长度,并实现保存数据以及输出.然后子类中实现排序和反转. 基础父类代码如下: class Array { private int data ...

  7. 黑马程序员——JAVA基础之简述 类的继承、覆写

    ------- android培训.java培训.期待与您交流! ---------- 继承的概述: 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只 ...

  8. JAVA中继承时方法的重载(overload)与重写/覆写(override)

    JAVA继承时方法的重载(overload)与重写/覆写(override) 重载-Override 函数的方法参数个数或类型不一致,称为方法的重载. 从含义上说,只要求参数的个数或参数的类型不一致就 ...

  9. [改善Java代码]不要覆写静态方法

    建议33: 不要覆写静态方法 我们知道在Java中可以通过覆写(Override)来增强或减弱父类的方法和行为,但覆写是针对非静态方法(也叫做实例方法,只有生成实例才能调用的方法)的,不能针对静态方法 ...

随机推荐

  1. springboot+swagger集成

    一.swagger介绍 Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件.本文简单介绍了在项目中集成swagger的方法和一些常见问题.如果想深入分析项目源码,了解更多内容 ...

  2. js流程图:aworkflow.js

    auto-workflow 用于快速构建各种关系图的库 github地址:https://github.com/auto-workflow/AWorkflow 快速开始 npm install awo ...

  3. 编写高质量代码改善C#程序的157个建议——建议136:优先使用后缀表示已有类型的新版本

    建议136:优先使用后缀表示已有类型的新版本 加后缀在某些情况下是很奇怪的形式,我们都不愿意看到OrderProcessor2这样的类型.但是,有的时候仍旧有必要这样做.最典型的是FCL中关于数字证书 ...

  4. linux 进阶2--C++读取lua文件中的变量、一维表、二维表

    lua 语言非常灵活,一般把lua 作为脚本文件,会用C++与之进行交互.最重要的是C++代码能读取到脚本中的变量.一维表.二维表. 这样有些参数就可以在lua文件进行更改,而不用重新更改C++代码. ...

  5. 网络安全之iptables防火墙

    1>各种传输方式到最后都会转化为能够通过网络发送的数据格式: 1>文本格式: 2>二进制格式:2>TCP三次握手连接,四次断开,连接时客户端是主动打开,服务器是被动 打开,处于 ...

  6. Delphi Excel操作,写了个ADODataSet转Excel的函数作为后期学习的例子

    使用该函数需要先Use Excel2010 //DataSet导出Excel2010格式//FileName=待导出的Excel的文件名,不带路径以及后缀:TitleLine1=导出后Excel第一表 ...

  7. Java 连接、操控数据库总结(JDBC)

    看到数据库连接不由得想起了大一末参加团队考核时的悲催经历~~,还记得当初傻傻地按照书本的代码打到 Eclipse 上,然后一运行就各种报错...报错后还傻傻地和书本的代码一遍又一遍地进行核对,发现无误 ...

  8. android ART-逆向研究者的福音?

    android 4.4起,提供了一种与Dalvik截然不同的运行环境-ART(Android Runtime)的支持.目前用户可以选择设备的运行环境,在不久的将来ART肯定会替代Dalvik Runt ...

  9. ASP.NET Core2.0杂项

    一.添加自定义的路由. 1.1.默认的路由添加语句 Startup文件的ConfigureServices方法中添加: services.AddMvc();//添加MVC的服务 1.2 添加自定义的路 ...

  10. sql 统计常用的sql

    统计常用的sql  统计常用的sql语句: 今天的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())=0 昨天的所有数据:s ...