java多态可以传匿名对象吗_Java复习笔记2--匿名类和多态

匿名类

Anonymous classes enable you to make your code more concise. They enable you to declare and instantiate a class at the same time. They are like local classes except that they do not have a name. Use them if you need to use a local class only once.

private ServiceConnection connection = new ServiceConnection() {

@Override

public void onServiceDisconnected(ComponentName name) {

}

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

myBinder = (MyService.MyBinder) service;

myBinder.startDownload();

}

注意事项

**1、**使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。

2、匿名内部类中是不能定义构造函数的。

3、匿名内部类中不能存在任何的静态成员变量和静态方法。

4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。

5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

我们给匿名内部类传递参数的时候,若该形参在内部类中需要被使用,那么该形参必须要为final。也就是说:当所在的方法的形参需要被内部类里面使用时,该形参必须为final。

拷贝引用,为了避免引用值发生改变,例如被外部类的方法修改等,而导致内部类得到的值不一致,于是用final来让该引用不可改变。

**      故如果定义了一个匿名内部类,并且希望它使用一个其外部定义的参数,那么编译器会要求该参数引用是final的。**

匿名内部类初始化通过写代码块,不可以写自己的构造函数

Java 多态

面向对象编程有三个特征,即封装、继承和多态。

封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据。

继承是为了重用父类代码,同时为实现多态性作准备。那么什么是多态呢?

方法的重写、重载与动态连接构成多态性。Java之所以引入多态的概念,原因之一是它在类的继承问题上和C++不同,后者允许多继承,这确实给其带来的非常强大的功能,但是复杂的继承关系也给C++开发者带来了更大的麻烦,为了规避风险,Java只允许单继承,派生类与基类间有IS-A的关系(即“猫”is a “动物”)。这样做虽然保证了继承关系的简单明了,但是势必在功能上有很大的限制,所以,Java引入了多态性的概念以弥补这点的不足,此外,抽象类和接口也是解决单继承规定限制的重要手段。同时,多态也是面向对象编程的精髓所在。

多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

对于面向对象而言,多态分为编译时多态和运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编译之后会变成两个不同的函数,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是我们所说的多态性。

向上转型

我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类。我可以通过

Cat c = new Cat();

实例化一个Cat的对象,这个不难理解。但当我这样定义时:

Animal a = new Cat();

这代表什么意思呢?

很简单,它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,

+定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。

+所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;

+同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;

+对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。

对于多态,可以总结它为:

一、使用父类类型的引用指向子类的对象;

二、该引用只能调用父类中定义的方法和变量;

三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)

四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。

参数是父类,传入的是子类也属于向上转型

向下转型

class Fruit

{

public void myName()

{

System.out.println("我是父类  水果...");

}

}

class Apple extends Fruit

{

@Override

public void myName()

{

System.out.println("我是子类  苹果...");

}

public void myMore()

{

System.out.println("我是你的小呀小苹果~~");

}

}

public class Sys{

public static void main(String[] args) {

Fruit a=new Apple(); //向上转型

a.myName();

Apple aa=(Apple)a; //向下转型,编译和运行皆不会出错(正确的)

aa.myName();//向下转型时调用的是子类的

aa.myMore();;

Fruit f=new Fruit();

Apple aaa=(Apple)f; //-不安全的---向下转型,编译无错但会运行会出错

aaa.myName();

aaa.myMore();

}

}

a指向子类的对象,所以子类的实例aa也可以指向a啊~~

向下转型后因为都是指向子类对象,所以调用的当然全是子类的方法~~

f是父类对象,子类的实例aaa肯定不能指向父类f啊~~~

3.Java为了解决不安全的向下转型问题,引入泛型的概念

4.为了安全的类型转换,最好先用 if(A instanceof  B) 判断一下下~~

2种实现形式

继承

基于继承的实现机制主要表现在父类和继承该父类的一个或多个子类对某些方法的重写,多个子类对同一方法的重写可以表现出不同的行为。

接口

接口是通过实现接口并覆盖接口中同一方法的几不同的类体现的。

在接口的多态中,指向接口的引用必须是指定这实现了该接口的一个类的实例程序,在运行时,根据对象引用的实际类型来执行对应的方法。

继承都是单继承,只能为一组相关的类提供一致的服务接口。但是接口可以是多继承多实现,它能够利用一组相关或者不相关的接口进行组合与扩充,能够对外提供一致的服务接口。所以它相对于继承来说有更好的灵活性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java se 开发web程序_JDiy快速开发WEB之javaSE环境搭建-初级

大学的时候对web开发很感兴趣,对网页中的动画,对用户注册,对网页中表格填写等等都倍感兴趣。加之又有专业课程编程语言java,因此,对java web产生了浓厚的兴趣,再加之有北京圣思园 风中叶 大师的视频教程&am…

java apktoo_apktool.jar

apktool.jar是APKTOOL这个反编译工具必须用到的必备jar包,给大家提供最新的apktool.jar2.3.4,有需要的赶快下载吧!。相关软件软件大小版本说明下载地址apktool.jar是APKTOOL这个反编译工具必须用到的必备jar包,给大家提供最新的ap…

Java 内存 关系_JVM和Linux之间的详细内存关系

JVM和Linux之间的详细内存关系在一些具有8g物理内存的服务器上,主要运行Java服务。系统内存分配如下:Java服务的JVM堆大小设置为6g,监视过程大约需要600m,Linux本身使用大约800m。从表面上看,物理记忆应该足够&#xf…

java遍历删除原理,Java 垃圾回收机制实现原理

一、垃圾回收机制的意义Java语言中一个显著的特点就是引入了垃圾回收机制,使c程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念&…

matlab简易编程,MATLAB简单编程

本帖最后由 wanggh 于 2016-12-5 14:47 编辑用数值差分、SOR迭代法求雷诺方程和用牛顿迭代法求解轴向柱塞泵滑靴副压力场的算法,%油膜厚度场、压力场迭代 MATLAB只认弧度制,不认角度制clear all; % (60rpm1rad/s)wg1000; %1000…

php删除字段某个字段,php数如何组删除某个字段

【摘要】PHP即“超文本预处理器”,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。下面是php数如何组删除某个字段,让我们一起…

php重复点击按钮无效,完美解决UIButton按钮重复点击、多次响应的问题

最近测试老跑过来提bug,说按钮可以点好几次,然后蹦出来好几个一样的界面出来,解决了一个地方,其他地方也会冒出一样的问题来,仔细一想,还是要从根本上解决问题,于是想了几个方法:1.添…

matlab画地震复杂模型,基于MATLAB的地震正演模型实现

总 第 237 期2009 年 第 7 期计 算 机 与 数 字 工 程 37 7132  基 于 L 地 震 正 演 模 型 实 现 3贾 跃 玮 1)   杨   锐 2)(中 国 地 质 大 学 地 下 信 息 探 测 技 术 与 仪 器 教 育 部 重 点 实 验 室 1)   北 京   100083)(川 庆 钻 探 工 程 有 限 公 司 地 质 …

用matlab抽样定理验证,MATLAB抽样定理验证.docx

MATLAB抽样定理验证.docx目的通过 MATLAB 编程实现对时域抽样定理的验证,加深抽样定理的理解。同时训练应用计算机分析问题的能力。任务连续信号 ftcos8*pi*t2*sin40*pi*tcos24*pi*t,经过理想抽样后得到抽样信号 fst,通过理想低通滤波器后重构…

ios java 图片上传到服务器,iOS 图片上传服务器

最近搞图片上传,折腾了一个星期终于做出来了,网上搜出来的方法几乎都是好几年前的,试了好多都不能用,此次把代码公布出来供大家参考。注:部分代码是后台写的,此方法没用到第三方库。1.图片保存到本地同时上…

matlab判断能控和能观,实验三 利用Matlab分析能控性和能观性

实验三 利用Matlab分析能控性和能观性实验目的:熟练掌握利用Matlab中相关函数分析系统能控能观性、求取两种标准型、系统的结构分解的方法。实验内容:1、能控性与能观性分析中常用的有关Matlab函数有:Size(a,b) 获取矩阵的行和列的数目Ctrb(a…

JAVA table word,实战 | Java读取Word,包含表格!

本文转载自微信公众号「JAVA日知录」,作者单一色调。转载本文请联系JAVA日知录公众号。不能每天都发鸡汤呀,今天分享一篇开发实战。业务需求我们有这样一个需求,需要抽取出WORD文档中的内容,然后组装成特定的json格式发送给第三方…

基于matlab的频域辨识,基于Lab VIEW的控制系统频域分析研究

在系统设计和构成之前,必须对系统进行分析、综合和预测研究,从而得出系统的性能评价指标,如控制精度、响应速度和系统稳定性等。一般来说,我们可以从两个方面来对系统的性能进行分析,一是时域,二是频域,它们是从不同的侧面,以被研究系统的传递函数为依据,来研究系统的特性,关于…

php培训出生做微电影网站的,微电影分享网站织梦整站源码

使用说明:1、模板在目录下【themes】-【default】文件夹中2、logo等图片在【statics】-【images】中安装教程:1、传到空间,由于有很多人反应安装后首页样式都乱的,(强烈要求安装到根目录,如:127.0.0.1 / ww…

mysql分列查询,Mysql导出问题,乱码问题,为分列问题解决!!!

前言:本文可以先阅读完再跟着做。Mysql查询出的数据导出为csv最近遇到同学的一个需求,要求差寻一些数据然后导出给他,因为之前也有做过类似的事情,觉得可以一下就搞定,但是居然出现乱码又出现没有分列的情况&#xff0…

微信你scope 参数错误 php,微信开发: scope参数错误或没有scope权限解决方法

scope为snsapi_userinfo 未关注者点击授权提示 scope参数错误或没有scope权限解决方法出现这种错误网上查出现有的原因是:订阅号没有相关的权限账号没有认证,没有相关的权限那么这里遇到问题两种都不是。开发账号是 服务号,而且也是认证号。解决方法:错…

oracle什么时候用in,Oracle Study之---Oracle IN和NOT IN的使用

Oracle Study之---Oracle IN和NOT IN的使用NOT IN 与 IN 的区别:------------------------------------------------------------------------------------------------------not In 相当于<> all,如果 Not In 后面跟的是子查询的话&#xff0c;子查询中只要包含一个 nu…

oracle中having作用,oracle中having与where的区别

1、where 不能放在group by 的后面2、HAVING 是跟GROUP BY 连在一起用的&#xff0c;放在GROUP BY 后面&#xff0c;此时的作用相当于WHERE3.WHERE 后面的条件中不能有聚集函数&#xff0c;比如SUM(),AVG()等&#xff0c;而HAVING 可以where 条件group by 某个或某几个字段gro…

linux系统支持u盘格式,linux下U盘格式化

第一步&#xff0c;手动将挂在的U盘分区卸载&#xff1a;umount /dev/sdbumount /dev/sdb1第二步&#xff0c;准备格式化U盘&#xff0c;这里要提一句&#xff0c;U盘要被格式化成为fat格式&#xff0c;而用到的命令是mkfs.vfat这个命令要注意&#xff0c;根据你要格式化分区格…

Linux怎么查看保存的密码,在Linux中查看已保存的WiFi密码

在安装流行操作系统时&#xff0c;如 Windows 10、Ubuntu、macOS 等&#xff0c;都会要求用户提前输入 WiFi 密码。特别是 Ubuntu 系统&#xff0c;在配置安装向导时就可以连接 WiFi&#xff0c;以方便在系统安装过程就从网络获取最新更新&#xff0c;并在安装完成后就为用户提…