- 浏览: 425875 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
pulsar_lxl:
请注明转载原文:http://hllvm.group.itey ...
JVM研究 -
goycejin:
感谢楼主,我也要及笔记了,这记性
Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:2.8.1:jar -
lianglong2000:
我理解是 java -server 类名 是运行的jdk中的j ...
jdk,jre你真的懂吗? -
yanqlv:
有个问题,既然windows目录(Windows/system ...
jdk,jre你真的懂吗? -
yanqlv:
系统化的描述也挺重要,架构模式>设计模式,架构模式≈设计 ...
MVC是设计模式么?是框架么?
什么是方法覆盖
如果在子类中定义的一个方法,其名称、返回类型及参数签名正好与父类中某个方法的名称、返回类型及参数签名相匹配,那么可以说,子类的方法覆盖了父类的方法。
覆盖方法必须满足的十大约束
一:子类方法的名称、参数签名和返回类型必须与父类方法的名称、参数签名和返回类型一致
二:子类方法不能缩小父类方法的访问权限
三:子类方法不能抛出比父类方法更多的异常,子类方法抛出的异常必须和父类方法抛出的异常相同,或者子类方法抛出的异常类是父类方法抛出的异常类的子类
四:方法覆盖只存在于子类和父类(包括直接父类和间接父类)之间。在同一个类中方法只能被重载,不能被覆盖。
五:父类的静态方法不能被子类覆盖为非静态方法。
(子类的非静态方法不能覆盖父类的静态方法)
六:子类可以定义与父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法。
子类隐藏父类的静态方法和子类覆盖父类的实例方法,这两者的区别在于:运行时,Java虚拟机把静态方法和所属的类绑定,而把实例方法和所属的实例绑定。
看个SCJP题库的经典例子吧,并说说为什么是这样的结果
代码:
class Base {
void method() {
System.out.println("method of Base");
}
static void staticMethod() {
System.out.println("static method of Base");
}
}
class Sub extends Base {
void method() {
System.out.println("method of Sub");
}
static void staticMethod() {
System.out.println("static method of Sub");
}
}
public class Test2 {
public static void main(String[] args) {
Base sub1 = new Sub();
sub1.method();
sub1.staticMethod();
Sub sub2 = new Sub();
sub2.method();
sub2.staticMethod();
}
}
答案:
method of Sub
static method of Base
method of Sub
static method of Sub
七:父类的非静态方法不能被子类覆盖为静态方法。
(父类的非静态方法不能被子类的静态方法所覆盖)
八:父类的私有方法不能被子类覆盖。
同第六点一样,再来个经典的SCJP题目
class Base {
private String showMe() {
return "Base";
}
public void print(){
System.out.println(showMe());
showMe();
}
}
public class Sub extends Base {
public String showMe(){
return "Sub";
}
}
public static void main(String args[]){
Sub sub=new Sub();
sub.print();
}
}
九:父类的抽象方法可以被子类通过两种途径覆盖:一是子类实现父类的抽象方法;二是子类重新声明父类的抽象方法。
十:父类的非抽象方法可以被覆盖为抽象方法。
另外,关于构造函数:
子类的实例化过程:子类中所有的构造函数会去访问父类中的空参数构造函数,那是因为每一个子类构造函数中的第一行都有一句隐式super语句。
构造函数不能继承。子类的构造函数可以通过super关键字显式调用父类中的构造函数。如果子类中的构造函数没有显式调用父类中的构造函数,编译器就会自动在子类的构造函数中调用父类中参数为空的构造函数。于是,当父类中没有参数为空的构造函数,而子类中又没有显示调用父类的其他构造函数,编译时就会报错。这一点需要特别注意。当父类中没有定义任何构造函数时,编译器就会为它指定一个参数为空的默认的构造函数;如果父类中定义了构造函数,那么编译器就不会为它指定一个参数为空的默认构造函数了。因此,如果某个类有可能成为其他类的父类,为了避免发生不必要的编译错误,最好为它编写一个参数为空的构造函数。
eg1.
父类Sup中没有定义构造函数,编译程序将为它指定一个参数为空的默认构造函数。子类Sub中也没有定义构造函数,编译程序也会为它指定一个参数为空的默认的构造函数,并且会在这个默认的构造函数中调用父类的参数为空的构造函数。
public class Sub extends Sup{
//子类中没有定义构造函数
public static void main(String args[]){
Sub sub=new Sub();
}
}
class Sup{
//父类中没有定义构造函数
}
eg2.
父类Sup中没有定义构造函数,编译程序将为它指定一个参数为空的默认构造函数。子类定义了一个带整型参数的构造函数,在这个构造函数中子类没有显式调用父类的构造函数,所以编译器为在它里面调用父类中参数为空的构造函数。
public class Sub extends Sup{
//子类中定义类一个带整型变量参数的构造函数
public Sub(int i){
//
}
public static void main(String args[]){
Sub sub=new Sub(1);
}
}
class Sup{
//父类中没有定义构造函数
}
eg3.
父类中定义了一个带整型参数的构造函数,因此编译器不再为它指定参数为空的默认的构造函数。子类中也定义了一个带整型参数的构造函数。编译时,编译器将试图在子类的构造函数中调用父类的参数为空的构造函数,但是父类中没有定义参数为空的构造函数,所以编译程序将会报错。排错的方法时在子类的构造函数中显示调用父类的构造函数,或者在父类中添加一个带空参数的构造函数。
public class Sub extends Sup{
//子类中定义类一个带整型变量参数的构造函数
public Sub(int i){
//
}
public static void main(String args[]){
Sub sub=new Sub(1);
}
}
class Sup{
//父类中定义了一个带整型参数的构造函数
public Sup(int i){
//
}
}
排错方法1:
public class Sub extends Sup{
//子类中定义类一个带整型变量参数的构造函数
public Sub(int i){
super(i);//调用父类中的构造函数
}
public static void main(String args[]){
Sub sub=new Sub(1);
}
}
class Sup{
//父类中定义了一个带整型参数的构造函数
public Sup(int i){
//
}
}
排错方法2:
public class Sub extends Sup{
//子类中定义类一个带整型变量参数的构造函数
public Sub(int i){
//
}
public static void main(String args[]){
Sub sub=new Sub(1);
}
}
class Sup{
//父类中定义了一个带整型参数的构造函数
public Sup(int i){
//
}
//定义一个带空参数的构造函数
public Sup(){
//
}
}
如果在子类中定义的一个方法,其名称、返回类型及参数签名正好与父类中某个方法的名称、返回类型及参数签名相匹配,那么可以说,子类的方法覆盖了父类的方法。
覆盖方法必须满足的十大约束
一:子类方法的名称、参数签名和返回类型必须与父类方法的名称、参数签名和返回类型一致
二:子类方法不能缩小父类方法的访问权限
三:子类方法不能抛出比父类方法更多的异常,子类方法抛出的异常必须和父类方法抛出的异常相同,或者子类方法抛出的异常类是父类方法抛出的异常类的子类
四:方法覆盖只存在于子类和父类(包括直接父类和间接父类)之间。在同一个类中方法只能被重载,不能被覆盖。
五:父类的静态方法不能被子类覆盖为非静态方法。
(子类的非静态方法不能覆盖父类的静态方法)
六:子类可以定义与父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法。
子类隐藏父类的静态方法和子类覆盖父类的实例方法,这两者的区别在于:运行时,Java虚拟机把静态方法和所属的类绑定,而把实例方法和所属的实例绑定。
看个SCJP题库的经典例子吧,并说说为什么是这样的结果
代码:
class Base {
void method() {
System.out.println("method of Base");
}
static void staticMethod() {
System.out.println("static method of Base");
}
}
class Sub extends Base {
void method() {
System.out.println("method of Sub");
}
static void staticMethod() {
System.out.println("static method of Sub");
}
}
public class Test2 {
public static void main(String[] args) {
Base sub1 = new Sub();
sub1.method();
sub1.staticMethod();
Sub sub2 = new Sub();
sub2.method();
sub2.staticMethod();
}
}
答案:
method of Sub
static method of Base
method of Sub
static method of Sub
七:父类的非静态方法不能被子类覆盖为静态方法。
(父类的非静态方法不能被子类的静态方法所覆盖)
八:父类的私有方法不能被子类覆盖。
同第六点一样,再来个经典的SCJP题目
class Base {
private String showMe() {
return "Base";
}
public void print(){
System.out.println(showMe());
showMe();
}
}
public class Sub extends Base {
public String showMe(){
return "Sub";
}
}
public static void main(String args[]){
Sub sub=new Sub();
sub.print();
}
}
九:父类的抽象方法可以被子类通过两种途径覆盖:一是子类实现父类的抽象方法;二是子类重新声明父类的抽象方法。
十:父类的非抽象方法可以被覆盖为抽象方法。
另外,关于构造函数:
子类的实例化过程:子类中所有的构造函数会去访问父类中的空参数构造函数,那是因为每一个子类构造函数中的第一行都有一句隐式super语句。
构造函数不能继承。子类的构造函数可以通过super关键字显式调用父类中的构造函数。如果子类中的构造函数没有显式调用父类中的构造函数,编译器就会自动在子类的构造函数中调用父类中参数为空的构造函数。于是,当父类中没有参数为空的构造函数,而子类中又没有显示调用父类的其他构造函数,编译时就会报错。这一点需要特别注意。当父类中没有定义任何构造函数时,编译器就会为它指定一个参数为空的默认的构造函数;如果父类中定义了构造函数,那么编译器就不会为它指定一个参数为空的默认构造函数了。因此,如果某个类有可能成为其他类的父类,为了避免发生不必要的编译错误,最好为它编写一个参数为空的构造函数。
eg1.
父类Sup中没有定义构造函数,编译程序将为它指定一个参数为空的默认构造函数。子类Sub中也没有定义构造函数,编译程序也会为它指定一个参数为空的默认的构造函数,并且会在这个默认的构造函数中调用父类的参数为空的构造函数。
public class Sub extends Sup{
//子类中没有定义构造函数
public static void main(String args[]){
Sub sub=new Sub();
}
}
class Sup{
//父类中没有定义构造函数
}
eg2.
父类Sup中没有定义构造函数,编译程序将为它指定一个参数为空的默认构造函数。子类定义了一个带整型参数的构造函数,在这个构造函数中子类没有显式调用父类的构造函数,所以编译器为在它里面调用父类中参数为空的构造函数。
public class Sub extends Sup{
//子类中定义类一个带整型变量参数的构造函数
public Sub(int i){
//
}
public static void main(String args[]){
Sub sub=new Sub(1);
}
}
class Sup{
//父类中没有定义构造函数
}
eg3.
父类中定义了一个带整型参数的构造函数,因此编译器不再为它指定参数为空的默认的构造函数。子类中也定义了一个带整型参数的构造函数。编译时,编译器将试图在子类的构造函数中调用父类的参数为空的构造函数,但是父类中没有定义参数为空的构造函数,所以编译程序将会报错。排错的方法时在子类的构造函数中显示调用父类的构造函数,或者在父类中添加一个带空参数的构造函数。
public class Sub extends Sup{
//子类中定义类一个带整型变量参数的构造函数
public Sub(int i){
//
}
public static void main(String args[]){
Sub sub=new Sub(1);
}
}
class Sup{
//父类中定义了一个带整型参数的构造函数
public Sup(int i){
//
}
}
排错方法1:
public class Sub extends Sup{
//子类中定义类一个带整型变量参数的构造函数
public Sub(int i){
super(i);//调用父类中的构造函数
}
public static void main(String args[]){
Sub sub=new Sub(1);
}
}
class Sup{
//父类中定义了一个带整型参数的构造函数
public Sup(int i){
//
}
}
排错方法2:
public class Sub extends Sup{
//子类中定义类一个带整型变量参数的构造函数
public Sub(int i){
//
}
public static void main(String args[]){
Sub sub=new Sub(1);
}
}
class Sup{
//父类中定义了一个带整型参数的构造函数
public Sup(int i){
//
}
//定义一个带空参数的构造函数
public Sup(){
//
}
}
发表评论
-
Java线程池使用说明
2015-05-12 23:34 1217一简介 线程的使用在java中占有极其重要的地位 ... -
Long == 操作符 的陷阱
2015-02-25 10:38 830当两个对象进行比较的时候,我们应该使用equals方法,但是 ... -
java中只有值传递,没有引用传递
2013-08-24 14:29 1422一、首先来明确一下"值传递"和&quo ... -
java vs javaw vs javaws
2013-08-12 22:54 1424reference:http://javapapers.co ... -
java类的初始化顺序
2013-07-17 23:14 763(1)加载父类(以下序号相同,表明初始化是按代码从上到下的顺序 ... -
java泛型
2013-07-04 11:43 1051泛型是Java SE 1.5的新特性,泛型的本质是参数化类 ... -
JVM分代垃圾回收详述
2013-07-03 20:15 873虚拟机中的共划分为三 ... -
JSP 9 大内置对象详解
2013-06-24 23:15 1093内置对象特点:1. 由JSP规范提供,不用编写者实例化2. ... -
什么是J2EE
2013-05-20 19:36 1255J2EE英文全称Java 2 Platform Enterpr ... -
transient Volatile ThreadLocal
2013-04-29 16:05 1229Java的serialization提供了 ... -
java 过滤器 Filter
2012-10-11 14:43 1444Servlet 过滤器是可插入 ... -
java xml解析
2012-08-04 17:11 1690随着XML越来越广泛地被 ... -
Tomcat Web项目中文乱码问题解决方案
2012-07-30 16:58 2828Tomcat常见乱码解决方案:(建议按顺序来看,逐个排除) 1 ... -
list的remove问题
2012-07-17 12:45 17421、增强的for循环里面不 ... -
继承中的构造方法及覆盖与隐藏
2012-06-06 22:27 2164继承中的构造方法 一、 ... -
Spring之方法注入(lookup method)
2012-05-29 10:51 3624Spring使用CGLIB的动态字节码增强功能,所以,必须要加 ... -
java虚拟机内存原型
2012-05-14 17:21 1038寄存器:我们在程序中无法控制 栈:存放基本类型的数据和对象的引 ... -
jdk,jre你真的懂吗?
2012-05-07 11:01 24089关于jdk和jre 大家肯定 ... -
java注解
2012-04-24 16:56 1469Java注解 一、什么是java注解 注 ... -
java
2012-03-16 19:50 8580. 构造方法不能被继承! 1. ...
相关推荐
第7章 Java中的方法——给汽车丰富多彩的功能 154 教学视频:2小时55分钟 7.1 方法:让汽车动开动 154 7.1.1 引出问题:开动汽车 154 7.1.2 那么,方法到底是什么呢? 155 7.1.3 方法调用过程初探 156 7.2 ...
第7章 Java中的方法——给汽车丰富多彩的功能 154 教学视频:2小时55分钟 7.1 方法:让汽车动开动 154 7.1.1 引出问题:开动汽车 154 7.1.2 那么,方法到底是什么呢? 155 7.1.3 方法调用过程初探 156 7.2 ...
方法和变量在继承时的覆盖和隐藏;排序类; 3数字 数字类;格式化数字;转换数字进制;生成随机数; 4数组和集合 使用Arrays类;动态调整数组长度;java为数据结构中的列表定义了一个接口类java.util.list同时提供了...
多态性 (重载overload,方法名相同、参数的个数不同、参数的类型不同、返回的类型不同和覆盖override) ;多态性就是“一种接口,多种方法”,可以为一组相关的动作设计一个通用的接口,其实类的函数的重载就是一种...
这些问题通常覆盖了Java语言的基本概念、特性、语法以及一些常见的面向对象编程原则。以下是一些常见的Java八股文问题及其答案: 1. **Java的特点是什么?** Java是一种面向对象的编程语言,具有跨平台、简单、...
6 方法和变量在继承时的覆盖与隐藏 2. 7 排序类 2. 8 Singleton单例模式 2. 9 Factory工厂模式 2. 10 Adapter适配器模式 第3章 数字 3. 1 数字与数字封装类 3. 2 格式化数字 3. 3 ...
7.3.1. 方法的覆盖(overridding) 7-18 7.3.2. 多态的分类 7-18 7.3.3. 运行时多态的三原则 7-19 7.3.4. 关系运算符:instanceof 7-20 7.4. 静态变量,方法和类 7-20 7.5. Singleton模式 7-22 7.6. final关键字 7-...
7.3.1. 方法的覆盖(overridding) 7.3.2. 多态的分类 7.3.3. 运行时多态的三原则 7.3.4. 关系运算符:instanceof 7.4. 静态变量,方法和类 7.5. Singleton模式 7.6. final关键字 7.6.1. final变量不能被...
Override [java] 方法的覆盖(覆盖父类的方法) [,әuvә'raid] polymiorphism[java] 多态 (polymorphism 多形性[,pɒli'mɒ:fizm]) allowing a single object to be seen as having many types. principle n.原则,...
重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊...
总之原则是,对于开销很大的对象,只有在使用它时才创建,这个原则可以为我们节省很多宝贵的Java内存. 所以,有些人认为Java耗费资源内存,我以为这和程序编制思路也有一定的关系. 如何使用Proxy? 以Jive论坛系统为例,...
比如我有十万消费者的信息数据,比如包括性别,年龄,收入,消费等,通过聚类的方法事可以把这些数据分成不同的群,理论上每群用户内都是相似性较高的,就可以覆盖分群用户制定不同的策略 java大数据-教程全文共5页...
课程内容不仅包含了Java EE框架的深入探讨,还广泛覆盖了当前技术市场中极为重要的微服务架构知识,以及如何在实际工作中进行性能优化和确保软件安全性的最佳实践。 通过本课程的学习,学员将能够获得关于高级架构...
一个基于Web的项目,它使用Java Servlet Pages和Java使用MVC体系结构方法以及MySQL作为后端,为邮轮活动协调系统开发,以实现自动化测试的概念和原则。 乘客可以报名参加活动。 事件协调员是负责协调特定事件的人员-...
覆盖或者实现父类的方法数输入参数可以被放大 覆盖或者实现父类的方法时返回值类型可以被缩小 依赖倒置:面向接口编程(IOP——Interface-Oriented Programming),广泛引用于测试驱动开发(TDD),使用Mock数据开发...
需要用文档和正确的Java语言来解决问题,实现的算法,设计模式,测试方法的反复练习。 要多用文字和图形记录每个问题的解题过程。现在doc中的内容为0,要赶快补上。 练习练习再练习,持续进行日复一日,月复一月。 ...
功能测试:用于测试应用系统的功能需求的黑盒测试方法。这类测试应由测试员做,这并不意味着程序员在发布前不必检查他们的代码能否工作(自然他能用于测试的各个阶段)。 系统测试:基于系统整体需求说明书的黑盒...
面向对象的设计Maven程序员测试(TDD)Java代码质量工具设计模式练习创作设计模式练习结构设计模式练习行为设计模式练习Java平台企业版练习JSR 299(CDI)练习实现EJB Java持久性API练习面向对象设计入门OO编程SOLID...
7.3.1. 方法的覆盖(overridding) 7-18 7.3.2. 多态的分类 7-18 7.3.3. 运行时多态的三原则 7-19 7.3.4. 关系运算符:instanceof 7-20 7.4. 静态变量,方法和类 7-20 7.5. Singleton模式 7-22 7.6. final关键字 7-...