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方法,假设找到了那么就运行这种方法。没有找到就去父类寻找,一直到找到为止。
JAVA中的继承和覆盖的更多相关文章
- Java中的继承
我们在以前的学习中,我们会了C#中的继承,今天我们来了解了解Java中的继承,其实都大同小异啦! 1.语法 修饰符 SubClass extends SuperClass(){ //类定义部分 } e ...
- java方法的继承,覆盖与重载
java中的继承使用extends关键字,在子类继承了父类之后将会获得父类的全部属性与方法(父类的构造器除外).如果在定义java类时没有显示定义她的父类,那么这个类默认将扩展java.lang.Ob ...
- Java中的继承、封装、多态的理解
Java中的继承.封装.多态 继承的理解: 1.继承是面向对象的三大特征之一,也是实现代码复用的重要手段.Java的继承具有单继承的特点,每个子类只有一个直接父类. 2.Java的继承通过extend ...
- 关于Java中的继承和组合的一个错误使用的例子
[TOC] 关于Java中的继承和组合的一个错误使用的例子 相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下.如果我某些地方写的不对,或者比较幼稚, ...
- java中的继承与oc中的继承的区别
为什么要使用继承? 继承的好处: (1)抽取出了重复的代码,使代码更加灵活 (2)建立了类和类之间的联系 继承的缺点: 耦合性太强 OC中的继承 1.OC中不允许子类和父类拥有相同名称的成员变量名:( ...
- <Java中的继承和组合之间的联系和区别>
//Java中的继承和组合之间的联系和区别 //本例是继承 class Animal { private void beat() { System.out.println("心胀跳动...& ...
- extends:类似于java中的继承特征,extends="struts-default"
extends:类似于java中的继承特征,extends="struts-default"就是继承struts-default.xml,它里面定义了许多跳转类型.拦截器等一些常用 ...
- 关于java中的继承
我们都知道Java中的继承是复用代码.扩展子类的一种方式,继承使得Java中重复的代码能够被提取出来供子类共用,对于Java程序的性能以及修改和扩展有很大的意义,所以这是一个非常重要的知识点. 那么对 ...
- 浅析 Java 中的继承和重写
浅析 Java 中的继承和重写 Java 中的构造方法不能被继承. Java 中 static 修饰的方法可以被继承,但不能被子类重写. Java 中 final 修饰方法不允许被子类重写,但是可以被 ...
随机推荐
- cos-26上传
在开发中常常需要上传文件,上传文件的方式有很多种,这里有一个cos实现的例子. 首先是要拷贝cos.jar包拷贝到WEB-INF/lib目录下,然后才进行编码. 创建一个可以进行自动重命名的Java文 ...
- Java导出Excel和CSV(简单Demo)
Java导出Excel和CSV的简单实现,分别使用POI和JavaCSV. JavaBean public class ReportInfo { int id; String date; int nu ...
- Drupal7安装完整教程
Drupal7 史前准备工作(安装 AppServ)AppServ 是 PHP 网页架站工具组合包,作者将一些网络上免费的架站资源重新包装成单一的安装程序,以方便初学者快速完成架站,AppServ 所 ...
- linux 下makefile
linux下c编程中makefile是必须会的,我刚开始学,将我对makefile的理解记录下来. 通常我们在windows下编写c程序,有各种ide工具为我们执行makefile工作但在linux下 ...
- 转:php使用websocket示例详解
原文来自于:http://www.jb51.net/article/48019.htm 这篇文章主要介绍了php使用websocket示例,需要的朋友可以参考下 下面我画了一个图演示 client ...
- jQuery折叠风琴
这个效果用jQuery做是很方便的,根本不需要搞得很复杂. 网上有些效果DEMO不仅用了jQuery还引用一两个封装文件,真是匪夷所思. 最初想到了toggle: jQuery(document).r ...
- 揪出“凶手”——实战WinDbg分析电脑蓝屏原因
http://www.appinn.com/blue-screen-search-code/ 蓝屏代码查询器 – 找出蓝屏的元凶 11 文章标签: windows / 系统 / 蓝屏. 蓝屏代码查询器 ...
- 深入浅出 Java Concurrency (1) : J.U.C的整体认识
转 http://www.blogjava.net/xylz/archive/2010/06/30/324915.html 去年年底有一个Guice的研究计划,可惜由于工作“繁忙”加上实际工作中没有用 ...
- 想做Android Wear开发?你得先搞明白这四件事
手环和手表的腕上穿戴之争,随着Apple Watch发布和Android Wear不断完善而告一段落.尽管续航上略有缺陷,但手表以其类似手机可扩展的生态环境赢得了众多巨头的支持. Google曾透露, ...
- mysql安装2
linux下安装mysql-5.1.51.tar.gz (2010-10-27 10:59:26) 转载▼ 标签: mysql 数据库 tar.gz安装 杂谈 分类: Mysql数据库 MySQL h ...