Java基础 -- 复用类(组合和继承)
复用类有两种实现方式。
- 在新的类中产生现有类的对象,由于新的类是由现有类的对象所组成,所以这种方法称之为组合。
 - 采用继承实现。
 
一 组合语法
下面创建两个类WaterSource和SprinklerSystem。其中SprinklerSystem中包含WaterSource的对象引用。
class WaterSource {
    //如果定义时没有初始化,则基本类型会被自动初始化为0,对象引用初始化为Null
    private 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编程思想
Java基础 -- 复用类(组合和继承)的更多相关文章
- Java——代码复用(组合和继承)
		
前言 "复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它必须还能够做更多的事情." Java解决问题都围绕类展开的, ...
 - Java基础—复用类
		
复用代码是Java众多引人注目的功能之一. 一般而言,实现代码重用java提供了两种方式:组合以及继承. 组合:新的类由现有类的对象所组成.(复用现有代码的功能,而非它的形式) 继承:按照现有类的类型 ...
 - 【代码笔记】Java基础:类的继承(构造器)
		
在Java中,创建对象的格式为: 类名 对象名 = new 类名(): 如: 1 JFrame jf = new JFrame(); 一个对象被创建出来时,经常要先做一些事这个对象才能正常使用,也可以 ...
 - java基础/一个类A继承了类B,那么A就叫做B的派生类或子类,B就叫基类或超类。
		
类重复,pulic class demo1 和class demo1 重复 无主类, 在cmd中输入命令: SET CLASSPATH=. (等号后为英文点符号),即可设置解释的路径为当前路径. 再次 ...
 - 第二十九节:Java基础知识-类,多态,Object,数组和字符串
		
前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...
 - Java基础-StringBuffer类与StringBuilder类简介
		
Java基础-StringBuffer类与StringBuilder类简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.StringBuffer类 在学习过String类之后 ...
 - 《Java基础——线程类》
		
Java基础--线程类 一.线程的创建之Thread类: 规则: 通过声明一个新类作为子类继承 Thread 类,并复写 run() 方法,就可以启动新线程并执行自己定义的 run()方法 ...
 - java基础-BigDecimal类常用方法介绍
		
java基础-BigDecimal类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigDecimal类概述 我们知道浮点数的计算结果是未知的.原因是计算机二进制 ...
 - java基础-BigInteger类常用方法介绍
		
java基础-BigInteger类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigInteger类概述 Java中long型为最大整数类型,对于超过long ...
 
随机推荐
- 通过百度地图API--获取全国地图的经纬度
			
因为要做一个前端画图需要经纬度,一个个的查询过麻烦,最终弄出这个,以备后查! import threading , time import requests from decimal import D ...
 - c/c++ 多线程 等待一次性事件 future概念
			
多线程 等待一次性事件 future概念 背景:有时候,一个线程只等待另一个线程一次,而且需要它等待的线程的返回值. 案例:滴滴叫车时,点完了叫车按钮后,叫车的后台线程就启动了,去通知周围的出租车.这 ...
 - SQLServer之创建Transact-SQL DDL触发器
			
DDL触发器原理 DDL 触发器用于响应各种数据定义语言 (DDL) 事件. 这些事件主要与以关键字 CREATE.ALTER.DROP.GRANT.DENY.REVOKE 或 UPDATE STAT ...
 - LeetCode算法题-Binary Number with Alternating Bits(Java实现)
			
这是悦乐书的第292次更新,第310篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第160题(顺位题号是693).给定正整数,检查它是否具有交替位:即它的二进制数的任意两 ...
 - C++面向对象程序设计之类和对象的特性
			
类和对象的属性 注意:本文为书籍摘要版,适合有一定程序基础的人阅读. 2.1 面向对象程序设计方法概述 2.1.1 什么是面向对象的程序设计 1.对象 客观世界中的任何一个事物都可以看成一个对象. 如 ...
 - springclound
			
https://blog.csdn.net/w893932747/article/details/80896315 //这个有怎么创建client的 https://blog.csdn.net/m0_ ...
 - uml类图关系
			
原文地址http://www.jfox.info/uml-lei-tu-guan-xi-fan-hua-ji-cheng-shi-xian-yi-lai-guan-lian-ju-he-zu-he 在 ...
 - HBase案例:HBase 在人工智能场景的使用
			
近几年来,人工智能逐渐火热起来,特别是和大数据一起结合使用.人工智能的主要场景又包括图像能力.语音能力.自然语言处理能力和用户画像能力等等.这些场景我们都需要处理海量的数据,处理完的数据一般都需要存储 ...
 - ASP.NET Core 微服务初探[1]:服务发现之Consul
			
ASP.NET Core 微服务初探[1]:服务发现之Consul 在传统单体架构中,由于应用动态性不强,不会频繁的更新和发布,也不会进行自动伸缩,我们通常将所有的服务地址都直接写在项目的配置文件 ...
 - MongoDB 创建基础索引、组合索引、唯一索引以及优化
			
一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引 ...