9.抽象类和接口

Posted wlxslsb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9.抽象类和接口相关的知识,希望对你有一定的参考价值。

一.抽象类和方法
1.抽象关键字:abstract
2.抽象方法的特点:没有方法的实现,必须出现在抽象类中
3.抽象类的特点:不一定要有抽象方法,可以有普通方法,不能被实例化,子类继承抽象父类必须重写抽象方法
4.抽象类的用途:在程序的设计过程中使用,作为类的模板或者框架

二.接口
1.定义:对行为的一种规范。在java中接口和类是同一级别
2.语法:
定义接口:interface
实现接口:implements
3.特点:
a.在接口中只能定义静态常量和抽象方法
b.接口不能实例化,必须由实现类实现再被调用
c.接口可以多实现,解决了java中单一继承的局限
d.实现类一旦实现接口就必须实现接口的全部抽象方法

三.例子

开发一个租车系统
车型以及每天的租金
小车 客车
别克 途观 宝马 宾利 12> 20> 32>
300 600 800 1500 800 1200 1800
要求:客户选择车型,再输入天数,计算出租金?

思路:
一:发现类
车类(Vehicle):父类
小车(Car):子类
客车(Bus):子类
二:发现属性和方法
车类属性:每天租金
车类的方法:计算租金(抽象方法)

小车属性:品牌
方法:重写父类计算租金方法,属性的get/set方法,在set或者get方法中完成品牌的判断从而得到每天的租金

客车属性:座位数
方法:同上

业务升级1:加入了新的车种,货车。货车是按吨数来计算日租金,每吨每天50块。把该功能加入到原有系统中
业务升级2:可以选择多次租车,最后完成总金额的计算


二。接口练习
1.设计笔记本电脑的usb接口,接入不同的产品
移动硬盘
电风扇
完成相应的工作。
思路:
发现类:
笔记本电脑
属性:usb接口
方法:笔记本运行--在这个方法中就会去调用usb接口接入进来的方法
USB接口:
工作方法(抽象)
移动硬盘:实现USB接口
电风扇:实现USB接口
测试类:创建笔记本,创建移动硬盘或者是电风扇接入笔记本开始工作

2.开发一个打印机:
打印机可以使用不同的纸张和墨盒。
现在有A4,B5两个厂商生产纸张,有黑白和彩色两个厂商生产墨盒。
用户可以选择不同纸张和墨盒打印不同效果。
采用面向接口的方式。

 

/*开发一个租车系统
车型以及每天的租金
	小车							客车
别克	途观	宝马	宾利		   12>	   20>	   32>
300	600	800	1500	   800	   1200	   1800
要求:客户选择车型,再输入天数,计算出租金?

思路:
一:发现类
车类(Vehicle):父类
小车(Car):子类
客车(Bus):子类
二:发现属性和方法
车类属性:每天租金
车类的方法:计算租金(抽象方法)

小车属性:品牌
方法:重写父类计算租金方法,属性的get/set方法,在set或者get方法中完成品牌的判断从而得到每天的租金

客车属性:座位数
方法:同上

业务升级1:加入了新的车种,货车。货车是按吨数来计算日租金,每吨每天50块。把该功能加入到原有系统中
业务升级2:可以选择多次租车,最后完成总金额的计算
*/
package com.class1107;

import java.util.Scanner;

public class Class01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Scanner sc=new Scanner(System.in);
		int cr=0;
		int sum=0;
		do{
			System.out.println("请输入要租赁的车型:小车;客车;货车");
			String sign=sc.next();
			switch(sign){
			    case "小车":
			    	Car c=new Car();
			    	System.out.println("请输入要租赁的车型:别克;途观;宝马;宾利");
			    	c.setBrand(sc.next());
			    	System.out.println("请输入要租赁的天数");
			    	cr=c.countrent(sc.nextInt());
			        break;
			    case "客车":
			    	Bus b=new Bus();
					System.out.println("请输入要租赁的客车座位数");
					b.setSeat(sc.nextInt());
					System.out.println("请输入要租赁的天数");
			    	cr=b.countrent(sc.nextInt());
			    	break;
			    case "货车":
			    	Trucks t=new Trucks();
			    	System.out.println("请输入要租赁的客车吨位");
					t.setTon(sc.nextInt());
					System.out.println("请输入要租赁的天数");
			    	cr=t.countrent(sc.nextInt());
			    	break;
			    default:
			    	System.out.println("输入有误,请重新输入");
			    	break;
			}
			System.out.println("您本次租车的租金为:"+cr+"元");
			sum+=cr;
			System.out.println("是否继续租车:y/n");
			if(sc.next().equals("n"))
			{
				break;
			}
		}while(true);
		System.out.println("您的总租金为:"+sum+"元");
	}
}

abstract class Vehicle{
	int dayrent;
	public abstract int countrent(int day);
}

class Car extends Vehicle{
	private String brand;
	public void setBrand(String brand)
	{
		this.brand=brand;
		switch(brand){
		    case "别克":
		    	dayrent=300;
			    break;
		    case "途观":
		    	dayrent=600;
		    	break;
		    case "宝马":
		    	dayrent=800;
		    	break;
		    case "宾利":
		    	dayrent=1500;
		    	break;
		}
	}
	public String getBrand()
	{
		return brand;
	}
	@Override
	public int countrent(int day)
	{
		return day*dayrent;
	}
}

class Bus extends Vehicle{
	private int seat;
	public void setSeat(int seat)
	{
		this.seat=seat;
		if(seat>0&&seat<=12){
			dayrent=800;
		}else if(seat>12&&seat<=20){
			dayrent=1200;
		}else if(seat>20&&seat<=32){
			dayrent=1800;
		}
	}
	public int getSeat()
	{
		return seat;
	}
	@Override
	public int countrent(int day)
	{
		return day*dayrent;
	}
}

class Trucks extends Vehicle{
	private int ton;
	public void setTon(int ton){
		this.ton=ton;
		dayrent=ton*50;
	}
	public int getTon(){
		return ton;
	}
	public int countrent(int day)
	{
		return day*dayrent;
	}
}

 

package com.demo1107;
/**
 *	笔记本usb案例 
 */
public class USBDemo {
	public static void main(String[] args) {
		IUSB usb = new Disk();
		Computer c = new Computer(usb);
		c.start();
	}
}

class Computer{
	IUSB usb;
	public Computer(IUSB usb) {
		this.usb = usb;
	}
	public void start(){
		System.out.println("笔记本正在启动,启动完毕,准备调用usb接口功能");
		usb.work();
	}
}

interface IUSB{
	public void work();
}

class Disk implements IUSB{
	@Override
	public void work() {
		System.out.println("我是1Tb的移动硬盘,正在读取数据");
	}
}
class Feng implements IUSB{
	@Override
	public void work() {
		System.out.println("我是电风扇,正在吹吹风");
	}
}

  

 

package com.demo1107;
/**
 *	打印机案例 
 */
public class Printer {
	public static void main(String[] args) {
		IPaper p = new B5Paper();
		IBox b = new BlackBox();
		
		Print print = new Print(p, b);
		print.println("你好,海文");
	}
}

class Print{
	IPaper paper;
	IBox box;
	public Print(IPaper paper,IBox box) {
		this.paper = paper;
		this.box = box;
	}
	
	public void println(String content){
		paper.paper();
		box.box();
		System.out.println("正在打印:"+content);
	}
}

interface IPaper{
	public void paper();
}

interface IBox{
	public void box(); 
}

class A4Paper implements IPaper{
	public void paper() {
		System.out.println("正在使用a4的纸张");
	}
}

class B5Paper implements IPaper{
	public void paper() {
		System.out.println("正在使用b5的纸张");
	}
}

class ColorBox implements IBox{
	public void box() {
		System.out.println("正在使用彩色的墨盒");
	}
}

class BlackBox implements IBox{
	public void box() {
		System.out.println("正在使用黑白的墨盒");
	}
}

 

package com.demo1107;

public class Demo2 {
	public static void main(String[] args) {
		IWasher w = new HaierWasher();//接口的类型指向实现类的对象
		System.out.println("品牌是:"+w.brand);
		w.wash();
	}
}

interface IWasher{
	static final String brand ="海尔";
	
	public abstract void wash();
}

class HaierWasher implements IWasher{
	@Override
	public void wash() {
		System.out.println("洗衣服咯");
	}
	
}

 

 
















































以上是关于9.抽象类和接口的主要内容,如果未能解决你的问题,请参考以下文章

Thinking in Java Reading Note(9.接口)

Java抽象类和接口

聊聊抽象类和接口

聊聊抽象类和接口

抽象类和接口的异同

抽象类和接口在一起?