`
incyanggan
  • 浏览: 35205 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Java菜鸟学习笔记--面向对象篇(十):有爱的打印机实例

 
阅读更多

流程

某日,在办公室中...
客户A:我需要写一个控制打印机的程序,我的办公室现在有一台HP打印机~能开机,关机,打印就行了
程序猿B:没问题!~(so easy生气

1.HP打印机类
class HPprinter{

	void open(){
		System.out.println("Open");
	}
	
	void close(){
		System.out.println("Close");
	}

	void printer(){
	
		System.out.println("Printer...");
	}	
}

2.执行功能类

public class Test{

	public static void main(String[] args){

		//执行打印机程序
		
		HPprinter client=new HPprinter();
		client.open();
		client.printer();
		client.close();	
	}

}

执行结果:


次日,在办公室中...
客户A:我办公室又买了一台Canon打印机,关机前还带清洁功能呢~帮我再写个程序吧,应该很容易吧?
程序猿B:好吧!~(客户就是上帝...xxxx发火


1.HP打印机类
public class Test{

	public static void main(String[] args){

		//执行打印机程序
		
		HPprinter client=new HPprinter();
		client.open();
		client.printer();
		client.close();	
	}

}

2.Canon打印机类
class CanonPrinter{

	void open(){
		System.out.println("Open...你好 色彩~");
	}

	void close(){
		clean();
		System.out.println("Close..  佳能 感动常在~");
	}

	void printer(){

		System.out.println("Canon--> Print....");
	}

	void clean(){
		
		System.out.println("正在清洁...");
	}
}
3.执行过程
public class Test{

	public static void main(String[] args){
		//选择用哪个打印机
		int flag=1;
		//执行打印机程序
		if(flag==0){
	
			HPprinter client=new HPprinter();
			client.open();
			client.printer();
			client.close();	
		}
		else if (flag==1){
			CanonPrinter one=new CanonPrinter();
			one.open();
			one.printer();
			one.close();

		}
	}

}
4.结果:



次次次日,在办公室中...
客户A:我办公室又买了一台xxxx打印机,还带xxxx功能呢~帮我再写个程序吧,应该很容易吧?
程序猿B:你大爷的~

问题


是不是没多一台就要多写一次几个功能方法?
是不是代码重复了?
怎么解决?
-------面向对象的继承

1.修改后的打印机父类
//打印机父类
class Printer{

	void open(){
		System.out.println("Open..");
	}
	
	void close(){

		System.out.println("Close..");
	}
	
	void print(){
		System.out.println("Print-->");
	}
}

2.HP
//HP打印功能
class HP extends Printer{
	
	//基本功能已经可以从父类继承,需要扩展可以通过复写,增加方法都可以

}

3.Canon类

//Canon打印机
class Canon extends Printer{

	//Canon特色,复写几个功能
	void open(){
		System.out.println("Canon 你好色彩");
		super.open();
	}
	//扩展关机功能
	void close(){
		this.clean();
		System.out.println("Canon 感动感动常在");
		super.close();
	}
	void clean(){
		System.out.println("clean...");
	}

}

4.Test

public class Test{
	public static void main(String[] args){

		//调用打印机
		int flag=1;
		
		switch(flag){
		
			case 0:{
				HP one=new HP();
				one.open();
				one.print();
				one.close();
				break;
			}
	
			case 1:{
				Canon sec=new Canon();
				sec.open();
				sec.print();
				sec.close();
				break;
			}

			default:{
				System.out.println("选择错误");
				break;
			}	
			
		}

				
	}


}

5.结果:



次次次次次日,在办公室中...
客户A:我办公室又买了一台xxxx打印机,还带xxxx功能呢~帮我再写个程序吧,应该很容易吧?
程序猿B:我把全世界的打印机的程序都写了把~


上一次隐患



在上次编写的打印机代码中,直接在父类定义了打印方法的实现,严格上来说存在了一下问题
(1).两种打印机的Print()方法实现在真是情况下是不同的。
(2).上次利用的是现在父类写实现,子类通过复写打印方法,能不能直接留空方法体呢?
(3).在父类print(){//留空}中,是否存在什么安全隐患呢?

流程

//打印机父类
class Printer{

	void open(){
		System.out.println("Open...");
	}
	
	void close(){

		System.out.println("Close...");
	}
	//实现留空的打印方法	
	void print(){

	}
}

//Canon打印机
class Canon extends Printer{

	//复写print方法
	void print(){
		System.out.println("Canon 喷墨打印机 ");
	}
}
//HP打印机
class HP extends Printer{


	//改写print方法
	void print(){

		System.out.println("HP 激光打印机");
	}
}

//测试方法
public class Test{

	public static void main(String args[]){
	
		//测试打印机
		HP one=new HP();
		one.open();
		one.print();
		one.close();	
		
		Canon sec=new Canon();
		sec.open();
		sec.print();
		sec.close();
	}
}
//输出
/*
yg@yg-Ubuntu:~/Desktop/code$ javac *.java
yg@yg-Ubuntu:~/Desktop/code$ java Test
Open...
HP 激光打印机
Close...
Open...
Canon 喷墨打印机 
Close...*/









问题:子类忘记复写方法会怎么样?


yg@yg-Ubuntu:~/Desktop/code$ javac *.java
yg@yg-Ubuntu:~/Desktop/code$ java Test
Open...
Close...
Open...
Canon 喷墨打印机 
Close...


(1).如上在编译时候无问题,说明语法上不存在错误,但是HP打印功能上少了!

用抽象类改写父类


(1).用抽象类后,继承者必须完成抽象函数的实现,不然编译则无法通过,这样也将错误停留在编译阶段。


//抽象类改写父类
abstract class Printer{

	void open(){
		System.out.println("Open...");
	}
	
	void close(){

		System.out.println("Close...");
	}
		
	//抽象方法
 	abstract void print();
}

编译运行:

HP.java:2: error: HP is not abstract and does not override abstract method print() in Printer
class HP extends Printer{
^
1 error//再用抽象类后,继承者必须完成抽象函数的实现,不然编译则无法通过,这样也将错误停留在








作者:YangGan
出处:http://blog.csdn.net/incyanggan
本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名Yanggan(包含链接).

分享到:
评论

相关推荐

    菜鸟Java葵花宝典2017-2018

    《菜鸟Java葵花宝典2017-2018》是一本专注于Java学习与面试的资源集合,旨在帮助初学者系统地掌握Java编程语言并为面试做好充分准备。这本书可能涵盖了Java的基础知识、进阶特性、设计模式以及常见面试问题等内容。...

    菜鸟的SAP自学学习笔记

    ### SAP自学学习笔记知识点概述 #### 一、配置总体框架 **1.1 系统环境** - **定义**: 指的是SAP系统的基本硬件和软件环境。 - **重要性**: 正确配置系统环境是确保SAP系统正常运行的基础。 - **涉及内容**: - ...

    JAVA菜鸟面试题库

    综上所述,面对JAVA面试,面试者应当注重技术基础的学习与积累,并在此基础上提升自己的综合能力,包括但不限于沟通技巧、团队协作能力等。同时,了解当前市场的薪资水平和公司招聘偏好有助于更好地定位自己,为未来...

    Java基础知识笔记详细版-菜鸟翻阅必备

    - 面向对象:Java是一种完全面向对象的语言,支持封装、继承和多态三大特性。 - 平台无关性:通过Java虚拟机(JVM)实现了“一次编写,到处运行”的目标。 - 健壮性:具有自动垃圾回收功能,减少了内存泄漏等问题。...

    java学习类网站,让你有菜鸟变高手

    ### Java学习资源汇总:从入门到精通 #### 引言 随着互联网技术的快速发展与迭代,Java作为一门经典的编程语言,依然占据着重要的地位。对于初学者或是希望提升技能的人来说,选择合适的在线学习资源至关重要。...

    C++学习笔记- 面向对象 .md

    内容是C++面对对象的,目录大致来源于菜鸟文档的C++面向对象,笔记是参考各种文章以及菜鸟文档改编的,内容包含C++类和对象(类定义和对象定义,类成员函数,类访问修饰符,友元函数,内联函数,this指针,静态成员...

    Java学生管理系统——菜鸟

    - **面向对象编程**:Java是一种面向对象的语言,系统的核心会涉及类的设计,包括学生类、班级类、教师类等,每个类都会有自己的属性和方法。 - **控制结构**:如if-else语句、switch-case、for、while循环用于...

    LaTeX 学习笔记v2.0

    ### LaTeX 学习笔记v2.0 知识点概览 #### 1. 历史回顾与技术进步 - **页面描述语言**: 页面描述语言(Page Description Language, PDL)是一种用来描述文档外观的语言,它使得文档可以被打印机或显示设备精确地...

    java学习过程中一点总结带实例程序,按章节渐进的

    本资源是一份针对初学者的Java学习总结,通过实例程序逐步讲解,帮助菜鸟级学习者理解Java的基本概念和常用技术。 1. **Java基础** - **数据类型**:Java分为原始数据类型(如整型、浮点型、字符型和布尔型)和...

    java学习1-3课笔记

    这份"java学习1-3课笔记"涵盖了初学者入门Java的基础知识,由张孝祥老师的课程内容整理而成,适合对编程感兴趣的菜鸟们作为学习参考资料。 1. **Java简介**: Java是由Sun Microsystems(现为Oracle Corporation的...

    Android studio1.3.1从菜鸟到高手--第一季-视频-百度盘

    根据提供的文件信息,我们可以推断出这是一套关于Android Studio 1.3.1的教学视频资料,主要面向初学者到进阶用户。接下来,我们将基于这些信息深入探讨相关的知识点。 ### Android Studio 1.3.1简介 Android ...

    gold菜鸟云计算资源-AWS笔记

    - **增强可用性**:确保有足够的资源应对流量高峰。 - **加强成本管理**:按需动态调整资源,避免资源浪费。 **扩展选项**: - **横向扩展(Scaling Out)**:增加更多实例以支持更大流量。 - **纵向扩展(Scaling ...

    20210808-银河证券-交通运输行业:菜鸟网络业绩表现持续向好,京东航空获批筹建.rar

    标题中的“20210808-银河证券-交通运输行业:菜鸟网络业绩表现持续向好,京东航空获批筹建”表明这是一份由银河证券发布的关于2021年8月8日交通运输行业的研究报告,重点提及了菜鸟网络的业务发展情况以及京东航空的...

    runoob菜鸟教程网站镜像

    - **适用对象**:主要面向编程初学者和技术爱好者。 - **应用场景**: - **自学**:利用runoob提供的资源进行自我提升。 - **备课**:教师可以借助这些资源准备课程材料。 - **项目参考**:开发者在项目开发过程...

    C#制作麻将游戏源码,

    此外,“对刚学OO思想想俺一样的菜鸟或许有那么点帮助”暗示源码可能包含了一些面向对象编程(Object-Oriented Programming, OOP)的基础应用,如继承、封装和多态性。 【标签】:“winForm程序”说明这个游戏是...

    JAVA初学者笔记 使用JAVA理解逻辑基础-菜鸟入门(简单易懂)

    Java提供了两个主要的技术开发平台:Java SE(标准版)用于桌面应用程序的开发,而Java EE(企业版)则针对网络程序和企业级应用。 要开始学习Java,你需要安装JDK(Java Development Kit),并配置相应的环境变量...

    大数据开发资源.docx

    - **学习目标**:掌握Java编程基础,虽然不是所有大数据岗位都强制要求,但对于深入理解和使用某些大数据框架(如Hadoop)很有帮助。 - **学习途径**:利用在线课程和实际编程练习来提高技能水平。 **1.4 Scala基础...

Global site tag (gtag.js) - Google Analytics