Java的覆写操作实例分析

本文实例讲述了Java的覆写操作。分享给大家供大家参考,具体如下:

一 属性覆写

1 点睛

所谓属性覆写,指的是子类定义和父类定义之中名称相同的属性。

2 代码

class Book
{
  String info = "Hello World." ;  // 如果加上private,1处的代码就会编译不过
}
class ComputerBook extends Book
{
  int info = 100 ;  // 属性名称相同
  public void print()
  {
    System.out.println(info) ;
    System.out.println(super.info) ;     // 1处代码
  }
}
public class OverrideData
{
  public static void main(String args[])
  {
    ComputerBook cb = new ComputerBook() ; // 实例化子类对象
    cb.print() ;
  }
}

3 运行

100
Hello World.

4 说明

该代码没有太大的意义,它并没有实现真实的覆写。为了满足类的封装型,类中的属性一般都需要private封装,一旦封装之后,子类根本就“看不见”父类的属性成员,子类定义的同名属性成员,其实就是一个“全新的”数据成员,所谓的覆写操作就没意义了。

二 super调用父类方法

1 点睛

子类中可以通过super.方法()调用父类中被覆写的方法。

2 代码

class Person
{
  String name;
  int age;
  public String talk( )
  {
    return "I am " + this.name + ", I am " + this.age + " years old";
  }
}
class Student extends Person
{
  String school;
  public Student( String name, int age, String school )
  {
    // 分别为属性赋值
    this.name = name;  //super.name = name;
    this.age = age;   //super.age = age;
    this.school = school;
  }
  // 此处覆写Person中的talk()方法
  public String talk( )
  {
    return super.talk()+ ", I am from " + this.school ;
  }
}
public class Override2
{
  public static void main( String[] args )
  {
    Student s = new Student( "Jack ", 25, "HAUT" );
    // 此时调用的是子类中的talk()方法
    System.out.println( s.talk() );
  }
}

3 运行

I am Jack , I am 25 years old, I am from HAUT

4 说明

在完成方法覆写时,需要注意以下几点:

  • 覆写方法的返回类型必须和被覆写的方法的返回类型一致。
  • 被覆写的方法不能为static。
  • 被覆写的方法不能拥有比父类更严格的访问控制权限。

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • 区分Java的方法覆盖与变量覆盖

    首先,我们看看关于重载,和覆盖(重写)的简明定义: 方法重载:如果有两个方法的方法名相同,但参数不一致,哪么可以说一个方法是另一个方法的重载. 方法覆盖:如果在子类中定义一个方法,其名称.返回类型及参数签名正好与父类中某个方法的名称.返回类型及参数签名相匹配,那么可以说,子类的方法覆盖了父类的方法 我们重点说说覆盖问题,以如下代码为例: public class People { public String getName() { return "people"; } } public

  • PHP和JAVA中的重载(overload)和覆盖(override) 介绍

    重载:同一个类中,函数名一样,返回值或者参数类型,个数不一样的叫做重载. 覆盖:同名函数,同返回值类型,同参数的叫做覆盖.指的是子类对父类中方法的覆盖. PHP不支持方法和操作符重载.JAVA不支持操作符的重载(但是"+"实际上是一种操作符重载). 复制代码 代码如下: <?php Class Father { public function fmeth1() { echo "fmeth1()...<br>"; } //public functio

  • java中重载、覆盖和隐藏三者的区别分析

    重载:方法名相同,但参数不同的多个同名函数 注意:1.参数不同的意思是参数类型.参数个数.参数顺序至少有一个不同 2.返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg:void a ()和int a() ,如果调用a(),出现歧义) 3.main方法也是可以被重载的 覆盖:子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同 两同两小一大  注意:子类实例方法不能覆盖父类的

  • 深入理解java中的重载和覆盖

    说到java中的重载和覆盖呢,大家都很熟悉了吧,但是呢我今天就要写这个. 本文主题: 一.什么是重载 二.什么是覆盖 三.两者之间的区别 重载(overload): 在一个类中,如果出现了两个或者两个以上的同名函数,只要它们的参数的个数,或者参数的类型不同,即可称之为该函数重载了. 即当函数同名时,只看参数列表.和返回值类型没关系. 重载使用的时候需要注意: 1.在使用重载时只能通过不同的参数样式.例如,不同的参数类型,不同的参数个数,不同的参数顺序. 2.方法的异常类型和数目不会对重载造成影响

  • 详解java重载与覆写的区别

    很多同学对于overload和override傻傻分不清楚,建议不要死记硬背概念性的知识,要理解着去记忆. 先给出我的定义: 首先我们来讲讲:重载(Overloading) (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型.重载Overloading是一个类中多态性的一种表现. (2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义.调用方法时通过传递给它们的不同参数个数和参数类型来决定

  • 解析Java继承中方法的覆盖和重载

    方法的覆盖 在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称.返回值类型.参数列表. 如果在新类中定义一个方法,其名称.返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法. 参数列表又叫参数签名,包括参数的类型.参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同. 被覆盖的方法在子类中只能通过super调用. 注意:覆盖不会删除父类中的方法,而是对子类的实例隐藏,暂时不使用. 请看下面的例子: public c

  • Java中覆盖finalize()方法实例代码

    本文研究的主要是Java中关于覆盖finalize()方法的一次尝试,具体实现如下. 测试代码 package com.alioo.gc; /** * 执行结果: * */ public class FinalizeEscapeGC{ public static FinalizeEscapeGC instance=null; public void isAlive(){ System.out.println("yes,i am still alive"); } @Override pr

  • Java中关于子类覆盖父类的抛出异常问题

    Java中子类覆盖父类方法抛出异常不能比父类多,这个表述不够准确. 准确一点的描述为: 子类抛出的异常类型不能比父类抛出的异常类型更宽泛.假设父类抛出异常ParentException,另外有两个子类继承自ParentException分别为ChildException1, ChildException2, 那么 子类可以同时抛出异常ChildException1,ChildException2. 满足"子类抛出的异常类型不能比父类抛出的异常类型更宽泛",这一条件. 注意: 子类也可以

  • java实例方法被覆盖,静态方法被隐藏Explain(详解)

    被覆盖比较好理解,类似于多态的实现,访问时通过类方法表来访问,你实际是什么类型,访问的方法就是那个类型的方法而不会是你的父类的方法. 被隐藏是指静态方法的访问是根据当前对象的表面类型来决定的,比如 Super s = new Sub(); s.greeting()访问的是Super的静态方法,如果是Sub s = new Sub();则访问的是Sub的静态方法. 换句话说,这个实现不了多态. 此外,静态方法和实例方法不能互相覆盖(会报错),因为他们的在字节码中的的绑定位置不同. 以上这篇java

  • Java方法的覆盖与隐藏的区别分析

    关于隐藏和覆盖的区别,要提到RTTI(run-time type identification)(运行期类型检查),也就是运行期的多态,当一个父类引用指向子类对象的时候,请看下面我编写的一段代码: 复制代码 代码如下: public class RunTime { public static void main(String[] args) {        Animal a = new Cat();        System.out.println(a.A);        System.o

随机推荐