复用类有两种实现方式。

  • 在新的类中产生现有类的对象,由于新的类是由现有类的对象所组成,所以这种方法称之为组合。
  • 采用继承实现。

一  组合语法

下面创建两个类WaterSource和SprinklerSystem。其中SprinklerSystem中包含WaterSource的对象引用。

class WaterSource {//如果定义时没有初始化,则基本类型会被自动初始化为0,对象引用初始化为Nullprivate String s;WaterSource(){System.out.println("WaterSource()");s = "Constructed";}
}public class SprinklerSystem {private String value1,value2,value3,value4;//定义时初始化private WaterSource source = new WaterSource();private int i;private float f;public String toString() {return "value1 = " + value1 + " " + "value2 = " + value2 + " " +"value3 = " + value3 + " " +"value4 = " + value4 + "\n" +"i = " + i + "  " + "f = " + f + " " + "source = " + source;}public static void main(String[] args) {SprinklerSystem sprinklers = new SprinklerSystem();System.out.println(sprinklers);}
}

运行结果如下:

WaterSource()
value1 = null value2 = null value3 = null value4 = null
i = 0  f = 0.0 source = WaterSource@15db9742

注意:如果把一个对象以String类型输出,则默认调用的是该对象的toString()方法。

类中成员变量如果是基本基本类型则默认被初始化为零,如果是对象引用则会被初始化为null。

我们也可以自己去初始化他们:

  • 在定义成员变量的时候初始化,比如private String s1 = "happy";这意味着他们能够在构造函数被调用之前初始化。
  • 在类的构造函数中初始化;
  • 在使用这些成员变量之前初始化,这种方式称之为惰性初始化;
  • 使用实例初始化{s1 = "happy";}。

二 继承语法

Java创建一个类时,默认都是继承于Object,除非自己指定从哪个类继承。

class Cleanser{private String s = "Cleanser";public void append(String a) { s += a; }public void dilute(){append("  dilute()");}public void apply() {append("  apply()");}public void scrub() {append("  scrub()");}public String toString() {return s;}public static void main(String[] args) {Cleanser x = new Cleanser();x.dilute();x.apply();x.scrub();       System.out.println(x);}}public class Detergent extends Cleanser {public void scrub() {append(" Detergent.scrub()");super.scrub();}public void foam() {append(" foam()");}public static void main(String[] args) {Detergent x = new Detergent();x.dilute();x.apply();x.scrub();x.foam();System.out.println(x);System.out.println("Testing base class:");Cleanser.main(args);}}

运行结果如下:

Cleanser  dilute()  apply() Detergent.scrub()  scrub() foam()
Testing base class:
Cleanser  dilute()  apply()  scrub()

看以看到继承使用的是关键字extends,如果在子类中想调用父类方法,可以使用super.*。

1、初始化父类

在创建一个子类对象时,父类构造器总会在子类构造器之前被调用。

class Art{Art(){System.out.println("Art constructor");}
}class Drawing extends Art{Drawing(){System.out.println("Drawing constructor");}
}public class Cartoon extends Drawing{Cartoon(){System.out.println("Cartoon constructor");}public static void main(String[] args) {Cartoon x = new Cartoon();}
}

运行输出如下:

Art constructor
Drawing constructor
Cartoon constructor

所以很容易发现,子类对象的构建过程是从父类"向外"扩散的,所以父类在子类构造器可以访问它之前,就已经完成了初始化。

上面的父类构造函数是没有参数的,如果父类只有一个带有参数的构造器,就必须在子类构造器中用关键字super显式的编写调用父类构造器的语句,否则编译器将无法找到符合'类名()'形式的构造器。

2、重载

重载是指不同的函数使用相同的函数名,但是函数的参数个数和类型不同。调用的时候根据函数的参数来区别不同的函数。在Java中,子类可以重载父类的方法。

//重载显示
class Homer{char doh(char c) {System.out.println("doh(char)");return 'd';}float doh(float f) {System.out.println("doh(float)");return 1.0f;}
}class Milhouse{}class Bart extends Homer{void doh(Milhouse m) {System.out.println("doh(Milhouse)");}
}public class Overload {public static void main(String[] args) {Bart b = new Bart();b.doh(1);b.doh('x');b.doh(1.0f);b.doh(new Milhouse());}}

运行结果如下:

doh(float)
doh(char)
doh(float)
doh(Milhouse)

3、protected

在实际的项目中,经常会想要将某些事物尽可能对整个世界隐藏起来,但仍然允许子类的成员访问它们。关键字protected就起这个作用,它指明"就用户而言,这是private的,但对于任何继承于此类的子类,它是可以访问的“。

//Protected关键字的使用
class Villain{private String name;
    protected  void set(String nm) {name = nm;}public Villain(String name) {this.name = name;}public String toString() {return "I'm a Villain and my name is " + name;}
}public class Orc  extends Villain{private int orcNumber;public Orc(String name,int orcNumber) {super(name);this.orcNumber = orcNumber;}public void change(String name,int orcNumber) {set(name);this.orcNumber = orcNumber;}public String toString() {return "Orc " + orcNumber + ": " + super.toString();}public static void main(String[] args) {Orc orc = new Orc("Z3",12);System.out.println(orc);orc.change("l4", 23);System.out.println(orc);}
}

运行结果如下:

Orc 12: I'm a Villain and my name is Z3
Orc 23: I'm a Villain and my name is l4

可以发现子类change()方法可以访问父类的set(),这是因为set()的访问修饰符是protected。

 参考文献:

[1]Java编程思想

转载于:https://www.cnblogs.com/zyly/p/10546923.html

Java基础 -- 复用类(组合和继承)相关推荐

  1. 第二十九节:Java基础知识-类,多态,Object,数组和字符串

    前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...

  2. JAVA基础七 类和对象

    文章目录 JAVA基础七 类和对象 01 引用 02 继承 03 方法重载 04 构造方法 05 this 06 传参 07 包 08 访问修饰符 09 类属性 10 类方法 11 属性初始化 12 ...

  3. Java基础|1-07-Object类与常见API(二)@API篇

    写在前面: 此系列文是笔者在学习Java系列课程的过程中,参考相关课件.视频讲解.课程代码,并结合一些文档.思维导图及个人理解,对所学内容做的阶段性梳理与总结. 写于:2021年1月28日 内容:Ja ...

  4. java基础(类与对象、集合)

    java基础(类与对象.集合) 类与对象 类与对象中的栈和堆 构造方法 this关键字 面向对象三大特性 封装性(private) 继承性(extends) 方法重写(@override) 多态性 向 ...

  5. Java基础-Date类常用方法介绍

    Java基础-Date类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.毫秒值概念 我们在查阅Date类的API文档时,会发现这样的一句话:"The cl ...

  6. java基础-BigDecimal类常用方法介绍

    java基础-BigDecimal类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigDecimal类概述 我们知道浮点数的计算结果是未知的.原因是计算机二进制 ...

  7. Java基础18-String类【String类的特点对象个数常用方法】【超详细讲解】

    Java基础-String类[超详细讲解] String类的特点 String在java.lang.String包中 1:特点 (1)String类型不能被继承,因为由final修饰 (2)Strin ...

  8. JAVA基础––从类和对象开始

    JAVA基础--从类和对象开始 一.概念 1.面向对象中类和对象的概念 对象:对象是具有状态和行为的实体,例如某个具体的学生,或者是王者荣耀里的英雄,可以是物理实体,也可以是逻辑实体. 类:类是一组具 ...

  9. Java接口与类之间继承,多态的练习,文字游戏,

    Java接口与类之间继承,多态的练习例题,文字游戏, 问题描述: 一.定义两个接口: public interface Assaultable可攻击的, 接口有一个抽象方法public abstrac ...

最新文章

  1. dr优先级默认_当配置一个CISCO的路由器时,缺省的DR和BDR优先级是()。
  2. Winodws10 VS2019 Clion CMake 编译 OpenCV rc 系统找不到指定的文件。NMAKE : fatal error U1077
  3. [BZOJ3992]序列统计
  4. 四维空间和五维空间N维空间遐想
  5. cycle/Pix2Pix 模型
  6. 安卓应用安全指南 4.4.1 创建/使用服务 示例代码
  7. 拳王虚拟项目公社:低价电影票怎样赚钱,低价电影票实操赚钱方法
  8. 飞狐的日线 java_JAVA 版 ATX-Client
  9. python分行打印list_python如何用print打印出列表
  10. Google Maps API v3:如何删除所有标记?
  11. html ts 播放,vue文件拆分为html + ts + css
  12. 药用计算机题目,医用计算机基础_超星尔雅_题库及答案
  13. oracle中日期转换格式,oracle日期格式转换 to_date()
  14. python装在c盘、怎么换到d盘_怎么把安装在c盘的东西移到d盘_如何把c盘的应用程序移到d盘...
  15. 惠普服务器装系统ESXI,在惠普服务器上安装ESXI 5.5卡在LSI_MR3.V00的解决方案
  16. 东方财富股吧评论爬虫和情绪分析
  17. [转]王飞跃:交通拥堵多因管理水平等所致
  18. Linux系统的安装与配置
  19. 自编码神经网络相似图片检索
  20. ISO 8583协议-银行交易的标准

热门文章

  1. 配置HDFS HttpFS和WebHDFS
  2. 【收藏】Windows编译安装Redis 6.0
  3. Hadoop Yarn生产环境核心配置参数
  4. Linux RAID1和RAID5的区别
  5. Helm部署ElasticSearch Kibana 7 集群
  6. Spark创建RDD的四种方式(一):从集合(内存)中创建 RDD代码示例
  7. jenkins基本使用
  8. 请你解释一下什么是线程池(thread pool)?
  9. eclipse报jvm terminated.exitcode=2错误的解决方法
  10. 两个数据集,本地可以关联,正式库关联不了