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条评论来说两句吧...