- 浏览: 1337842 次
- 性别:
- 来自: 湖南澧縣
文章分类
最新评论
-
虾米小尹:
不行啊!2.2-0.25=1.9500000000000002 ...
JavaScript浮点数运算 —— 精度问题 -
heluping000000:
引用String a= "abc",首先在 ...
String,到底创建了多少个对象? -
mack:
谢谢分享matcher.appendReplacement(s ...
string.replaceAll()中的特殊字符($ \)与matcher.appendReplacement -
wzt3309:
完全理解,比网上其他资料都要详细
String,到底创建了多少个对象? -
u014771876:
Java中十六进制转换 Integer.toHexString()
覆写是多态的一种表现,我们平时所说的覆写一般是针对方式来说,在网上看到过有人讨论试着覆写属性,于是有点兴趣,属性真能覆写吗?回答问题之前,我们还是回忆一下方法的覆写具备哪些条件,或都说哪些方法能覆写。
先回顾一下方法覆写要注意的地方:
1、重载(也叫过载)时只与方法特征有关,但重写(覆写)是会进一步检查两个方法的返回类型是否相同、访问修饰权限是否缩小(假设public->protected方向是缩小,反之叫扩大)和抛出的异常范围是否扩大。那么什么是方式特征呢?一个方法的特征(也可叫方法签名)仅包括方法的名字、参数的个数、类型、顺序(实质上就是参数列表),而不包括方法的返回类型、访问修饰权限与所抛出的异常。
public class A { public void overwrite(int i) throws IOException {} } class B extends A { // !! 编译通不过,不能缩小访问权限 // void overwrite(int i) throws IOException {} // !! 编译通不过,不能扩大异常范围 // public void overwrite(int i) throws Exception {} // 正常,编译没问题,可以不抛出异常 // public void overwrite(int i) {} // 覆写父类方法 public void overwrite(int i) throws IOException {} protected void overload(int i) {} //重载上面的方法 int overload(long i) throws IOException { return 0; } }
另外,要补充说明的是重载一般是指在同一个类中多个方法间,但也可重父类的的方法,而重写只发生面父子与子类的方法间。
2、非私有非静态方法不能被任何静态方法覆写,如果子类中试着以静态方式(不管访问权限修饰符是什么)来覆写父类的方法,编译时会报错。
public class A { void f() {} } class B extends A { // !! 编译出错,下面错误都一样 // static void f(){}; // private static void f(){}; // protected static void f(){}; // public static void f(){}; }
3、非私有静态方法不能被任何非静态方法覆写,如果子类中试着以非静态方式(不管访问权限修饰符是什么)来覆写父类的方法,编译时会报错。
public class A { public static void f() {} } class B extends A { // !! 编译出错,下面错误都一样 // public void f(){} // protected void f() {} // void f() {} // private void f() {} }
4、子类与父类中有方法特征相同的静态方法时,覆写规则与非静态方法覆写规则一样,但一般我们不把静态方法的覆写叫覆写,虽然语法规则上与非静态方法相同。
public class A { public static void overwrite(int i) throws IOException { System.out.println("父类静态方法..."); } } class B extends A { // !! 编译通不过,不能缩小访问权限 // static void overwrite(int i) throws IOException {} // !! 编译通不过,不能扩大异常范围 // public static void overwrite(int i) throws Exception {} // 正常,编译没问题,可以不抛出异常 // public static void overwrite(int i) {} // 覆写父类静态方法 public static void overwrite(int i) throws IOException { System.out.println("子类静态方法..."); } public static void main(String[] args) throws IOException { A a = new B(); //覆写静态在语法上是合法的,但没有多态效果 a.overwrite(0);//print: 父类静态方法... A.overwrite(0);//print: 父类静态方法... B.overwrite(0);//print: 子类静态方法... } }
上面重写了父类的静态方法,但却没有多态作用,也就是说,静态方法不存在重写这一说,只不过在语法规则上与非静态方法一样罢了。
5、私有方法对子类同名方法不产生任何影响,也就是说私有方法不能被重写,即使试着在子类覆写了父类的私有方法,不管访问权限修饰符是什么,在编译时也不会报错。原因就是私有方法对子类也是不可见的。
public class A { private void f() { } // 加上static修饰符,其结果都一样 // private static void f() {} } class B extends A { // 尝试每个方式,都会编译能过 // private void f() {} // void f() {} // protected void f() {} // public void f() {} // private static void f() {} // static void f() {} // protected static void f() {} public static void f() {} }
好了,上面总结并理解方法覆后,我们再来看属性能不能覆写,其实,这是一个很无聊的问题,不像上面讨论方法那有点价值,可以说属性是没有覆写这一说的,这有点像静态方法一样,不过还是稍微看一下:
public class A { // 这行不能去掉,否则①编译通不过 int i = 1; A() { System.out.println("父类构造方法 i=" + this.i);//① this.f();//② System.out.println("父类中 " + (this == getThis()));//③ print:true } public void f() { System.out.println("父类方法f() i=" + this.i); } public A getThis() { System.out.println("父类getThis"); return this; } } class B extends A { int i = 2; B() { System.out.println("子类构造方法 i=" + this.i); System.out.println("子类中 " + (this == super.getThis()));//④ } public void f() { System.out.println("子类方法f() i=" + this.i); } public A getThis() { System.out.println("子类getThis"); return this; } public static void main(String[] args) { /* * 从下面 a.i 与 b.i 的输出可以看出,某对象的属性只与声明 的类型相 * 关,与对象本身是什么类型无关,这与方法是完全不同的 */ A a = new B(); System.out.println("main方法 a.i=" + a.i); B b = (B) a; System.out.println("main方法 b.i=" + b.i); /* * output: 父类构造方法 i=1 子类方法f() i=0 子类getThis 父类中 true 子类构造方法 i=2 父类getThis 子类中 true main方法 a.i=1 main方法 b.i=2 */ } }
这里一直有个疑问:上面①②处的this肯定都是同一个对象,且都指向子类对象,还并且与子类中this是同一象,由第③④行代码可以证明这一点。但为什么①处的this好像指向了父类对象,不然为什么①处输出的i是父类中的i呢?这说明属性除了只与定义他的类型有关外,如果在类的内部自身访问时,就会访问当前所在类的属性,与this无关,这进一步说明了属性是不具有多态这一特性的。
发表评论
-
Java正则表达式
2014-03-14 10:16 1766Java正则表达式详解 作者:jzj 文 ... -
类的初始化与清理
2013-06-24 22:20 1456初始化时内存清零 当创建一个对象时,首先将在堆上为这个对象分 ... -
protected,这个错了吗?
2013-06-24 22:17 1251这几天对protected修饰符有点迷糊,随便找同事要了一本 ... -
Java中BigDecimal的8种舍入模式
2013-06-21 18:42 2185java.math.BigDecimal不可变的、任意精度的 ... -
Tomcat性能参数设置
2010-12-27 15:35 34802默认参数不适合生产环境使用,因此需要修改一些参数 1、 ... -
Java 6 JVM参数选项大全
2010-12-14 11:16 1638http://kenwublog.com/docs/java6 ... -
对象的安全构造
2013-06-21 18:43 1546在构造期间,不要公布“this”引用 一种可以将数据争用引 ... -
Java断言(assert)—— 转
2010-06-20 10:36 12101一、概述 在C和C++语言中都有assert关键,表示断言。 ... -
eclipse调试
2010-06-04 00:11 8083eclipse远程调试 在eclipse3.4前,远程调试时 ... -
protected,你真的理解了吗?
2010-05-09 17:56 2149Java中的访问控制修饰符有四个级别,但属protected最 ... -
利用反射进行深层克隆
2010-05-05 21:02 3670最近在看《effective java ... -
类与类之间的几种关系
2010-05-03 13:49 2419类和类、类和接口、接 ... -
运行java
2010-05-03 13:47 1053用javac命令编译一个打包的类时,如果没有加参数" ... -
Java内存模型与volatile
2010-04-25 13:21 18796内存模型描述的是程序 ... -
中断线程
2010-04-24 21:19 8997中断线程 线程的thread.i ... -
java中的关键字、保留字、标示符
2010-04-07 23:48 3375关键字 Java的关键字对java的编译器有特殊的意义, ... -
Java中的浮点数剖析
2010-04-07 23:27 4723定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固 ... -
线程间的同步与互斥
2010-03-23 21:29 2305线程间的同步(实指线程间的通信):一般来说,一个线程相对于另 ... -
UTF-16、UTF-16BE、UTF-16LE编码方式的区别
2010-03-23 21:20 9820import java.io.IOException; ... -
final、finally、finalize
2010-01-22 01:15 2429final关键字 先看看final关键字,它可以被用于以下几个 ...
相关推荐
4. URL重写:Nginx支持URL重写规则,可以实现友好的URL结构,提升用户体验。 5. SSL/TLS支持:Nginx可以配置为支持HTTPS,提供安全的HTTP通信。 6. 错误页面自定义:可以定义自定义的错误页面,提升网站的专业形象...
在Android 3.2及以上版本中,屏幕大小的改变也会触发Activity的销毁和重建,所以包含这个属性能确保在屏幕尺寸变化时不销毁Activity。 在`<activity>`标签中配置好上述属性后,还需要在Activity类中重写`...
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的...
接口:1、全部的方法都是抽象方法,属型都是常量;2、不能实例化,可以定义变量。3、接口变量可以引用具体实现类的实例;4、接口只能被实现,一个具体类实现接口,必须实现全部的抽象方法;5、接口之间可以多实现;6...
开发者需要编写一个类实现PropertyDefiner接口,并重写getPropertyValue方法来返回需要的属性值。这种方式比较直接,可以灵活地从程序中生成属性值,不过它不能在logback.xml配置中直接引用环境变量或系统属性。 第...
接口:1、全部的方法都是抽象方法,属型都是常量2、不能实例化,可以定义变量。3、接口变量可以引用具体实现类的实例4、接口只能被实现,一个具体类实现接口,必须实现全部的抽象方法5、接口之间可以多实现6、一个...
`final`类不可被继承,`final`方法不可被重写,`final`变量一旦初始化后不可更改。 - **`finally`**:异常处理结构的一部分,确保无论是否发生异常,`finally`块中的代码都将被执行,提供资源释放等收尾操作的可靠...
Java通过方法重载(overloading)和方法覆盖(overriding)实现多态,前者是在同一类内有相同方法名但参数列表不同的方法,后者是子类重写父类的方法。 5. **抽象类与接口**:抽象类不能实例化,用于定义共性,可以...
SurfaceView是Android中一种特殊的视图,它提供了直接在自己的专属线程中绘制的能力,非常适合用于高性能的图形渲染,如游戏或动画。 1. **SurfaceView基础** SurfaceView在Android UI层次结构中独立于普通的View...
- Final 用于修饰类、变量和方法,声明为 final 的类无法被继承,其所有方法也不能被重写,如 String、StringBuilder 和 StringBuffer 等类。 - Finally 语句块常与 try-catch 结合,确保即使在异常情况下也能执行...
- 自定义View时,需要重写`onDraw()`方法进行绘制,并处理触摸事件,如`onTouchEvent()`,实现点击键位的功能。 2. **键盘布局设计**: - 使用XML布局文件定义键盘的键位,可以包括数字、字母、特殊符号等,同时...
5. **元数据支持**:为了在设计时可视化编辑这些属性,需要使用TypeConverter和DefaultValueAttribute等元数据,使属性能在设计时工具中正确显示和编辑。 6. **封装源码**:将以上代码封装到一个独立的类库项目中,...
创建自定义Classloader需要继承java.lang.ClassLoader类,并重写其关键方法,如`findClass(String name)`或`loadClass(String name)`。这两个方法分别用于查找指定类的字节码和实际加载类。在`findClass`中,我们...
9. 计算机性能衡量指标:主要有计算机语言、显示器分辨率、打印机类型等。 10. 计算机语言发展历程:机器语言、汇编语言、高级语言,计算机能识别的语言是计算机语言。 11. 显示器分辨率:是显示器一屏能显示的...
在Android中,我们通常创建一个继承自BaseAdapter的自定义适配器,重写其中的几个关键方法,如getCount(), getItem(), getItemId()以及getView(),以实现数据的加载和视图的创建。 要实现多个ListView的整体滑动,...
在实现MyViewPager时,开发者可能首先会继承自Android的ViewPager类,并重写其关键方法。例如,`onPageScrolled()`、`onPageSelected()`和`onPageScrollStateChanged()`,这些方法会在页面滑动时被调用,可以在这里...
在这个过程中,我们需要重写关键方法,如`onDraw()`,用于绘制控件的外观,以及`onMeasure()`和`onLayout()`,来确定控件的大小和位置。 对于自定义`loading`,我们可能需要结合`Canvas`和`Paint`来绘制动画。`...