彷徨的青蛙 · 如何把项目打jar包,然后暴露接口给第三方应 ...· 7 月前 · |
成熟的红薯 · Where I can find ...· 8 月前 · |
帅气的火柴 · 怎么清除localStorage - 掘金· 1 年前 · |
完美的脸盆 · HTML5 地理定位 | 菜鸟教程· 1 年前 · |
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,抛出 IOException 异常或者 IOException 的子类异常。 在面向对象原则里,重写意味着可以重写任何现有方法。实例如下:
以上实例编译运行结果如下:
动物可以移动 狗可以跑和走在上面的例子中可以看到,尽管 b 属于 Animal 类型,但是它运行的是 Dog 类的 move方法。
这是由于在编译阶段,只是检查参数的引用类型。
然而在运行时,Java 虚拟机(JVM)指定对象的类型并且运行该对象的方法。
因此在上面的例子中,之所以能编译成功,是因为 Animal 类中存在 move 方法,然而运行时,运行的是特定对象的方法。
思考以下例子:
以上实例编译运行结果如下:
TestDog.java:30: cannot find symbol symbol : method bark() location: class Animal b.bark();该程序将抛出一个编译错误,因为b的引用类型Animal没有bark方法。
参数列表与被重写方法的参数列表必须完全相同。
返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。
访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。
父类的成员方法只能被它的子类重写。
声明为 final 的方法不能被重写。
声明为 static 的方法不能被重写,但是能够被再次声明。
子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法。
子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。
重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
构造方法不能被重写。
如果不能继承一个类,则不能重写该类的方法。
以上实例编译运行结果如下:
动物可以移动 狗可以跑和走重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
最常用的地方就是构造器的重载。
重载规则:
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
(1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。horse
guo***gren1107@163.com
我一点都不方
274***2310@qq.com
九刃
528***187@qq.com
luzhe610
sci***n@qq.com
TJ
133***99286@163.com
Xander663
xan***1998@163.com
Anchorin
Anc***in@foxmail.com
父类变量指向子类实例时可以使用强制类型转换访问父类没有的子类成员。
import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { People a=new People(); People b=new Up(6); a.bark(); b.bark(); System.out.println(((Up)b).level); // 强制类型转换 class People{ public void bark(){ System.out.println("Hello!"); class Up extends People{ public int level; public Up(int lv){ level=lv; public void bark(){ System.out.println("鸽了鸽了,不播了");实例输出结果为:
Hello! 鸽了鸽了,不播了
独孤尚良
yut***hanlin@qq.com
红烧是一种做菜方法,可用来被比作 java 的方法。食材可以被比作为参数。厨师师徒可被比作为父子类。
方法的继承可以看做红烧这个做菜方法厨师老师传给厨师徒弟。
同样的红烧鱼,厨师老师的红烧方法传给厨师徒弟后,厨师徒弟在红烧方法上做了改动,这是红烧方法的重写,就相当于 java 的方法重写。
重写代码类似如下:
class Ct{ void hongshao(int a){ System.out.println("这是厨师老师的红烧int的方法"); class Cs extends Ct{ void hongshao(int a) { System.out.println("这是厨师徒弟的红烧int的方法");我找厨师徒弟做菜,我说要红烧,我给他鱼他就做的是红烧鱼,我给他排骨他就做的是红烧排骨,我给他鱼和排骨他就做的是红烧鱼和排骨。食材的不同就相当于 java 方法的参数不同,这个是重载。
重载代码类似如下:
class Cs extends Ct{ void hongshao(int a) { System.out.println("这是厨师徒弟的红烧int的方法"); void hongshao(float b) { System.out.println("这是厨师徒弟红烧float的方法"); void hongshao(int a,float b) { System.out.println("这是厨师徒弟红烧int和float的方法"); }
韶华轻负
jia***ihua77@163.com
class Chinese{ public void style(){ System.out.printhl("赣菜中餐馆"); class western extends Chinese{ public void style(){ System.out.printhl("西餐厅");餐厅还是那个餐厅,只是我继承过来加入了自己独有的方法。
重载:本来我只开了一个赣菜馆,但是我觉得菜系不够,于是我又增加了川菜、粤菜....
public class Chinese{ public void style(){ System.out.printhl("赣菜中餐馆"); public void style(int a){ System.out.printhl("a川菜中餐馆"); public void style(String b){ System.out.printhl("b粤菜中餐馆");做饭的方法并没有改变,只是参数不同,返回的值也不一样。
alittlemc
ali***emc@189.cn
重载 :同名方法通过 传入的参数不同 (如类型、个数、排序方式)而区分不同方法\函数,与返回值无关
例子:void a();void a(int i);int a(String str)等等,关键在传入的参数
class A{ void a(){ System.out.printhl("a()"); int a(){//这样是不合法,因为返回值类型不同不能区分不同的方法 System.out.printhl("a()"); void a(int i){//void a() System.out.printhl("a("+i+")");
重写 :在子类中编写与父类 返回值类型相同的同名方法 ,这样原来的父类方法就会被隐藏掉,可以使用super.方法名() 调用
class A{ void a(){ System.out.printhl("a()"); class B extends A{ /*int a(){//返回值与父类的void不同,报错 return 0; void a(int a){//就算是可以有不同的传入 System.out.printhl("a"+i);
aojiaodexiaoyanga
259***1569@qq.com