`
incyanggan
  • 浏览: 32759 次
  • 性别: 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(包含链接).

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics