JAVA中的继承和覆盖

java里面的继承是子类继承父类的一些方法和属性(除private属性和方法之外);对于父类的私有属性和方法子类是没有继承的;但是要想子类也能访问到父类的私有属性,必须给私有属性以外界访问的方法接口。

package com.PengRong;

public class Demo {
 public static void main(String[]  args)
 {
  /*
  Pupil stu1 = new Pupil();
  stu1.pay(500f);
  stu1.ShowName();
  System.out.println("小学生交的学费" + stu1.getFee());
  Student AK1 = new Student();
  AK1.pay(888.0f);
  System.out.println("中学生交的学费" + AK1.getFee());
  */
  //多态的实现方式
  Stu stu1 =new Pupil();
  stu1.pay(500f);
  stu1.ShowName();
  System.out.println("小学生交的学费" + stu1.getFee());
  stu1 = new Student();
  stu1.pay(200f);
  System.out.println(stu1.showname());
  System.out.println(stu1.getTestV());
 }
}
//学生类   父类
class Stu
{
 //定义成员属性
 public String name;
 public int age;
 public float fee;
 private int TestV = 90;
 public String showname()
 {
  return this.name;
 }
 //成员方法
 public void ShowName()
 {
  System.out.println("学生名字" + this.name);
 }

 public float getFee() {
  return fee;
 }

 public void setFee(float fee) {
  this.fee = fee;
 }

 public void pay(float fee)
 {
  System.out.println("默认付费方法");
  this.fee =0.5f*fee;
 }
 public int getTestV() {
  return TestV;
 }
 public void setTestV(int testV) {
  TestV = testV;
 }

}
//小学生类  子类
class Pupil extends Stu
{
 public void pay(float fee)
 {
  System.out.println("小学生付费方法");
  this.fee =fee;
 }
}

//中学生类
class Student   extends Stu
{
 public void pay(float fee)
 {
  System.out.println("中学生付费方法");
  this.fee =0.8f * fee;
 }
 public String showname()
 {
  return this.name;
 }
}

比如有一个父类Stu 包含一个属性 private int TestV;

子类Student继承父类Stu,

那么在main方法里面写入下代码

Stu stu1 = new Student();
System.out.println(stu1.TestV);

这是错误的,报错是说TestV这个属性不可见,虽然stu父类引用指向一个子类的对象可行,但是这个父类引用不是指向一个父类Stu的对象实体,这个父类引用指向的对象实体类型是Student;所以这个stu1引用不能引用父类的私有属性,为了访问父类的私有属性怎么办呢?一个解决办法就是在父类里面提供访问私有属性的方法,而且这个方法不能是私有的。

Java平台执行的规则是:“在编译阶段,可以调用那些方法和访问那些属性,这是由引用类型决定的,在程序运行的时候,具体执行那个方法,访问那个属性是对象的类型决定的。”

覆盖的本质含义就是让子类中的方法屏蔽父类的方法

覆盖语法注意两点就是了

1、子类覆盖父类的方法,那么子类方法在方法返回类型,方法名,参数列表应该一致;

2、子类方法不能缩小父类方法的访问权限

还是上面那个类,父类Stu有一个pay方法;同时子类覆盖了这个方法,在子类实现代码里面重写了这个pay方法。

Stu stu1 =new Pupil();
stu1.pay(500f);

stu1 = new Student();
stu1.pay(200f);

通过调用这段代码可以发现通过父类引用调用pay方法,他不是执行父类的方法而是执行了在子类覆盖的那个pay方法。对于在子类覆盖了父类一个方法的执行流程是如下的

1、比如在编译器编译例程时候,编译器处理到stu1.pay(500f); 时候,发现stul是Stu的一个引用,而Stu里面恰好有一个pay方法,所以编译通过。

2、程序运行时候,程序运行到stu1.pay(500f);时候,发现stu1指向的的对象是Student类的对象,所以他先去Student类中根据pay方法的方法签名寻找pay方法,如果找到了那么就执行这个方法,没有找到就去父类寻找,一直到找到为止。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-08 13:56:33

JAVA中的继承和覆盖的相关文章

JAVA中的继承

1.什么是继承 基于一个已存在的类,创建一个新的类.已存在的类即父类,新的类即子类,继承就是子类继承并拥有父类的属性和方法,同时,子类还有拥有父类所不具有的属性和方法. 父类,也称为基类.超类(superclass):子类,也称为派生类. 2.JAVA中"继承"的特点 JAVA中一个类只能继承一个父类.不像C++等语言那样,可以继承多个类.这也是JAVA比较容易学的一方面 只能继承父类中非private成员属性和方法,private是父类所特有的不能继承 3.JAVA中的"继

java中子类继承

[[email protected] java]# vim Ostrich.java //注意文件名必须是这个,因为下面代码中只有Ostrich是public修饰符.我们要明白public的含义 class Bird { public void Fly() { System.out.println("I am bird I can fly"); } } public class Ostrich extends Bird { public void Fly() { System.out.

Java中的继承、封装、多态的理解

Java中的继承.封装.多态 继承的理解: 1.继承是面向对象的三大特征之一,也是实现代码复用的重要手段.Java的继承具有单继承的特点,每个子类只有一个直接父类. 2.Java的继承通过extends关键字来实现,实现继承的类被称为子类,被继承的类称为父类(有的也称其为基类.超类),父类和子类的关系,是一种一般和特殊的关系.就像是水果和苹果的关系,苹果继承了水果,苹果是水果的子类,水果是苹果的父类,则苹果是一种特殊的水果. 3.Java使用extends作为继承的关键字,extends关键字在

java方法的继承,覆盖与重载

java中的继承使用extends关键字,在子类继承了父类之后将会获得父类的全部属性与方法(父类的构造器除外).如果在定义java类时没有显示定义她的父类,那么这个类默认将扩展java.lang.Object类.因此java.lang.Object是所有类的父类,要么是直接父类,要么就是间接父类. 方法的覆盖(Overridden Methods)    在类继承中,子类可以修改从父类继承来的行为,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的:名称.返回类型.参数列表.如果在新

Java中的继承、封装、多态

继承 所谓封装,就是将对象的成员变量和成员函数包装和隐藏起来,对外界通过特定的接口来访问. public class User { private String name; public User (String name) { this.name = name; } public String getName () { return this.name; } public void sayName () { System.out.println(this.getName()); } publi

菜鸟译文(一)——Java中的继承和组合

阅读英文的能力对于程序员来说,是很重要的.这几年也一直在学习英文,今天心血来潮,就在网上找了一篇简短的博文翻译一下.水平一般,能力有限,还请各位看官多多指点. 译文: 本文将会举例说明Java中继承和组合的概念.首先举一个继承的例子,然后展示一下如何用组合来改善继承的设计.最后概括一下如何在它们之间做出选择. 1. 继承 假设我们有一个Insect类.这个类包含两个方法:一个是move(),一个是attack(). class Insect { private int size; private

java中的继承与oc中的继承的区别

为什么要使用继承? 继承的好处: (1)抽取出了重复的代码,使代码更加灵活 (2)建立了类和类之间的联系 继承的缺点: 耦合性太强 在OC中的继承是: 1.OC中不允许子类和父类拥有相同名称的成员变量名:(java中是可以的) 2.编译器从上往下执行,所以在子类前面至少应该要有父类的声明:如 @interface Worker : Person @end 3.OC中的子类可以拥有和父类相同名称的方法,在子类调用时,优先去自己的内部寻找,如果父类没有定义该方法,则继续在继承链上查找,直到找到为止,

<Java中的继承和组合之间的联系和区别>

1 //Java中的继承和组合之间的联系和区别 2 //本例是继承 3 4 class Animal 5 { 6 private void beat() 7 { 8 System.out.println("心胀跳动..."); 9 } 10 public void breath() 11 { 12 beat(); 13 System.out.println("吸一口气,吐一口气,呼吸中..."); 14 } 15 } 16 //继承Animal,直接复用父类的bre

java中的继承关系

1.定义 java中的继承是单一的,一个子类只能拥有一个父类:java中所有类的父类是java.lang.Object,除了这个类之外,每个类只能有一个父类: 而一个父类可以有多个子类,可以被多个子类继承: Java只支持单继承,也就是说,一个类不能继承多个类. Java只支持单继承(继承基本类和抽象类),但是我们可以用接口来实现(多继承{实现}接口来实现),脚本结构如: public class One extends Parent implements Two,Three,Four{} 2.