Java 覆写初探

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() ;

    }

}

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

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

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

原文地址:https://www.cnblogs.com/wangyuyang1016/p/10753428.html

时间: 2024-10-15 02:36:58

Java 覆写初探的相关文章

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

注:本文非本人原著. demo的地址:链接:http://pan.baidu.com/s/1miEmHMo 密码:k5ca 如何过滤Xss跨站脚本攻击,我想,Xss跨站脚本攻击令人为之头疼.为什么呢. 尤其是有富文本编辑器的产品.xss可能出现在http的head,不说别的,新浪多次出现. xss可以出现在post数据的正文.图片的url. 于是各种Xss横行,如今Xss跨站脚本漏洞的流行程度甚至超过了当年的sql. 那么对于JAVA语言,如何防御呢. 笔者分享一个思路:所有的web项目,所有的

java覆写equals方法

何时需要重写equals() 当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念). object规范规定,如果要重写equals(),也要重写hashcode() 如何覆写equals() 覆写equals方法 1  使用instanceof操作符检查“实参是否为正确的类型”. 2  对于类中的每一个“关键域”,检查实参中的域与当前对象中对应的域值. 3. 对于非float和double类型的原语类型域,使用==比较: 4  对于对象引用域,递归调用equals方法: 5  对于flo

java 覆写Object.equals() 方法

1 //覆写Object.equals 2 class Demo { 3 private String name; 4 private int age; 5 public Demo(String name,int age) { 6 this.name=name; 7 this.age=age; 8 } 9 public String toString() { 10 return this.name+this.age; 11 } 12 public boolean equals(Object ob

Java多态特性:重载和覆写的比较

Java重载: 在同一个类中 方法具有相同的名字,相同或不同的返回值,但参数不同的多个方法(参数个数或参数类型) public class MethoDemo{ public static void main(String args[]){ int one = add(10,20) ; // 调用整型的加法操作 float two = add(10.3f,13.3f) ; // 调用浮点数的加法操作 int three = add(10,20,30) ; // 调用有三个参数的加法操作 Syst

JAVA继承与覆写

实例:数组操作 首先是开发一个整型数组父类,要求从外部控制数组长度,并实现保存数据以及输出.然后子类中实现排序和反转. 基础父类代码如下: 1 class Array { 2 private int data [] ; 3 private int foot ; 4 public Array(int len ) { 5 if (len > 0 ) { //至少有元素 6 this.data = new int [len] ; 7 } else { 8 this.data = new int [1]

Java中的overload(方法的覆写)

方法覆写(overload)与方法的重载非常相似,它在 Java的继承中也有很重要的应用. 写程序可能会碰到下面的情况,在父类中已经实现的方法可能不够精确,不能满足子类 的需求.例如在前面的 Animal类中,breath方法就过于简单,对于鱼类动物是用腮呼吸的, 而对于哺乳动物则是用肺呼吸的,如何实现呢,Java提供的方法覆写就是解决这方面的问题. 在下面的程序中首先定义了一个父类 Animal,然后定义 Animal的  3个子类  Tiger.Fish 和 Dog,在父类中提供了 3个方法

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

JAVA继承时方法的重载(overload)与重写/覆写(override) 重载-Override 函数的方法参数个数或类型不一致,称为方法的重载. 从含义上说,只要求参数的个数或参数的类型不一致就说两个函数是重载函数,而至于返回值是否一样,没关系.同时,重载可以发生在同一个类中也可以发生在继承关系中. class A { } class B extends A { public void fun(String data1) { System.out.println(data1); } pub

在Java中的重载和覆写

在看Java的书的时候,看到了重载和覆写这段时,有一些不理解,后来慢慢的弄懂了.现在把我的一些想法记录下来. 重载是指的在一个方法里面,可以使用不同的方法名,但是由于传入值数量或者类别上的不同,执行的方法就会不同. package czfx; public class czfx{ public static void main(String args[]){ class_one p=new class_one(); p.talk(); p.talk(2); p.talk(1,2); }}clas

Java重载、覆写、this、super、抽象类、接口

第一.重载和覆写 1) 重载:方法名相同,参数类型和个数不同,典型的是构造方法的重载  覆写:方法名.参数类型.返回值类型全部相同,典型的是接口的实现: 2)重载对权限没有要求:覆写要求  被覆写的方法不能拥有更严格的权限: 3)重载发生再一个类中:覆写发生在继承类中. 第二.this和super 1)this访问本类中的属性(方法),如果本类中没有此属性(方法),则从父类中 继续寻找:super询问父类中的属性(方法): 2)调用本类构造,必须放在构造方法的首行:调用父类构造,必须放在子类构造