摘要:具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象抽象不依赖于具体,具体依赖于抽象。
9.接口 9.1 抽象类和抽象方法
抽象类:包含抽象方法的类,自身无法实例化
抽象方法:仅有声明,没有方法体
关系:抽象方法是抽象类的充分不必要条件,因此抽象类中允许方法实现和抽象方法同时存在
语法
// 抽象类 abstract class ClassName{} // 抽象方法 abstract void f()
注意点
抽象类中接入接口,则继承抽象类的导出类同样需要实现接口
9.2 接口接口:完全抽象的类
规则
使用interface关键字来替代class
访问修饰符只允许public或者默认的包访问权限
只允许方法名、参数列表、返回类型
方法类型默认固定是public
接口可以指向实现该接口的对象
用途
建立类与类之间的联系
9.2.1 接口和抽象类的使用原因——重点抽象类是抽象若干个类的共同点并用来继承,接口是在导出类中增加导出类需要的特殊方法1.问答
使用接口和抽象类的原因
依赖倒置原则(Dependecy-Inversion Principle):依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。
实现多态,能够向上转型
防止客户端程序员创建该类的对象
使用接口或抽象类的原因
接口
降低程序模块的耦合
需要实现的方法不是基类必要属性
作为单继承的补充
抽象类
复用
接口和抽象类的异同
9.3 完全解耦 1.策略设计模式定义:一个能够根据传递的参数对象的不同而具有不同行为的方法。
策略:传入的参数对象
2.适配器设计模式定义:通过适配器类将接受接口,并返回需要的接口
分类:类的适配器、对象的适配器
3.类的适配器目的:将接口从具体实现中解耦,使得接口可以应用于多种不同的具体表现
原理:如果有220V和110V电源两个(被适配对象),手机需要充电(需要实现的功能),这时候需要充电器(适配器),手机的充电方法传入参数为接口对象,原因是实现该接口的类都能作为参数传入(多态的运用)
实现
public class Adaptee220V { int output220V(){ return 220;}} public class Adaptee110V { int output110V(){ return 110;}}
public class Adapter220V extends Adaptee220V implements Target { @Override public int output5V() { int v = super.output220V(); // 将电压进行转换的具体实现 int dst = v / 44; return dst; } } public class Adapter110V extends Adaptee110V implements Target { @Override public int output5V() { int v = super.output110V(); int dst = v / 22; return dst; } }
public interface Target { int output5V(); }
public class Phone { // 充电方法,充电需要用到供电方法 void charging(Target target){ int v = target.output5V(); System.out.println("使用成功,方法为"+target.getClass().getSimpleName()+",电压为:"+v); } }
public class TestAdapter { public static void main(String[] args) { new Phone().charging(new Adapter220V()); new Phone().charging(new Adapter110V()); } }9.4 Java中的多重继承
多重继承:组合多个接口,因为Java是单继承
注意点:
当基类方法和接口方法的特征签名(方法的名称、参数顺序以及参数类型)一样时,导出类优先实现基类方法
9.5 通过继承来扩展接口
扩展接口方法
接口中implements接口
接口使用extends引用多个基类接口;原因:类多重继承时,如果被继承类中存在相同方法则无法判断调用方法。接口允许多重继承,因为都是抽象方法
// 继承多个接口的接口 public interface Human extends CanJump,CanRun,CanSay { void CanSleep(); } public interface CanJump { void jump(); void fastJump(); } public interface CanRun { void run(); void fastRun(); } public interface CanSay { void say(); void fastSay(); }9.5.1 组合接口时的名字冲突
避免使用不同接口中使用相同的方法名9.6 适配接口 9.7 接口中的域
接口中的任何域都是自动static,final,public9.7.1 初始化接口中的域因此在java SE5之前存在使用接口域创建enum类型的变量
规则
不能是空final
可以是非常量表达式
9.8 嵌套接口
规则
接口中可以嵌套在类或者其他接口中
接口中的元素都必须是public,不能声明为private,因此接口嵌套在接口中,嵌套的接口必须为public
类中嵌套接口,接口可以是private类型
实现
class A { private interface D{ void f(); }; private class DImp implements D{ @Override public void f() {}; } public class DImp2 implements D{ @Override public void f(){}; } }
interface A{ // 接口默认是abstract,不能是private,因为接口中元素只能是public //public abstract interface B{ interface B{ public static final int num = 50; }
interface C{ class D{ } }9.9 接口与工厂 1.工厂方法设计模式
原理:在工厂对象上调用类的创建方法,该工厂对象生成接口的某个实现的对象,并且可以使用多态
实现
// 接口 public interface Game { void play(); } // 工厂接口 public interface GameFactory { Game getGame(); }
// 硬币游戏类 class CoinGame implements Game{ @Override public void play() { System.out.println("This is coin game"); } } // 骰子游戏类 public class DiceGame implements Game{ @Override public void play() { System.out.println("This is dice game"); } } // 工厂类 public class GameFactoryCoin implements GameFactory { @Override public Game getGame() { return new CoinGame(); } } public class GameFactoryDice implements GameFactory { @Override public Game getGame() { return new DiceGame(); } }
public class Test19 { // 传入工厂对象 static void playGame(GameFactory gameFactory){ Game game = gameFactory.getGame(); game.play(); } public static void main(String[] args) { playGame(new GameFactoryCoin()); playGame(new GameFactoryDice()); } }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/75647.html
摘要:基类导出类导出类继承了基类的特点,基类和导出类具有相同的基础接口,形成两者差异的做法在导出类中添加新方法在导出类型中添加新的接口元素,扩展了接口。覆盖在导出类用创建方法的新定义,覆盖基类中的方法定义纯粹替代,只覆盖。 一、抽象过程 建模基于计算机的结构 解空间的解 汇编语言:对底层机器的轻微抽象 命令式语言:汇编语言的抽象 建模基于待解决问题 问题空间的元素 面向对象 二、每个...
摘要:找到字节码并创建一个对象。链接,检验字节码,为字段分配存储空间,解决其对他类的引用。初始化,如果有父类则初始化父类,执行静态初始化器和静态初始化区块直到第一次访问静态成员时初始化才执行。如果成员不是编译时常量由初始化器赋值,也会引起初始化。 有两种形式在运行时获取类型信息: 传统的RTTI 反射 Class对象 运行时的类型信息是通过Class对象表现的,它包含了类的信息。所有...
摘要:但如果导出类还有抽象方法,那这个类还应该加上声明为抽象类。并且接口具有继承的一系列特点,如向上转型等等。接口中的方法是自动是的。 Thinking in Java 好书全是干货 一、抽象类和抽象方法 抽象方法:这种方法只有声明而没有方法体,下面是抽象方法生命所采用的语法 abstract void f(); 包含抽象方法的类叫做抽象类,如果一个类包含一个或多个抽象方法,该类必须被限定为...
摘要:基于版本基于版本。由于中英行文差异,完全的逐字逐句翻译会很冗余啰嗦。译者在翻译中同时参考了谷歌百度有道翻译的译文以及编程思想第四版中文版的部分内容对其翻译死板,生造名词,语言精炼度差问题进行规避和改正。 来源:LingCoder/OnJava8 主译: LingCoder 参译: LortSir 校对:nickChenyx E-mail: 本书原作者为 [美] Bru...
摘要:内部类中也可以取得这个外部类对象引用。创建成员内部类对象的时候需要外部类对象。另外在方法中的内部类不能加等权限修饰符,只能加和修饰符。可以在接口内部定义内部类,而且他们即使没有修饰,也会自动变成的。 Thinking in Java捞干货,写笔记 一、成员内部类 1.最基本使用 public class Demo { class Contents{ privat...
阅读 1866·2023-04-25 19:51
阅读 1167·2021-11-15 11:43
阅读 4528·2021-11-02 14:40
阅读 1998·2021-10-11 10:59
阅读 1337·2021-09-22 15:05
阅读 1027·2021-09-09 09:32
阅读 648·2019-08-30 15:56
阅读 548·2019-08-30 15:52