java中重载、覆盖和隐藏三者的区别分析
重载:方法名相同,但参数不同的多个同名函数
注意:1.参数不同的意思是参数类型、参数个数、参数顺序至少有一个不同
2.返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg:void a ()和int a() ,如果调用a(),出现歧义)
3.main方法也是可以被重载的
覆盖:子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同
两同两小一大
注意:子类实例方法不能覆盖父类的静态方法;子类的静态方法也不能覆盖父类的实例方法(编译时报错),总结为方法不能交叉覆盖
隐藏:父类和子类拥有相同名字的属性或者方法时,父类的同名的属性或者方法形式上不见了,实际是还是存在的
注意:当发生隐藏的时候,声明类型是什么类,就调用对应类的属性或者方法,而不会发生动态绑定
方法隐藏只有一种形式,就是父类和子类存在相同的静态方法
属性只能被隐藏,不能被覆盖
子类实例变量/静态变量可以隐藏父类的实例/静态变量,总结为变量可以交叉隐藏
隐藏和覆盖的区别:
被隐藏的属性,在子类被强制转换成父类后,访问的是父类中的属性
被覆盖的方法,在子类被强制转换成父类后,调用的还是子类自身的方法
因为覆盖是动态绑定,是受RTTI(run time type identification,运行时类型检查)约束的,隐藏不受RTTI约束,总结为RTTI只针对覆盖,不针对隐藏
特殊情况:
1.final修饰的属性可以被隐藏,但是不能被赋值,即不能用=来赋值,网上说final属性不能被修改,这个说法不准确,因为对于引用类型的变量用final修饰后,它只是不能被指向其他对象,但是可以改它自身的值,可以用ArrayList测试,final属性可以在运行的时候进行初始化,但是不能不出现初始化语句
2.final修饰的方法不能被覆盖,可以被重载
3.final修饰的类不能被继承
4.private 方法隐式添加了final
相关推荐
-
Java方法的覆盖与隐藏的区别分析
关于隐藏和覆盖的区别,要提到RTTI(run-time type identification)(运行期类型检查),也就是运行期的多态,当一个父类引用指向子类对象的时候,请看下面我编写的一段代码: 复制代码 代码如下: public class RunTime { public static void main(String[] args) { Animal a = new Cat(); System.out.println(a.A); System.o
-
浅谈静态变量、成员变量、局部变量三者的区别
静态变量和成员变量的区别: A:所属不同 静态变量:属于类,类变量 成员变量:属于对象,对象变量,实例变量 B:内存位置不同 静态变量:方法区的静态区 成员变量:堆内存 C:生命周期不同 静态变量:静态变量是随着类的加载而加载,随着类的消失而消失 成员变量:成员变量是随着对象的创建而存在,随着对象的消失而消失 D:调用不同 静态变量:可以通过对象名调用,也可以通过类名调用 成员变量:只能通过对象名调用 成员变量和局部变量的区别: A:在类中的位置不同 成员变量:在类中方法
-
Java成员变量的隐藏(实例讲解)
一.如果子类与父类中有一个相同名称的成员变量,那么子类的成员变量会不会覆盖父类的成员变量?我们看下在的例子: public class A { public int x=10; } public class B extends A { public int x=20; } public class C { public static void main(String[] args) { A a=new B(); System.out.println(a.x); //1 B b=new B();
-
java中重载、覆盖和隐藏三者的区别分析
重载:方法名相同,但参数不同的多个同名函数 注意:1.参数不同的意思是参数类型.参数个数.参数顺序至少有一个不同 2.返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg:void a ()和int a() ,如果调用a(),出现歧义) 3.main方法也是可以被重载的 覆盖:子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同 两同两小一大 注意:子类实例方法不能覆盖父类的
-
Java中重载与重写的对比与区别
Java中重载与重写的区别 首先我们来讲讲:重载(Overloading) (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现. (2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义. 调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性. (3) 重载的时候,方法名要一样,但是参数类型和个数不一样
-
实例分析java中重载与重写的区别
本文以实例详细分析了Java中重载与重写的区别,感兴趣的朋友可以参考一下. 一.重载(Overloading): (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现. (2)Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义. 调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性. (3) 重载的时候,方
-
Java中==与equals()及hashcode()三者之间的关系详解
目录 1.= = 2.equals() 3.重写equals() 4.equals()比较流程 5.hashcode() 1.= = =为赋值运算符,==为比较运算符,仅比较对象的内存地址,无法比较真正意义上的相等! JDK里的equals方法就是通过==来实现的比较对象的内存地址 以Integer为例 Integer a = 127; Integer b = 127; System.out.println(a == b);//true Integer c = 128; Integer d =
-
详谈Java中的Object、T(泛型)、?区别
因为最近重新看了泛型,又看了些反射,导致我对Object.T(以下代指泛型).?产生了疑惑. 我们先来试着理解一下Object类,学习Java的应该都知道Object是所有类的父类,注意:那么这就意味着它的范围非常广!首先记住这点,如果你的参数类型时Object,那么的参数类型将非常广! <Thinking in Java>中说很多原因促成了泛型的出现,最引人注目的一个原因就是为了创造容器类.这个要怎么来理解呢?我的理解是,可以抛开这个为了创造容器类这个,而是回到泛型的目的是限定某种类型上来.
-
java 中newInstance()方法和new关键字的区别
java 中newInstance()方法和new关键字的区别 * 它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类. * 那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩.可扩展和可重用等软件设计思想. * 我们使用关键字new创建一个类的时候,这个类可以没有被加载.但是使用newInstance()方法的时候, * 就必须保证:1.这个类已经加载:2.这个类已经连接了. * newInstance()实际上是把new这个方式分解为两步,即首先调用Class
-
Java中List Set和Map之间的区别_动力节点Java学院整理
Java集合的主要分为三种类型: • Set(集) • List(列表) • Map(映射) 要深入理解集合首先要了解下我们熟悉的数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),而JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. 世间上本来没有集合,(只有数组参考C语言)但有人想要,所以有了集合 有人想有可以自动扩展的数组,所以有了List 有的
-
浅谈Java中的四种引用方式的区别
强引用.软引用.弱引用.虚引用的概念 强引用(StrongReference) 强引用就是指在程序代码之中普遍存在的,比如下面这段代码中的object和str都是强引用: Object object = new Object(); String str = "hello"; 只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象. 比如下面这段代码: public class Main { publi
-
详解Java中Checked Exception与Runtime Exception 的区别
详解Java中Checked Exception与Runtime Exception 的区别 Java里有个很重要的特色是Exception ,也就是说允许程序产生例外状况.而在学Java 的时候,我们也只知道Exception 的写法,却未必真能了解不同种类的Exception 的区别. 首先,您应该知道的是Java 提供了两种Exception 的模式,一种是执行的时候所产生的Exception (Runtime Exception),另外一种则是受控制的Exception (Checked
-
Java中的notyfy()和notifyAll()的本质区别
wait()方法表示,放弃当前对资源的占有权,等啊等啊,一直等到有人通知我,我才会运行后面的代码. notify()方法表示,当前的线程已经放弃对资源的占有, 通知等待的线程来获得对资源的占有权,但是只有一个线程能够从wait状态中恢复, 然后继续运行wait()后面的语句: notifyAll()方法表示,当前的线程已经放弃对资源的占有, 通知所有的等待线程从wait()方法后的语句开始运行. 读出什么区别没有? 上例子,先是一个nofiyAll()的例子: Java代码 package co
随机推荐
- Go程序性能优化及pprof使用方法详解
- Angularjs 动态添加指令并绑定事件的方法
- java中Cookie被禁用后Session追踪问题
- 如何防范利用刷新来“作弊”的计数器?
- Java数据结构之队列(动力节点Java学院整理)
- ASP.NET内置对象之Application对象
- 解析php中如何直接执行SHELL
- python通过BF算法实现关键词匹配的方法
- javascript函数中执行c#函数的方法
- MySQL存储IP地址的方法
- python实现保存网页到本地示例
- Spring3.0配置多个事务管理器的方法
- 微信小程序 时间格式化(util.formatTime(new Date))详解
- 我需要目标-有眼光的人和没眼光的人
- SQL Server误区30日谈 第26天 SQL Server中存在真正的“事务嵌套”
- Js 时间函数getYear()的使用问题探讨
- nginx缓存不起作用问题解决方法
- C#中Arraylist的sort函数用法实例分析
- Intent传递对象之Serializable和Parcelable的区别
- iOS利用Label实现的简单高性能标签TagView