当前位置: 首页 > 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出错记录
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 07.Android之多媒体问题
  • classpath对获取配置文件的影响
  • css布局,左右固定中间自适应实现
  • C学习-枚举(九)
  • Hibernate【inverse和cascade属性】知识要点
  • JS笔记四:作用域、变量(函数)提升
  • php中curl和soap方式请求服务超时问题
  • Promise初体验
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • SpiderData 2019年2月23日 DApp数据排行榜
  • SpringBoot 实战 (三) | 配置文件详解
  • 关于extract.autodesk.io的一些说明
  • 回顾2016
  • 前端自动化解决方案
  • 日剧·日综资源集合(建议收藏)
  • 如何合理的规划jvm性能调优
  • 线上 python http server profile 实践
  • # include “ “ 和 # include < >两者的区别
  • #if 1...#endif
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (数据结构)顺序表的定义
  • (四)Controller接口控制器详解(三)
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .NET Core 和 .NET Framework 中的 MEF2
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET下的多线程编程—1-线程机制概述
  • .net项目IIS、VS 附加进程调试
  • .net专家(张羿专栏)
  • /bin/bash^M: bad interpreter: No such file or directory
  • [.net] 如何在mail的加入正文显示图片
  • [.net]官方水晶报表的使用以演示下载
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [AX]AX2012 AIF(四):文档服务应用实例
  • [BJDCTF2020]The mystery of ip
  • [C#]C#学习笔记-CIL和动态程序集