当前位置: 首页 > news >正文

《疯狂java讲义2》读书笔记——面向对象的三大特性之一:继承(已更新完)...

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

继承

        java的继承具有单继承的特点,每个子类只有一个直接父类。

继承的特点

        java的继承通过extends关键字来实现,实现继承的类被称为子类,被继承的类被称为父类,有时也称为基类,超类。

        因为子类是一种特殊的父类,因此父类包含的范围总比子类包含的范围要大,所以可以认为父类是大类,而子类是小类。

java里子类继承父类的语法格式如下:

修饰符 class Subclass extends superclass

{ //类定义部分}

        extends关键字在英文中是扩展,不是继承!

public class Fruit 
{
   public double weight;
   public void info()
   {
       System.out.println("我是一个水果!重"+weight+"g!");
   }
}

定义Fruit类的子类Apple:

public class Apple extends Fruit
{
    public static void main (String[]args)
{
    //创建Apple对象
    Apple a=new Apple();
    //Apple 对象本身没有weight Field
    /因为Apple的父类有weight Field,也可以访问Apple对象的Field
    a.weight = 56;
    //调用Apple对象的info方法
    a.info();
}

}

java中只有一个直接父类,可以有多个间接父类。

重写父类方法

        一般子类总是以父类为基础,额外增加新的Field和方法。但是:子类需要重写父类的方法。

        方法重写要遵循”两同两小一大“原则,“两同”即方法名相同,形参列表相同;“两小”指的是子类方法返回值类型应该比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;“一大”指的是子类方法的访问权限应该比父类方法的访问权限更大或相等。

        如果需要在子类方法中调用父类中被覆盖的方法,则可以使用super(被覆盖的是实例方法)或者父类类名(被覆盖的是类方法)作为调用者来调用父类中被覆盖的方法。

 

super限定

          通过super限定来调用父类被覆盖的实例方法。

        方法重载和方法重写在英文中分别是overload和override,重载主要是发生在同一个类的多个同名方法之间,而重写发生在子类和父类的同名方法之间。

        如果子类定义了和父类同名的Field,则会发生子类Field隐藏父类Field的情形。在正常情况下,子类里定义的方法直接访问该Field默认会访问到子类中定义的Field,无法访问到父类中被隐藏的Filed。在子类定义的实例方法中可以通过super来访问父类中被隐藏的Field。如果在子类里定义了与父类中已有变量同名的变量,那么子类中定义的变量会隐藏父类中定义的变量。因为子类中定义与父类中同名的实例变量并不会完全覆盖父类中定义的实例变量,它只是简单地隐藏了父类中的实例变量。所以会出现如下特殊的情形。

class  Parent
{
	public String tag = "疯狂java讲义";
}
class Derived extends Parent
{
	//定义一个私有的tag实例变量来隐藏父类的tag实例变量
	private String tag = "轻量级javaee企业应用实战";
}
public class HideTest
{
	public static void main(String[] args) 
	{
		Derived d = new Derived();
		//程序不可访问d的私有变量tag,所以在下面语句将引起编译错误
		//System.out.println(d.tag);
		//将d变量显式地向上转型为Parent后,即可访问tag实例变量
		//程序将输出:“疯狂java讲义”
		System.out.println(((Parent)d).tag);
	}
}

(很晚了,要休息了,明天还要工作,就先写这么多,今天很开心,我夏找我呢)      

调用父类的构造器

        子类不会获得父类的构造器,但子类构造器里可以调用父类构造器的初始化代码。

        在一个构造器中调用另一个重载的构造器使用this调用来完成,在子类构造器中调用父类构造器使用super调用来完成。使用super调用父类构造器必须出现在子类构造器执行体的第一行。

        昨天的终于补完了,又到了晚上了,今天陪我夏玩耍了,在程序和女朋友之间,肯定选女朋友啊,我还没达到那种程序比交女朋友更高级的境界。 

 

转载于:https://my.oschina.net/u/3007550/blog/782013

相关文章:

  • Redis Cluster架构和设计机制简单介绍
  • Android View体系(六)从源码解析Activity的构成
  • EXCEL 读取
  • rip路由协议基本配置
  • [Unity3D]深度相机 Depth Camera
  • phpmyadmin安装教程及配置设置
  • 11.08---日记
  • 互斥量与信号量
  • 数据库备份那点事儿
  • maven 中使用jetty
  • 微软宣布Azure DNS全面通用
  • Flex 布局教程:语法篇
  • passwd命令--Linux命令应用大词典729个命令解读
  • 【阿里云资讯】马云为何还要做92届双11?
  • openstack出错记录
  • CentOS7简单部署NFS
  • golang中接口赋值与方法集
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • java小心机(3)| 浅析finalize()
  • Making An Indicator With Pure CSS
  • MaxCompute访问TableStore(OTS) 数据
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Solarized Scheme
  • tensorflow学习笔记3——MNIST应用篇
  • 高度不固定时垂直居中
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 入门级的git使用指北
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 在Unity中实现一个简单的消息管理器
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • elasticsearch-head插件安装
  • Semaphore
  • #git 撤消对文件的更改
  • #NOIP 2014# day.2 T2 寻找道路
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (javascript)再说document.body.scrollTop的使用问题
  • (windows2012共享文件夹和防火墙设置
  • (分布式缓存)Redis持久化
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (数据结构)顺序表的定义
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)http协议
  • (转载)Google Chrome调试JS
  • (转载)从 Java 代码到 Java 堆
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • (轉貼) UML中文FAQ (OO) (UML)
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .chm格式文件如何阅读
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .NET基础篇——反射的奥妙
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .pyc文件是什么?
  • @Transactional 竟也能解决分布式事务?