JAVA中类的继承、覆写特性
继承
继承性严格来讲就是指扩充一个类已有的功能。
语法:class 子类 extends 父类{}
功能:继承父类的属性、方法同时也可以扩充父类没有的属性、方法。
类的继承的限制:
一、Java中的类不允许多重继承,允许多层继承
错误的继承:
class A{} class B{} class C extends A,B{} //一个子类继承两个父类
多层继承:
class A{} class B extends A{} class C extends B{}
二、子类在继承父类时,对父类的私有操作是隐式继承,非私有操作是显式继承
如下程序所示,msg属性在A类中是私有声明,只能利用setter或getter方法进行私有属性访问。
class A{ private String msg; public void setMsg(String msg) { this.msg = msg; } public String getMsg() { return this.msg; } } class B extends A{ } public class demo { public static void main(String args[]) { B b = new B(); b.setMsg("Nice to see you!"); System.out.println(b.getMsg()); } }
三、父类对象先实例化,子类对象后实例化
当父类提供无参构造方法时,可以不编写“super()”。但是如果父类不提供无参构造方法时,必须明确使用super()调用父类指定参数的构造方法。
class A{ public A() { System.out.println("父类无参构造被调用"); } public A(String title) { System.out.println("父类有参构造被调用 title="+title); } } class B extends A{ public B(String title) { //这一句可以不写也可以写,因为父类构造器中已有无参构造。 //但是若父类构造器没有无参构造则必须写super() super(); // super(title); System.out.println("Nice to see you!"); } } public class Temp { public static void main(String args[]) { new B("hahahaha"); } } 输出结果: 父类无参构造被调用 Nice to see you!
package com.hdu.java; class A{ public A() { System.out.println("父类无参构造被调用"); } public A(String title) { System.out.println("父类有参构造被调用 title="+title); } } class B extends A{ public B(String title) { // super(); super(title); System.out.println("Nice to see you!"); } } public class Temp { public static void main(String args[]) { new B("hahahaha"); } } 输出结果: 父类有参构造被调用 title=hahahaha Nice to see you!
覆写
定义:子类定义了和父类的方法名称、返回值类型、参数类型及个数完全相同的方法
结果:实例化子类对象时,将不再执行父类的方法,而是直接调用已经被子类覆写过的方法。
优势:当有多个字类时,父类的方法就会根据子类的覆写,有不同的实现效果。
权限问题:被子类覆写的方法不能有比父类更严格的访问控制权限。权限从宽到严的顺序是:public>default(默认,什么都不写)>private。
附:this 和 super的区别
区别 | this | super |
功能 | 调用本类构造、本类方法、本类属性 | 子类调用父类构造、方法、属性 |
形式 | 先查找本类中是否存在有指定的调用结构,如果有则 直接调用,如果没有则调用父类定义 | 不查找子类,直接调用父类操作 |
特殊 | 表示本类的当前对象 | —— |

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
JavaScript 性能优化技巧分享
JavaScript 作为当前最为常见的直译式脚本语言,已经广泛应用于 Web 应用开发中。为了提高Web应用的性能,从 JavaScript 的性能优化方向入手,会是一个很好的选择。 本文从加载、上下文、解析、编译、执行和捆绑等多个方面来讲解 JavaScript 的性能优化技巧,以便让更多的前端开发人员掌握这方面知识。 什么是高性能的 JavaScript 代码? 尽管目前没有高性能代码的绝对定义,但却存在一个以用户为中心的性能模型,可以用作参考:RAIL模型。 响应 如果你的应用程序能在100毫秒内响应用户的操作,那么用户会认为该响应为即时的。这适用于可点击的元素,不适用于滚动或拖动操作。 动画 在60Hz的显示器上,我们希望动画和滚动时每秒有60帧,这种情况下每帧大约为16ms。在这16ms的时间内,实际上只有8-10ms来完成所有工作,其余时间则由浏览器的内部和其它差异占据。 空闲工作 如果你有一个耗时很久,需要持续运行的任务时,请确保把它分成很小的块,以便允许主线程对用户的输入操作做出反应。不应该出现一个任务延迟超过50ms的用户输入。 加载 页面加载应该在1000毫秒内完...
- 下一篇
伪共享和缓存行填充,Java并发编程还能这么优化!
前言 关于伪共享的文章已经很多了,对于多线程编程来说,特别是多线程处理列表和数组的时候,要非常注意伪共享的问题。否则不仅无法发挥多线程的优势,还可能比单线程性能还差。随着JAVA版本的更新,再各个版本上减少伪共享的做法都有区别,一不小心代码可能就失效了,要注意进行测试。这篇文章总结一下。 什么是伪共享关于伪共享讲解最清楚的是这篇文章:http://developer.51cto.com/art/201306/398232.htm,我这里就直接摘抄其对伪共享的解释: 缓存系统中是以缓存行(cache line)为单位存储的。缓存行是2的整数幂个连续字节,一般为32-256个字节。最常见的缓存行大小是64个字节。当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。缓存行上的写竞争是运行在SMP系统中并行线程实现可伸缩性最重要的限制因素。有人将伪共享描述成无声的性能杀手,因为从代码中很难看清楚是否会出现伪共享。 为了让可伸缩性与线程数呈线性关系,就必须确保不会有两个线程往同一个变量或缓存行中写。两个线程写同一个变量可以在代码中发现。为了确定互相...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题