这一章节我们来讨论一下接口与类型信息。
在之前的章节里面我们提到接口,父类引用子类对象,然后把方法给缩窄了,但是我们这一章节学习到反射,这个约束就变得没有那么严格。
我们来看看下面的例子:
package com.ray.ch11;
public class Test {
public static void main(String[] args) {
Person man = new Man();
man.sleep();
man.run();
// man.say();//error
}
}
interface Person {
public void sleep();
public void run();
}
class Man implements Person {
public void say() {
}
@Override
public void sleep() {
}
@Override
public void run() {
}
}
我们一般的代码就会向上面一样,直接定义接口,然后接口指向实现的类。一般的情况就像上面一样,方法给变少了。但是,我们修改一下方法:
package com.ray.ch11;
public class Test {
public static void main(String[] args) {
Person man = new Man();
man.sleep();
man.run();
// man.say();//error
if (man instanceof Man) {
Man man2 = (Man) man;
man2.say();
}
}
}
interface Person {
public void sleep();
public void run();
}
class Man implements Person {
public void say() {
}
@Override
public void sleep() {
}
@Override
public void run() {
}
}
我们修改了一下,通过isInstanceOf方法,来向下转型,这样我们就可以得到Man里面所有的方法,甚至是下面的代码:
package com.ray.ch11;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
try {
Class<?> manClass = Class.forName("com.ray.ch11.Man");
Man man = (Man) manClass.newInstance();
Method[] methods = man.getClass().getDeclaredMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
Method sayMethod = manClass.newInstance().getClass()
.getDeclaredMethod("say");
sayMethod.setAccessible(true);
sayMethod.invoke(man);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
interface Person {
public void sleep();
public void run();
}
class Man implements Person {
private void say() {
System.out.println("method say");
}
@Override
public void sleep() {
}
@Override
public void run() {
}
}
通过上面的代码,我们直接调用类里面所有的方法,包括私有方法。
这个对于封装来说是比较致命的,因此,我们提供的服务端代码一般都隐藏了类的信息,例如:
package com.ray.ch11;
public class Test {
public static Person makePerson() {
return new Man();
}
public static void main(String[] args) {
Person person = makePerson();
}
}
interface Person {
public void sleep();
public void run();
}
class Man implements Person {
private void say() {
System.out.println("method say");
}
@Override
public void sleep() {
}
@Override
public void run() {
}
}
我们通过一个方法隐含了类的实现,全部是以接口的形式对外展现,这样就可以避免了上面的一些问题。
总结:这一章节主要讲述了接口与类型信息的内容,需要注意跨过接口直接调用类的情况。
这一章节就到这里,谢谢。
-----------------------------------
目录
分享到:
相关推荐
从头写React-like框架的工程搭建实现 最近在网上看到了 Build your own React 这篇文章,作者从零开始实现了一个简易类 React 框架,虽然没有过多的优化,但 React 中的核心思想 Concurrent Mode,Fiber ...
从头开始学习Java课程-资料来源PillsInformática。
微信公众平台测试号开发,javaweb,serlvet开发
3. 线程安全:项目中使用了Java的synchronized关键字和Lock接口来确保线程安全。这样可以避免多个线程同时访问共享资源,从而避免数据不一致和其他潜在问题。 4. 基于Http协议:项目使用了Java的HttpURLConnection...
Java-3D游戏引擎与基本游戏Java中使用LWJGL,OpenGL,OpenAL等的3D游戏引擎。 从头开始
所有包装类都支持 AutoCloseable,因此您可以使用该语句自动关闭和释放本机资源。 这可以防止难以追踪本机内存泄漏。 try (final var spi = new Spi("/dev/spidev1.0", 0, 500000)) { final var txB
一份很全面关于java的常用方法总结,开发时,我们记不了那么多方法,所以这个htm文档很适合大家在开中应用 字符串 1、获取字符串的长度 length() 2 、判断字符串的前缀或后缀与已知字符串是否相同 前缀 startsWith...
军工行业2021年度投资策略:而今迈步从头越-20201115-招商证券.pdf
外卖订餐java源码 你会学到什么 通过 Java 片段的构建块,您将能够立即了解 Java 编程的要点。 你需要什么 勇敢地浏览存储库! 或替代开源 JDK 1.8 版本 截至今天,该存储库已通过测试 Oracle JDK 1.8 OpenJDK 1.8 ...
赖世雄英语从头学 下载-附件资源
视频 https://www.bilibili.com/video/BV1914y1s7hi
视频 https://www.bilibili.com/video/BV1914y1s7hi
《Java Web服务:构建与运行》通过提供混合架构概述、完整的工作代码示例以及短而精确的编译、部署和执行应用程序的指示,采用明确实用的方法来处理这些技术。你将学习如何从头开始编写Web服务以及集成现有服务到你...
本资料是UCSF DOCK的使用案例分享的输入资料,将使用DOCK 6.11自带的片段库,使用DOCK/RDKit的 DOCK_D3N功能从头设计分子。便于使用者直接从这部分设计工作开始,不需花时间来准备输入文件。
当直接在Android中引入poi,当你keep了所有的类和方法,以及dontwarn了所有的里边所引用java的API(主要是swt等)之后,基本的读写可以成功。 但是当想使用更多的功能的时候,其内部将调用到只有在JDK中的而Android...
乙二醇2020年度策略报告:“熊”关漫道真如铁,而今迈步从头越-20191230-光大期货-36页.rar
3D游戏从头编-网上收集,很基础. 第一回:开发环境 第二回:3D基本概念 第三回:第一个D3D程序 第四回:渲染顶点 第五回:渲染索引顶点 第六回:摄象机 第七回:灯光 第八回:纹理 第九回:3D模型(.x)
java二分法源码C++ 中的 MiniJava 编译器(从头开始) 从 MiniJava() 到用(简单)C++ 编写的编译器。 据我所知,这是最快的 Minijava(到 LLVM IR)编译器。 描述 目前,编译器处于早期开发阶段。 在撰写本文时,...
java源码字符串缓冲区 这是 Java String 、 StringBuilder和StringBuffer方法/API ...在本指南中,您将通过示例了解基本概念、API/方法、编码、程序和所有字符串操作。 Java 字符串 API 指南 (最佳实践)
教程名称:Photoshop从头学起课程目录:【】Photoshop从头学起第(1-10)【】Photoshop从头学起第(11-20)【】Photoshop从头学起第(21-30)【】Photoshop从头学起第(31-40)【】Photoshop从头学起第(41-50)【】Photoshop...