java为了解决相似属性和行为能共用相同的代码,也是为了便于标准模块化。减少相同代码要多次重复编写的问题,提供了继承、重载和覆盖的功能。继承是针对类,重载和覆盖是针对方法的。

一、继承:为了便于理解。我直接举例说明:

比如我们现在有图形(Shape)、矩形(Rect)、正方形(Square)、圆(Circle)。Shape类有两个属性变量int x; int y;来表示Shape的位置,一个成员方法来up(int dy)来表示Shape的移动。

public class Shape {
int x;
int y;
public Shape(int x,int y){
this.x = x;
this.y = y;
}
public void up(int dy){
y -= dy;
}

矩形(Rect)和圆(Circle)继承图形(Shape),正方形(Square)继承矩形(Rect)继承用extends关键字表示,那么Rect和Circle和继承Shape的属性和方法。就是Rect和Circle不需要声明变量x、y和up方法,就已经有这些属性,如下代码,我们并没有在Rect类中声明x、y变量和up方法。Rect的引用变量可以访问x、y、up方法。是因为Rect从父类Shape类中继承类这些变量和方法。在这里要特别强调一下,一个子类只能继承一个父类,比如正方形(Square)只能继承矩形(Rect),不能同时继承矩形(Rect)和图像(Shape)。一个父类可以别多个子类继承。比如Shape同时被Circle和Rect继承。

public class Rect extends Shape {
int width;
int height;
public static void main(String[] args) {
Rect r = new Rect();
r.x = 3;
r.y = 3;
r.up(2);
}

在继承中子类会默认继承父类的构造器(构造方法),如果父类没有写构造器,java会默认生产一个与类名相同的无参构无返回值的造器,子类会默认继承父类的无参默认构造器。如果父类定义类有参构造器,那么java就不在为其提供给无参默认构造器。此时如果父类没有无参构造器,字类需要用super关键字调用父类构造器。

public class Shape {
int x;
int y;
//比如这个Shape类,没有定义任何构造器,java虚拟机会默认给我们加下面这个构造器
Shape(){
}

子类Rect也会默认调用父类的这个默认的构造器。

如果类中已经定义类有参构造器,即便我们再定义一个无参构造器,该构造器在ide中会是灰色。只有被调用类才会高亮

父类中已经定义类有参构造器,子类需要用super关键字调用父类构造器,注意此时即便父类中也定义类无参构造器,子类也需要super调用:并且super必须在构造器第一行。

二、重载(overload)

overload是指方法名相同,参数不同的方法:

有些子类的构造方法可以理解成是对父类方法的重载:

三:覆盖(overide)

overide一般是子类对父类方法的覆盖,要求方法名,返回值,参数类型都相同,但方法里的逻辑可以不同。

比如Rect和Circle都覆盖里Shape的contains方法:

一个点的坐标x、y到圆心的距离的平方和开根号小于等于半径就是在圆内或圆上

一个点到矩形的顶点横坐标之差在0到矩形的宽的范围并且纵左边之差在0到矩形高的范围,即为在矩形内或矩形上。

矩形和圆的contains方法的方法名,返回值类型,参数类型都完全相同,但方法里面的逻辑完全不一样,同一个方法可以解决各种不同具体对象的不同问题,这就是多态

在这里要特别提醒大家注意的是:在继承中,属性由有引用类型决定访问那个属性,方法是由对象类型决定访问那个方法。属性绑定到引用类型,方法动态绑定到对象。

在这里先补充一个知识点,字类可以给父类赋值,但父类不能给子类赋值,上图中s是Shape 类型,所以s只能访问Shape的成员变量,而Shape类中没有r这个成员变量,所以s.r会报错,而s指向的实例是一个矩形类。所以s.contains实际执行的是矩形中的contains方法,不说执行Shape中的contains方法。

思考题:下面这个代码打印结果说什么:

public class TestOverrideAndOverload {
public static void main(String[] args) {
Woo w = new Woo();
Super s = new Sub();
w.t(s);
}
}
class Woo{
public void t(Super obj){
System.out.println("Goo t(super)");
obj.s();
}
public void t(Sub obj){
System.out.println("Goo t(Sub)");
obj.s();
}
}
class Super{
public void s(){
System.out.println("Super s()");
}
}
class Sub extends Super{
public void s(){
System.out.println("Sub s()");
}
}

java中子类怎样调用父类的属性_java的继承、重载(overload)、覆盖(override)的总结...相关推荐

  1. java中子类构造方法和父类构造方法

    有继承关系的前提下,子类一定会调用父类的构造方法.因为构造方法是用来进行初始化的,子类要初始化,必须先使用父类的构造方法. 以下情形参考: 1.当子类不重写构造方法,子类默认拥有一个无参构造方法,但是 ...

  2. java 重写方法 访问权限_为何Java中子类重写方法的访问权限不能低于父类中权限(内含里氏替换原则)...

    为何Java中子类重写方法的访问权限不能低于父类中权限 因为 向上转型及Java程序设计维护的原因 例: 假设一个父类A 拥有的方法public void setXXX(){}可以被其他任意对象调用这 ...

  3. java中super用来定义父类,定义子类必须使用的关键字是 在java中子类若要继承父类,需要使用的关键字是什么...

    java定义接口时需要使用的关键字是 定义接口复使用的关键字是"interface",中文意思"接口.解释:通常接口都是制为了定义百某些规范,而在接口中只定义了方法,而没 ...

  4. 转:Java中子类是否可以继承父类的static变量和方法而呈现多态特性

    原文地址:Java中子类是否可以继承父类的static变量和方法而呈现多态特性 静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法,关于static方法,声明 ...

  5. Python OOP:继承、单继承、多继承、__mro__、子类重写父类同名属性和方法、子类调用父类同名属性和方法、多层继承、super()、私有(实例)属性和方法、获取修改私有属性值、私有类属性

    一.继承 Python⾯向对象的继承指的是多个类之间的所属关系,即⼦类默认继承⽗类的所有属性和⽅法. 继承作用:继承可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. 在P ...

  6. Java 中子类是否只继承父类的非私有变量和方法?

    今天在 CSDN 论坛中见到有人问在 Java 中子类是否只继承父类的非私有变量和方法(原贴在此).大部分跟贴都认为这句话是正确的,但是对于这个问题背后的本质理解却是错误的. 首先我们明确一下&quo ...

  7. java子类要调用父类的无参构造函数

    如果子类要调用父类的无参构造函数,则通过super()调用来实现. 子类的每一个构造方法都必须显式或隐式调用父类的一个构造方法. 如果不显式调用, 则系统隐式调用super(),即父类的无参构造方法( ...

  8. java子类调用父类变量值_java子类如何调用父类变量和方法

    深入浅出,保证一看就懂 package com.company; /** * Created by liuyazhou on 2016/9/21. */ public class Test { // ...

  9. python子类与父类属性重名_9.6.子类调用父类同名属性和方法

    # 子类调用父类同名属性和方法 ~~~ class Master(object): def __init__(self): self.kongfu = "古法烤冷面配方" # 实例 ...

最新文章

  1. 约束,索引,rownumrownum
  2. 安卓复杂的首页布局_到底该如何快速进入安卓编程?
  3. h5实现网页内容跟随窗口大小移动_HTML5使用四种方法实现移动页面自适应手机屏幕的方法总结...
  4. informix clob转oracle 乱码_Oracle 视图-序列-权限-表-事务
  5. 怎么查看和获取SQL Server实例名
  6. WeihanLi.Npoi 1.7.0 更新介绍
  7. arch linux界面优化,Archlinux 启动优化
  8. 典型的 C++ 程序员成长经历
  9. The following types may not be used as proxies 异常处理办法
  10. C++之保护和私有构造函数与析构函数
  11. 整合MVC实现文件上传
  12. 前端特效(css3)
  13. 安装了IE8.0之后网页按钮变小的恢复
  14. paddle2.0实现DNN(minst数据集)
  15. 金盾视频加密器V2014视频加密原理分析
  16. 轻量级神经网络架构综述
  17. 有一张厚度为0.1mm的纸,假设它足够大,重复将其对折,问对折多少次之后,其厚度可达(再对折一次就超过)珠穆朗玛峰的高度?(C语言)
  18. 快手 (kuaishou.net) 2.8 发布
  19. 正好股票杠杆大盘在这个位置只有两个重要买点
  20. mac 下安装 tomcat7

热门文章

  1. 95-130-410-源码-source-RabbitMQ相关-RabbitMQ Connector
  2. Spark的ShuffleManager
  3. 从头捋一遍Java项目中的五大设计原则,就不信你学不会!
  4. 你真的了解 ConcurrentHashMap 吗?
  5. 23种设计模式(5)-适配器模式
  6. 进入方法内快捷键_肝货|驱动安装流程驱动amp;快捷键设置(一)
  7. dbforge studio for oracle,dbForge Studio for Oracle(数据库管理软件)官方版
  8. java(包括springboot)读取resources下文件方式
  9. 整数的素因数权重分析
  10. Docker加入白名单