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 ...
随机推荐
- Linux内存管理解析(一) : 分段与分页机制
背景 : 在此文章里会从分页分段机制去解析Linux内存管理系统如何工作的,由于Linux内存管理过于复杂而本人能力有限.会尽量将自己总结归纳的部分写清晰. 从实模式到保护模式的寻址方式的不同 : 1 ...
- MySQL 相关规约(v1.0) (转)
0)前言 a. 基本规约 [强制]表存储引擎必须使用InnoDB(针对主库一般是强制要求的) [强制]表字符集默认使用utf8,必要时候使用utf8mb4(个人踩坑:emoji表情存储问题)•说明:• ...
- P1553 数字反转(升级版)
题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调:小数反转是把整数部分的数反转, ...
- 双指针,BFS和图论(二)
(一)BFS 1.地牢大师 你现在被困在一个三维地牢中,需要找到最快脱离的出路! 地牢由若干个单位立方体组成,其中部分不含岩石障碍可以直接通过,部分包含岩石障碍无法通过. 向北,向南,向东,向西,向上 ...
- 使用requests模块的网络编程
python操作网络,也就是打开一个网站,或者请求一个http接口,本篇是介绍使用request模块的使用方式. 在使用requests模块之前需要先安装,在cmd中输入:pip install re ...
- livego+obs+flv.js 搭建视频直播
一.流程 主播通过 obs软件通过直播 ->推流到->直播服务器 客户通过浏览器 访问站点->flv.js拉取直播服务器视频流并播放 二.环境 centos7 直播服务器 https ...
- redis--->事务和锁
redis 的事务.锁.流水线 Redis与 mysql事务的对比 开启 mysql:start transaction redis:multi 语句:mysql:普通sql redis:普通命令 成 ...
- 5.场景3:高可用性使用分布式虚拟路由(DVR)
这个场景描述了使用ML2插件和Open vSwitch的OpenStack网络服务的高可用性分布式虚拟路由(DVR)实现.示例配置创建了一个Flat外部网络和一个VXLAN项目(租户)网络.然而,这种 ...
- python函数2(返回值、传递列表...)
python函数2(返回值.传递列表...) 1.返回值 1.1.返回简单的值 #返回简单值 def get_formatted_name(first_name,last_name): "& ...
- HDU_4403
http://acm.hdu.edu.cn/showproblem.php?pid=4403 数值不大,暴力枚举,枚举每一种划分,然后枚举每一种等号位置. #include<iostream&g ...