Java基础之六、Java编程思想(8-10)
八、多态
多态(也称作动态绑定、后期绑定或运行时绑定)
- 域(成员变量)是不具有多态性的,只有普通的方法调用是多态的,任何域访问操作都将由编译器解析,因此不是多态的
- 静态方法也是不具有多态性的
public static void main(String[] args){
Super sup = new Sub(); // Upcast
System.out.println("sup.field = " + sup.field + ". sup.getField() = " + sup.getField());//sup.field返回父类的成员值,虽然子类也定义了同名成员,sup.getField()访问子类的重写方法
}
九、接口
1:在class前添加abstract关键字,定义成抽象类。
- 抽象类不能实例化,即不能通过new生成对象,但注意可以追加{}生成匿名实现类,仍然不是它自己的实例化。
- 抽象类可以有构造函数,但不能直接调用,通常由实现类构造函数调用。
- 抽象类的方法前添加abstract关键字,定义抽象方法,派生类必须重写该方法,然后才能实例化。Java类中如有抽象方法,则类符号前必须也要添加abstract关键字,定义为抽象类(可以没有抽象方法)。
- 抽象类中可以没有抽象方法,即可以全部是含方法体的非抽象方法(可以包含已实现的成员方法)。
通过匿名类实现抽象类和接口的例子


2:接口,抽象类进一步抽象,即所有方法都没有具体实现,只声明了方法的形式,并且把class关键字改成interface关键字
- 接口可以包含域,且隐式地是static 和 final的,显然,接口中的域不能是空final,这些域不是接口的一部分,它们存储在该 接口的静态存储区域内。
- 接口关键字interface前可以添加public修饰符,不加默认是包访问权限,接口的方法默认都是public的。
- 因为Java接口没有任何具体实现,即没有任何与接口相关的存储,因此可以定义一个Java类来implements多个接口,达到C++中多重继承的效果。
- Java可以定义一个接口去extends另外的一个或多个接口来实现接口的扩展。
- 因为Java接口中的域自动是final和static的,所以接口就成了一种便捷的创建常量组的工具。在Java SE5之前,用这种方式来产生enum的效果。Java SE5之后,Java有了enum关键字,因此使用接口来群组常量就没意义了
十、内部类(参考原文链接:https://blog.csdn.net/u013728021/article/details/87358517)
当某个类创建一个内部类对象时,此内部类对象必定会秘密地捕获一个指向那个外围类的对象的引用
- 可以无条件地访问外围类的所有元素实现隐藏
- 可以实现多重继承
- 通过匿名内部类来优化简单的接口实现
- 内部类方法可以访问该类定义所在作用域中的数据,包括被 private 修饰的私有数据
- 内部类可以对同一包中的其他类隐藏起来
- 内部类可以解决 java 单继承的缺陷
- 当我们想要定义一个回调函数却不想写大量代码的时候我们可以选择使用匿名内部类来实现
内部类虽然和外部类写在同一个文件中, 但是编译完成后, 还是生成各自的class文件,内部类通过this访问外部类的成员
- 1 编译器自动为内部类添加一个成员变量, 这个成员变量的类型和外部类的类型相同, 这个成员变量就是指向外部类对象(this)的引用;
- 2 编译器自动为内部类的构造方法添加一个参数, 参数的类型是外部类的类型, 在构造方法内部使用这个参数为内部类中添加的成员变量赋值;
- 3 在调用内部类的构造函数初始化内部类对象时,会默认传入外部类的引用。
1、内部类访问外包类的数据

代码输出“外部类数据”//data这是在DataOuterClass定义的私有变量。这个变量在内部类中可以无条件地访问.
2、实现隐藏
内部类则可以使用 private 和 protected 来修饰,内部类实现某个接口的时候,在进行向上转型,对外部来说,就完全隐藏了接口的实现了



从这段代码里面我只知道OuterClass的getInner()方法能返回一个InnerInterface接口实例但我并不知道这个实例是这么实现的。
而且由于InnerClass是private的,所以我们如果不看代码的话根本看不到这个具体类的名字,所以说它可以很好的实现隐藏。
3、可以实现多重继承
java 是不允许使用 extends 去继承多个类的。内部类的引入可以很好的解决这个事情


4、普通内部类创建方法,对于非静态内部类,内部类的创建依赖外部类的实例对象

5、内部类的分类
6、.this 与 .new
7、闭包与回调
- 闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。通过这个定义可以看出内部类是面向对象的闭包,因为它不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥有一个指向此外围类对象的引用(.this),在此作用域内,内部类有权操作所有的成员,包括private成员。
- 回调(callback),通过回调,对象能够携带一些信息,这些信息允许它在稍后的某个时刻调用初始的对象。Java中没有指针,通过内部类提供的闭包功能可以实现回调。
java闭包主要是通过接口+内部类来实现,有两种形式:接口+内部类和接口+局部内部类
Java基础之六、Java编程思想(8-10)的更多相关文章
- 黑马程序员:Java基础总结----网络编程
黑马程序员:Java基础总结 网络编程 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 网络编程 网络通讯要素 . IP地址 . 网络中设备的标识 . 不易记忆,可用 ...
- Java基础-初识面向对象编程(Object-Oriented-Programming)
Java基础-初识面向对象编程(Object-Oriented-Programming) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Java是一门面向对象的程序设计语言.那么什 ...
- java基础-学java util类库总结
JAVA基础 Util包介绍 学Java基础的工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结构.本章介绍Java的实用工具类库java.util包.在这个包中,Java ...
- java基础(二)-----java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- Java基础技术-Java其他主题【面试】
Java基础技术-Java其他主题[面试] Java基础技术IO与队列 Java BIO.NIO.AIO Java 中 BIO.NIO.AIO 的区别是什么? 含义不同: BIO(Blocking I ...
- 黑马程序员:Java基础总结----java注解
黑马程序员:Java基础总结 java注解 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! java注解 lang包中的基本注解 @SuppressWarnings ...
- Java基础:Java的四种引用
在Java基础:java虚拟机(JVM)中,我们提到了Java的四种引用.包括:强引用,软引用,弱引用,虚引用.这篇博客将详细的讲解一下这四种引用. 1. 强引用 2. 软引用 3. 弱引用 4. 虚 ...
- Java基础-使用JAVA代码剖析MD5算法实现过程
Java基础-使用JAVA代码剖析MD5算法实现过程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Java编程思想 (1~10)
[注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第一章 对象导论 1.万物皆对象2.程序就是对象的集合3.每个对象都是由其它对象所构成 ...
- java基础知识——网络编程、IO流
IO流 字节流:处理字节数据的流对象,计算机中最小数据单元就是字节.InputStream OutputStream 字符流:字符编码问题,将字节流和编码表封装成对象就是字符流.Reader Writ ...
随机推荐
- Oracle GoldenGate Best Practices: Active-Active Configuration with DML Auto CDR
Executive Overview This document is an introduction to Oracle GoldenGate (DIPC remote agent)’s best ...
- MyBatis3——输出参数ResultType、动语态sql
输出参数ResultType 1.输出参数为简单类型(8个基本+String) 2.输出参数为对象类型 3.输出参数为实体对象类型的集合:虽然输出类型为集合,但是resultType依然写集合的元素类 ...
- 前端之css的基本使用(一),行内、内部、外部样式,语法格式、注释、选择符、属性等
一.行内.内部.外部样式 1.行内样式 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- 超越队西柚考勤系统——beta冲刺3
一.成员列表 姓名 学号 蔡玉蓝(组长) 201731024205 郑雪 201731024207 何玉姣 201731024209 王春兰 201731024211 二.SCRUM部分 (1)各成员 ...
- PowerCat DNS 隧道通信
powercat 也是一套基于 DNS 通信协议的工具.Powercat的dns的通信是基于dnscat设计的(其服务端就是dnscat).在使用dnscat时需要进行下载和编译. dnscat服务端 ...
- Linux(Centos)安装Java JDK及卸载
步骤一.下载安装包 a. 因为Java JDK区分32位和64位,所以安装之前需先判断一下我们操作系统为多少位·,命令如下: uname -a 解释:如果有x86_64就是64位的,没有就是32位 ...
- MVC ajaxfileupload 实现无刷新导入或上传功能
直接上代码吧 前台 先引用 ajaxfileupload.js <script src="~/Scripts/ajaxfileupload.js"></scrip ...
- Hexo Next 接入 google AdSense 广告
前言 个人网站 www.yanlongwang.net 已经运营近一年,每日的浏览量不断上升,现在维持在两位数,打算承接一点广告赚睡后收入,用来维持网站的日常运营,希望能覆盖网站的服务器和域名开销. ...
- python 利用selenium爬取百度文库的word文章
今天学习如何使用selenium库来爬取百度文库里面的收费的word文档 from selenium import webdriver from selenium.webdriver.common.k ...
- Hibernate(六)
================================缓存============================定义:介于应用程序和永久性数据存储源之间,可以复制数据存储源中的数据. 工作 ...