首页 > 编程语言 >Java编程思想4

Java编程思想4

时间:2022-12-22 18:55:24浏览次数:42  
标签:Java 思想 void 编程 接口 class static Override public

第九章:接口
接口也可以包含域,但是这些域隐式地是static和final的(因此接口就成为了一种很便捷的用来创建常量组的工具)。你可以选择在接口中显示地将方法声明为public的,但即使你不这么做,它们也是public的。因此,当要实现一个接口时,在接口中被定义的方法必须被定位为是public的;否则,它们将只能得到默认的包访问权限,这样在方法被继承的过程中,其可访问权限就降低了,这是Java编译器所不允许的。

如果要从一个非接口的类继承,那么只能从一个类去继承。其余的基本元素都必须是都必须是接口。需要将所有的接口名都置于implements关键字之后,用逗号将它们一一隔开。可以继承任意多个接口,并可以向上转型为每个接口,因为每一个接口都是一个独立类型。下面这个例子展示了一个具体类组合数个接口之后产生了一个新类。

interface CanFight {
void fight();
}

interface CanSwim {
void swim();
}

interface CanFly {
void fly();
}

class ActionCharacter {
public void fight() {}
}

/**
* 当通过这种方式将一个具体类和多个接口组合在一起时,这个具体类必须放在前面,
* 后面跟着的才是接口(否则编译器会报错)
*/
class Hero extends ActionCharacter
implements CanFight, CanFly, CanSwim {

@Override
public void swim() { }

@Override
public void fly() { }
}

public class Adventure {
public static void t(CanFight x) { x.fight(); }
public static void f(CanFly x) { x.fly(); }
public static void s(CanSwim x) { x.swim(); }
public static void a(ActionCharacter x) { x.fight(); }

public static void main(String[] args) {
Hero h = new Hero();
t(h);
f(h);
s(h);
a(h);
}
}

该例也展示了使用接口的两个核心原因:

为了能够向上转型为多个基类型(以及由此而带来的灵活性)

防止客户端程序员创建该类的对象,并确保这仅仅是建立一个接口

我们也可以通过继承来扩展接口;通过继承,可以很容易地在接口中添加新的方法声明,还可以通过继承在新接口中组合数个接口。如下:

interface Monster {
void menace();
}

interface DangerousMonster extends Monster {
void destroy();
}

interface Lethal {
void kill();
}

class DragonZilla implements DangerousMonster {
@Override
public void menace() {}

@Override
public void destroy() {}
}

/**
* 改语法仅适用于接口继承
*/
interface Vampire extends DangerousMonster, Lethal {
void drinkBlood();
}

class VeryBadVampire implements Vampire {
@Override
public void menace() {}

@Override
public void destroy() {}

@Override
public void kill() {}

@Override
public void drinkBlood() {}
}

public class HorrorShow {
static void u(Monster b) { b.menace(); }
static void v(DangerousMonster d) {
d.menace();
d.destroy();
}
static void w (Lethal l) {
l.kill();
}

public static void main(String[] args) {
DangerousMonster barny = new DragonZilla();
u(barny);
v(barny);
Vampire vlad = new VeryBadVampire();
u(vlad);
v(vlad);
w(vlad);
}
}

由于接口是实现多重继承的途径,而生成遵循某个接口的对象的典型方式就是工厂方法设计模式。这与直接调用构造器不同,我们在工厂对象上调用的时创建方法,而该工厂对象将生成接口的某个实现的对象。理论上,我们的代码将完全与接口的实现分离,这就使得我我们可以透明地将某个实现替换成另一个实现,下面的实例展示了工厂方法的结构:

interface Service {
void method1();
void method2();
}

interface ServiceFactory {
Service getService();
}

class Implementation1 implements Service {
Implementation1() { }

@Override
public void method1() {
System.out.println("Implementation1 method1");
}
@Override
public void method2() {
System.out.println("Implementation1 method2");
}
}


class Implementation1Factory implements ServiceFactory {
@Override
public Service getService() {
return new Implementation1();
}
}

class Implementation2 implements Service {
Implementation2() { }

@Override
public void method1() {
System.out.println("Implementation2 method1");
}
@Override
public void method2() {
System.out.println("Implementation2 method2");
}
}


class Implementation2Factory implements ServiceFactory {
@Override
public Service getService() {
return new Implementation2();
}
}

public class Factories {
public static void serviceConsumer(ServiceFactory factory) {
Service s = factory.getService();
s.method1();
s.method2();
}

public static void main(String[] args) {
serviceConsumer(new Implementation1Factory());
serviceConsumer(new Implementation2Factory());
}

}

 

标签:Java,思想,void,编程,接口,class,static,Override,public
From: https://www.cnblogs.com/LvJinshuai/p/16999388.html

相关文章

  • Java7-try-with-resources
    我们开启某些资源后,需要手动关闭,一个一个手动关闭很麻烦的。还好,Java7提供了一个try-with-resources语句在try后面加个括号,如:try(//这里写开启的资源){},代码在执行结束前......
  • 观察者模式——java实现
    问题描述:当股票的价格上涨或下降5%时,会通知持有该股票的股民,当股民听到价格上涨的消息时会买股票,当价格下降时会大哭一场类图:  代码://Observer.javapackageshiy......
  • 关于Java子类对象的初始化
    classB{publicB(){System.out.println("B对象被初始化!");}}classCextendsB{publicC(){System.out.println("C对象被初始化!");......
  • centos7中卸载java1.8,并安装java12
     001、查看系统[root@pc1home]#cat/etc/redhat-releaseCentOSLinuxrelease7.9.2009(Core)  002、查看当前的java版本[root@pc1home]#java-version......
  • Java多线程
    核心概念线程就是独立的执行路径在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc线程。main()称之为主线程,为系统的入口,用于执行整个程序;在一个进程......
  • JavaScript的this的指向详解
    关于this的指向,主要有一下几个版块,①全局环境下的this指向②函数内的this③对象中的this④箭头函数中的this⑤构造函数中的this⑥原型链中的this【补充一点】关于this,谁调......
  • 实验5 结构体应用编程
    1#define_CRT_SECURE_NO_WARNINGS2#include<stdio.h>3#include<string.h>4#defineN10056typedefstruct{7charnum[10];//学号8......
  • java入门
    JAVAHelloWorld创建一个文件夹存放代码/java/code新建一个java文件文件后缀名为.javahello.java编写代码publicclassHelloWorld{ publicstaticvoidm......
  • 用JAVA发送含有附件的邮件
    1、用JAVA发送含有附件的邮件publicvoidsendKREmailAndFile(String[]toEmail,StringmailSubject,StringmailContent,List<File>fileList)throwsMessagingExcep......
  • java异常
    1、异常概述(1)异常分为:编译时异常运行时异常(2)编译时异常:javacIDE(,‘’),一般是指的语法错误,比较容易修正(3)运行时的异常:运行错误和逻辑错误1/0;(4)不正常的事件异常的类,创建对......