12-16面向对象之接口和抽象类的应用

1.抽象类和接口实例化

在java中可以通过对象的多态性,为抽象类和接口进行实例化操作,这样再使用抽象类和接口的时候,就可以使用子类的中覆写的方法来实现。

之所以抽象类和接口类不能直接实例化,是因为内部包含了各个抽象方法,抽象方法但都是未实现的方法,无法调用。通过多态性,子类发生向上转型,所调用的全部方法,都是被覆写过的方法。

//本程序是对抽象类和接口继续实例化的操作
abstract class A		//定义抽象类
{
	public abstract void printA();		//定义抽象方法s
}
interface B				//定义接口
{
	public abstract void printB();		//定义抽象方法
}
class C extends A implements B
{
	public void printA()				//覆写抽象类中的方法
	{
		System.out.println("这是抽象类A的方法");
	}
	public void printB()				//覆写接口中的方法
	{
		System.out.println("这是接口B的方法");
	}
}
public class Test06
{
	public static void main(String[] args)
	{
		A a = new C();			//实例化子类对象,并向上传递
		B b = new C();
		a.printA();				//调用抽象类的方法
		b.printB();				//调用接口的方法
	}
}

如果要使用抽象类和接口,只能按照以上操作。

2.抽象类的应用——定义模版

//本程序是对抽象类——定义模版的操作
abstract class Person
{
	private String name ;
	private int age ;
	public Person(String name , int age )
	{
		this.name = name ;
		this.age = age ;
	}
	public String getName()
	{
		return this.name ;
	}
	public int getAge()
	{
		return this.age ;
	}
	public void say()					//说话是一个具体的功能
	{
		System.out.println(this.getInfo());
	}
	public abstract String getInfo();	//内容又子类决定
}
class Student extends Person
{
	private String school ;
	public Student(String name , int age , String school)
	{
		super(name , age);
		this.school = school ;
	}
	public String getInfo()				//覆写
	{
		return "姓名:" + this.getName()  + ",年龄:" + this.getAge() + ",学校:" +this.school;
	}
}
class Worker extends Person
{
	private int salary ;
	public Worker(String name , int age , int salary)
	{
		super(name , age);
		this.salary = salary ;
	}
	public String getInfo()				//覆写
	{
		return "姓名:" + this.getName()  + ",年龄:" + this.getAge() + ",工资:" +this.salary;
	}
}
public class Test06
{
	public static void main(String[] args)
	{
		Student s = new  Student("ss",22,"dsad");
		Worker wor = new Worker("dd",33,100);
		Person per1 = s;
		Person per2 = wor;
		per1.say();
		per2.say();
	}
}

此时要举一反三生活中的模版设计,其本质核心:给出了设计中的框架,需要不同应用对象就其框架添加东西。

3.接口的实际引用——制定标准

//本程序是接口制定标准的操作
interface USB
{
	public abstract void start();
	public abstract void stop();
}
class Computer
{
	public static void plugin(USB usb)		//电脑可以使用接口
	{
		usb.start();
		System.out.println("电脑插上USB");
		usb.stop();
	}

}
class Flash implements USB
{
	public void start()
	{
		System.out.println("U盘启动");
	}
	public void stop()
	{
		System.out.println("U盘停止");
	}
}
class Printer implements USB
{
	public void start()
	{
		System.out.println("打印机启动");
	}
	public void stop()
	{
		System.out.println("打印机停止");
	}
}
public class Test06
{
	public static void main(String[] args)
	{
		Flash f = new Flash();
		Printer p = new Printer();
		Computer com = new Computer();
		com.plugin(f);
		com.plugin(p);
	}
}

程序解读:

接口 interface 定义的是一种标准,无论是U盘还是printer都能够调用该标准使用。

在每个对象中,覆写USB标准具体内容。

扩展:钥匙是否算是一种接口呢,每个人都属于一个对象,人具备了钥匙就能够开门。

1.工厂设计模式

//本程序是工厂设计模式的操作
interface Fruit
{
	public abstract void eat();
}
class Apple implements Fruit
{
	public void eat()
	{
		System.out.println("吃苹果");
	}
}
class Orange implements Fruit
{
	public void eat()
	{
		System.out.println("吃橘子");
	}
}
public class Test06
{
	public static void main(String[] args)
	{
		Fruit a = new Apple();
		Fruit b = new Orange();
		a.eat();
		b.eat();
	}
}

但是程序有个问题,main方法更多的是一个客户端,不负责产生苹果,只是指明苹果。此时直接在主方法中指定了要操作的子类,如果要更换子类,肯定要修改客户端。

跟特定的子类紧密的耦合在一起。

//本程序是工厂设计模式的操作
interface Fruit
{
	public abstract void eat();
}
class Factory
{
	public static Fruit getFruit(String name)
	{
		Fruit f = null;
		if ("Apple".equals(name))
		{
			f = new Apple();
		}
		if ("Orange".equals(name))
		{
			f = new Orange();
		}
		return f;
	}
}
class Apple implements Fruit
{
	public void eat()
	{
		System.out.println("吃苹果");
	}
}
class Orange implements Fruit
{
	public void eat()
	{
		System.out.println("吃橘子");
	}
}
public class Test06
{
	public static void main(String[] args)
	{
		new Factory().getFruit(args[0]).eat();
	}
}

其中,在工厂中,为了判断是否是苹果类的equals方法的顺序很有讲究。

2.代理设计模式

生活中的代理上网服务器

//本程序是工厂设计模式的操作
interface Network
{
	public abstract void browse();
}
class Real implements Network
{
	public void browse()
	{
		System.out.println("上网浏览信息");
	}
}
class  Proxy implements Network
{
	private Network network;			//代理对象
	public Proxy(Network network)
	{
		this.network = network ;
	}
	public void check()
	{
		System.out.println("用户合法");
	}
	public void browse()
	{
		this.check();
		this.network.browse();
	}
}
public class Test06
{
	public static void main(String[] args)
	{
		Network net = new Proxy(new Real());		//指定代理
		net.browse();
	}
}

3.适配器设计

具体思路:在接口中声明较多的方法,但是实际使用只是一部分。

//本程序是适配器设计模式的操作
interface  Window
{
	public abstract void open();
	public abstract void close();
	public abstract void expand();
}
abstract class WindowAdapter implements Window
{
	public void open() {};
	public void close() {};
	public void expand() {};
}
class Win extends WindowAdapter
{
	public void open()
	{
		System.out.println("打开");
	}
}
public class Test06
{
	public static void main(String[] args)
	{
		Window  x = new Win();
		x.open();
	}
}

这种设计思路在java的图形界面使用非常多。

4.内部类的扩展

之前讲解了内部类的概念,实际在抽象类中可以包含接口

//本程序是内部类扩展的操作
abstract class A
{
	public abstract void printA();
	interface B
	{
		public abstract void printB();
	}
}
class Exp extends A
{
	public void printA()
	{
		System.out.println("A打印方法");
	}
	class X implements B
	{
		public void printB()
		{
			System.out.println("B打印方法");
		}
	}
}

public class Test06
{
	public static void main(String[] args)
	{
		Exp.X aa= new Exp().new X();
		A.B a = aa;
		a.printB();
	}
}

反之,在一个接口中定义一个抽象类。

从实际开发角度,这种设计不常见,代码结构混乱。

祝大家健健康康,快快乐乐。明天就不更新了需要反馈巩固了。

时间: 2024-10-25 21:48:24

12-16面向对象之接口和抽象类的应用的相关文章

python之面向对象(接口和抽象类)

一.接口 什么是接口 继承有两种用途: 1:继承基类的方法,并且做出自己的改变或者扩展(代码重用). 2:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能. class File: #定义接口File类来模仿接口的概念. def read(self): #定接口函数read pass def write(self): #定义接口函数write pass class Txt(File): #

关于面向对象中接口和抽象类的一个比喻

一直对抽象类和接口有点疑惑,咋看功能差不多,网上找了点资料,看到一个比喻不错,记录一下. 1.飞机会飞,鸟会飞,他们都继承了同一个接口"飞":但是F22属于飞机抽象类,鸽子属于鸟抽象类. 2. 就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态):     而且只能是门,你不能说它是窗(单继承):一个门可以有锁(接口)也可以有门铃(多实现).     门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不

python开发面向对象基础:接口类&抽象类&多态&多继承

一,接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能 开发中容易出现的问题 1 class Alipay: 2 ''' 3 支付宝支付 4 ''' 5 def pay(self,money): 6 print('支付宝支付了%s元'%money) 7 8 class Applepay: 9 ''' 1

Python_015(面向对象(接口类,抽象类,多态,封装)

一.抽象类与接口类 1.抽象类:抽象即类似或者说比较像的部分,继承描述的是父类与子类的一种关系,要找出这种关系,必须先抽象再继承; a:抽象分成两个层次: 1)由对象->类:将两个有相似地方的对象抽取成类; 2)由类->父类:将两个有相似地方的类抽取成父类; :抽象最主要的作用就是划分类别(可以隔离关注点,降低复杂度) 2.为什么要有抽象类 与Java一样,Python也有抽象类的概念,需要借助模块实现,它是一个特殊的类,特殊之处在于只能被继承,不能被实例化; 类是从一些对象中抽取相同的内容而

接口和抽象类的对比,面向对象的三大特性和四大特性

Day09_SHJavaTraing_4-14-2017 一.接口和抽象类的对比1.相同点    ①都位于继承的顶端,用于被其他类实现或继承    ②都不能直接实例化对象    ③都包含抽象方法,其子类都必须覆写这些抽象方法2.区别 2.1从声明上: ①抽象类是一个类,需要使用关键字class声明        ②接口不是一个类,使用关键字interface声明 2.2从能够书写的成员上看: ①抽象类可以书写类中的所有成员 ②接口中只能书写成员变量和抽象函数(从JDK8开始,接口中可以有实现的函

Java面向对象----->接口和抽象类

抽象类和接口(一)在实际的项目中,整个项目的代码一般可以分为结构代码和逻辑的代码.就像建造房屋时,需要首先搭建整个房屋的结构,然后再细化房屋相关的其它的结构,也像制造汽车时,需要首先制作汽车的框架,然后才是安装配件以及美化等工作.程序项目的实现也遵循同样的道理.在项目设计时,一个基本的原则就是--"设计和实现相分离".也就是说结构代码和逻辑代码的分离,就像设计汽车时只需要关注汽车的相关参数,而不必过于关心如何实现这些要求的制作.程序设计时也是首先设计项目的结构,而不用过多的关系每个逻辑

Java千百问_05面向对象(005)_接口和抽象类有什么差别

点击进入_很多其它_Java千百问 1.接口和抽象类有什么差别 在Java语言中.抽象类abstract class和接口interface是抽象定义的两种机制. 正是因为这两种机制的存在,才赋予了Java强大的面向对象能力.抽象类abstract class和接口interface在对于抽象定义方面具有非常大的类似性.甚至能够相互替换.因此非常多开发人员在进行抽象定义时对二者的选择显得比較任意.事实上,两者之间还是有非常大的差别.对于它们的选择能反映出对问题本质的理解.对设计意图的理解. 了解

面向对象_多态_抽象类_接口

09.01_面向对象(多态的概述及其代码体现) A:多态(polymorphic)概述 事物存在的多种形态 B:多态前提 a:要有继承关系. b:要有方法重写. c:要有父类引用指向子类对象. C:案例演示 代码体现多态 public class Demo1_polymorphic { /** * 成员变量:编译时看左边(父类),运行时看左边(父类) * 成员方法:编译时看左边(父类),运行时看右边(子类) * @param args */ public static void main(Str

面向对象(高级篇之抽象类与接口的应用)

抽象类的实际应用-----模板设计 接口的实际应用--------制定标准 设计模式-------工厂设计 程序在接口和子类之间加入了一个过渡端,通过此过渡端取得接口的实例化对象. 设计模式-------代理设计 所谓的代理设计就是指由一个代理主题来操作真实主题,真实主题执行具体的业务操作,而代理主题负责其他相关业务的处理. 相当于我玩一个游戏需要登录游戏,在这个登录的时候可以设计两个类,一个是登录,另一个是检验你的用户名与密码,而登录是附着在检验类上的. 设计模式-------适配器设计 对于