导航:首页 > 研究方法 > 重写原理分析方法

重写原理分析方法

发布时间:2022-09-02 16:18:30

❶ 重写,覆盖,重载,隐藏,多态几个概念的区别分析

override->重写(=覆盖)、overload->重载、polymorphism -> 多态

override是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写(重新实现)父类中的方法。
重写(覆盖)的规则:
1、重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载.
2、重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)。
3、重写的方法的返回值必须和被重写的方法的返回一致;
4、重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类;
5、被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。
6、静态方法不能被重写为非静态的方法(会编译出错)。

overload是重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。
重载的规则:
1、在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样);
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;

多态的概念比较复杂,有多种意义的多态,一个有趣但不严谨的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法。
一般,我们使用多态是为了避免在父类里大量重载引起代码臃肿且难于维护。

❷ 简述方法重载和方法重写的区别

、方法重写(0veriding)
在Java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征,继承了父类所有的方法和变量。

子类可以定义新的特征,当子类需要修改父类的一些方法进行扩展,增大功能,程序设计者常常把这样的一种操作方法称为重写,也叫称为覆写或覆盖。

重写体现了Java优越性,重写是建立在继承关系上,它使语言结构更加丰富。在Java中的继承中,子类既可以隐藏和访问父类的方法,也可以覆盖继承父类的方法。

在Java中覆盖继承父类的方法就是通过方法的重写来实现的。所谓方法的重写是指子类中的方法与父类中继承的方法有完全相同的返回值类型、方法名、参数个数以及参数类型。

这样,就可以实现对父类方法的覆盖。如果子类将父类中的方法重写了,调用的时候肯定是调用被重写过的方法,那么如果现在一定要调用父类中的方法该怎么办呢?

此时,通过使用super关键就可以实现这个功能,super关键字可以从子类访问父类中的内容,如果要访问被重写过的方法,使用“super.方法名(参数列表)”的形式调用。

如果要使用super关键字不一定非要在方法重写之后使用,也可以明确地表示某个方法是从父类中继承而来的。使用super只是更加明确的说,要从父类中查找,就不在子类查找了。

重写的好处在于子类可以根据需要,定义特定于自己的行为。
也就是说子类能够根据需要实现父类的方法。
在面向对象原则里,重写意味着可以重写任何现有方法。实例如下:

class Animal{
public void move(){
System.out.println("动物可以移动");
}
}
class Dog extends Animal{
public void move(){
System.out.println("狗可以跑和走");
}
}
public class TestDog{
public static void main(String args[]){
Animal a = new Animal(); // Animal 对象
Animal b = new Dog(); // Dog 对象
a.move();// 执行 Animal 类的方法
b.move();//执行 Dog 类的方法
}
}

//运行结果
动物可以移动
狗可以跑和走

在上面的例子中可以看到,尽管b属于Animal类型,但是它运行的是Dog类的move方法。

这是由于在编译阶段,只是检查参数的引用类型。

然而在运行时,Java虚拟机(JVM)指定对象的类型并且运行该对象的方法。
因此在上面的例子中,之所以能编译成功,是因为Animal类中存在move方法,然而运行时,运行的是特定对象的方法。
思考以下例子:

class Animal{
public void move(){
System.out.println("动物可以移动");
}
}
class Dog extends Animal{
public void move(){
System.out.println("狗可以跑和走");
}
public void bark(){
System.out.println("狗可以吠叫");
}
}
public class TestDog{
public static void main(String args[]){
Animal a = new Animal(); // Animal 对象
Animal b = new Dog(); // Dog 对象
a.move();// 执行 Animal 类的方法
b.move();//执行 Dog 类的方法
b.bark();
}
}
//以上实例编译运行结果如下:
TestDog.java:30: cannot find symbol
symbol : method bark()
location: class Animal

该程序将抛出一个编译错误,因为b的引用类型Animal没有bark方法。

二、重写规则
在重写方法时,需要遵循以下的规则:
(一) 父类方法的参数列表必须完全与被子类重写的方法的参数列表相同,否则不能称其为重写而是重载。

(二) 父类的返回类型必须与被子类重写的方法返回类型相同,否则不能称其为重写而是重载。

(三) Java中规定,被子类重写的方法不能拥有比父类方法更加严格的访问权限。编写过Java程序的人就知道,父类中的方法并不是在任何情况下都可以重写的,当父类中方法的访问权限修饰符为private时,该方法只能被自己的类访问,不能被外部的类访问,在子类是不能被重写的。如果定义父类的方法为public,在子类定义为private,程序运行时就会报错。

(四) 由于父类的访问权限修饰符的限制一定要大于被子类重写方法的访问权限修饰符,而private权限最小。所以如果某一个方法在父类中的访问权限是private,那么就不能在子类中对其进行重写。如果重新定义,也只是定义了一个新的方法,不会达到重写的效果。

(五) 在继承过程中如果父类当中的方法抛出异常,那么在子类中重写父类的该方法时,也要抛出异常,而且抛出的异常不能多于父类中抛出的异常(可以等于父类中抛出的异常)。换句话说,重写方法一定不能抛出新的检查异常,或者比被重写方法声明更加宽泛的检查型异常。例如,父类的一个方法申明了一个检查异常IOException,在重写这个方法时就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。同样的道理,如果子类中创建了一个成员变量,而该变量和父类中的一个变量名称相同,称作变量重写或属性覆盖。但是此概念一般很少有人去研究它,因为意义不大。

Super关键字的使用
当需要在子类中调用父类的被重写方法时,要使用super关键字。

三、方法重载(Overloading)
方法重载是让类以统一的方式处理不同类型数据的一种手段。调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法,这就是多态性。

所谓方法重载是指在一个类中,多个方法的方法名相同,但是参数列表不同。参数列表不同指的是参数个数、参数类型或者参数的顺序不同。

方法的重载在实际应用中也会经常用到。不仅是一般的方法,构造方法也可以重载。

在方法重载时,方法之间需要存在一定的联系,因为这样可以提高程序的可读性,一般只重载功能相似的方法。

重载是指我们可以定义一些名称相同的方法,通过定义不同的参数来区分这些方法,然后再调用时,Java虚拟机就会根据不同的参数列表来选择合适的方法执行。也就是说,当一个重载方法被调用时,Java用参数的类型或个数来决定实际调用的重载方法。因此,每个重载方法的参数的类型或个数必须是不同。

虽然每个重载方法可以有不同的返回类型,但返回类型并不足以区分所使用的是哪个方法。

当Java调用一个重载方法是,参数与调用参数匹配的方法被执行。在使用重载要注意以下的几点:
1.在使用重载时只能通过不同的参数列表,必须具有不同的参数列表。
2.不能通过访问权限、返回类型、抛出的异常进行重载。
3.方法的异常类型和数目不会对重载造成影响。
4.可以有不同的返回类型,只要参数列表不同就可以了。
5.可以有不同的访问修饰符。
6.可以抛出不同的异常。

重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型呢?可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
只能重载构造函数

四、重载规则
被重载的方法必须改变参数列表;
被重载的方法可以改变返回类型;
被重载的方法可以改变访问修饰符;
被重载的方法可以声明新的或更广的检查异
五、访问修饰符
访问修饰符 本类 同包 子类 其他
private √
默认 √ √
protected √ √ √
public √ √ √
重写与重载之间的区别

方法重载:
1、同一个类中
2、方法名相同,参数列表不同(参数顺序、个数、类型)
3、方法返回值、访问修饰符任意
4、与方法的参数名无关

方法重写:
1、有继承关系的子类中
2、方法名相同,参数列表相同(参数顺序、个数、类型),方法返回值相同
3、访问修饰符,访问范围需要大于等于父类的访问范围
4、与方法的参数名无关

区别点 重载方法 重写方法
参数列表 必须修改 一定不能修改
返回类型 可以修改 一定不能修改
异常 可以修改 可以减少或删除,一定不能抛出新的或者更广的异常
访问 可以修改 一定不能做更严格的限制(可以降低限制)

❸ java中重写,重载,多态几个概念区别分析

重写是方法名字一样,返回类型一样
重载:一个类,方法的名字相同,但是参数的个数,类型可能不同

❹ 请问各位大佬这道java的重写equals和重写hashcode方法内部是什么意思呀

1.equals()的所属以及内部原理(即Object中equals方法的实现原理)

说起equals方法,我们都知道是超类Object中的一个基本方法,用于检测一个对象是否与另外一个对象相等。而在Object类中这个方法实际上是判断两个对象是否具有相同的引用,如果有,它们就一定相等。其源码如下:

public boolean equals(Object obj) { return (this == obj); }
实际上我们知道所有的对象都拥有标识(内存地址)和状态(数据),同时“==”比较两个对象的的内存地址,所以说 Object 的 equals() 方法是比较两个对象的内存地址是否相等,即若 object1.equals(object2) 为 true,则表示 equals1 和 equals2 实际上是引用同一个对象。

2.equals()与‘==’的区别

或许这是我们面试时更容易碰到的问题”equals方法与‘==’运算符有什么区别?“,并且常常我们都会胸有成竹地回答:“equals比较的是对象的内容,而‘==’比较的是对象的地址。”。但是从前面我们可以知道equals方法在Object中的实现也是间接使用了‘==’运算符进行比较的,所以从严格意义上来说,我们前面的回答并不完全正确。我们先来看一段代码并运行再来讨论这个问题。

package com.zejian.test;
public class Car {
private int batch;
public Car(int batch) {
this.batch = batch;
}
public static void main(String[] args) {
Car c1 = new Car(1);
Car c2 = new Car(1);
System.out.println(c1.equals(c2));
System.out.println(c1 == c2);
}
}
运行结果:

false

false

分析:对于‘==’运算符比较两个Car对象,返回了false,这点我们很容易明白,毕竟它们比较的是内存地址,而c1与c2是两个不同的对象,所以c1与c2的内存地址自然也不一样。现在的问题是,我们希望生产的两辆的批次(batch)相同的情况下就认为这两辆车相等,但是运行的结果是尽管c1与c2的批次相同,但equals的结果却反回了false。当然对于equals返回了false,我们也是心知肚明的,因为equal来自Object超类,访问修饰符为public,而我们并没有重写equal方法,故调用的必然是Object超类的原始方equals方法,根据前面分析我们也知道该原始equal方法内部实现使用的是'=='运算符,所以返回了false。因此为了达到我们的期望值,我们必须重写Car的equal方法,让其比较的是对象的批次(即对象的内容),而不是比较内存地址,于是修改如下:

@Override
public boolean equals(Object obj) {
if (obj instanceof Car) {
Car c = (Car) obj;
return batch == c.batch;
}
return false;
}
使用instanceof来判断引用obj所指向的对象的类型,如果obj是Car类对象,就可以将其强制转为Car对象,然后比较两辆Car的批次,相等返回true,否则返回false。当然如果obj不是 Car对象,自然也得返回false。我们再次运行:

true

false

嗯,达到我们预期的结果了。因为前面的面试题我们应该这样回答更佳
总结:默认情况下也就是从超类Object继承而来的equals方法与‘==’是完全等价的,比较的都是对象的内存地址,但我们可以重写equals方法,使其按照我们的需求的方式进行比较,如String类重写了equals方法,使其比较的是字符的序列,而不再是内存地址。

3.equals()的重写规则

前面我们已经知道如何去重写equals方法来实现我们自己的需求了,但是我们在重写equals方法时,还是需要注意如下几点规则的。

自反性。对于任何非null的引用值x,x.equals(x)应返回true。

对称性。对于任何非null的引用值x与y,当且仅当:y.equals(x)返回true时,x.equals(y)才返回true。

传递性。对于任何非null的引用值x、y与z,如果y.equals(x)返回true,y.equals(z)返回true,那么x.equals(z)也应返回true。

一致性。对于任何非null的引用值x与y,假设对象上equals比较中的信息没有被修改,则多次调用x.equals(y)始终返回true或者始终返回false。

对于任何非空引用值x,x.equal(null)应返回false。

当然在通常情况下,如果只是进行同一个类两个对象的相等比较,一般都可以满足以上5点要求,下面我们来看前面写的一个例子。

package com.zejian.test;
public class Car {
private int batch;
public Car(int batch) {
this.batch = batch;
}
public static void main(String[] args) {
Car c1 = new Car(1);
Car c2 = new Car(1);
Car c3 = new Car(1);
System.out.println("自反性->c1.equals(c1):" + c1.equals(c1));
System.out.println("对称性:");
System.out.println(c1.equals(c2));
System.out.println(c2.equals(c1));
System.out.println("传递性:");
System.out.println(c1.equals(c2));
System.out.println(c2.equals(c3));
System.out.println(c1.equals(c3));
System.out.println("一致性:");
for (int i = 0; i < 50; i++) {
if (c1.equals(c2) != c1.equals(c2)) {
System.out.println("equals方法没有遵守一致性!");
break;
}
}
System.out.println("equals方法遵守一致性!");
System.out.println("与null比较:");
System.out.println(c1.equals(null));
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Car) {
Car c = (Car) obj;
return batch == c.batch;
}
return false;
}
}
运行结果:

自反性->c1.equals(c1):true

对称性:

true

true

传递性:

true

true

true

一致性:

equals方法遵守一致性!

与null比较:

false

由运行结果我们可以看出equals方法在同一个类的两个对象间的比较还是相当容易理解的。但是如果是子类与父类混合比较,那么情况就不太简单了。下面我们来看看另一个例子,首先,我们先创建一个新类BigCar,继承于Car,然后进行子类与父类间的比较。

package com.zejian.test;
public class BigCar extends Car {
int count;
public BigCar(int batch, int count) {
super(batch);
this.count = count;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof BigCar) {
BigCar bc = (BigCar) obj;
return super.equals(bc) && count == bc.count;
}
return false;
}
public static void main(String[] args) {
Car c = new Car(1);
BigCar bc = new BigCar(1, 20);
System.out.println(c.equals(bc));
System.out.println(bc.equals(c));
}
}
运行结果:

true

false

对于这样的结果,自然是我们意料之中的啦。因为BigCar类型肯定是属于Car类型,所以c.equals(bc)肯定为true,对于bc.equals(c)返回false,是因为Car类型并不一定是BigCar类型(Car类还可以有其他子类)。嗯,确实是这样。但如果有这样一个需求,只要BigCar和Car的生产批次一样,我们就认为它们两个是相当的,在这样一种需求的情况下,父类(Car)与子类(BigCar)的混合比较就不符合equals方法对称性特性了。很明显一个返回true,一个返回了false,根据对称性的特性,此时两次比较都应该返回true才对。那么该如何修改才能符合对称性呢?其实造成不符合对称性特性的原因很明显,那就是因为Car类型并不一定是BigCar类型(Car类还可以有其他子类),在这样的情况下(Car instanceof BigCar)永远返回false,因此,我们不应该直接返回false,而应该继续使用父类的equals方法进行比较才行(因为我们的需求是批次相同,两个对象就相等,父类equals方法比较的就是batch是否相同)。因此BigCar的equals方法应该做如下修改:

@Override
public boolean equals(Object obj) {
if (obj instanceof BigCar) {
BigCar bc = (BigCar) obj;
return super.equals(bc) && count == bc.count;
}
return super.equals(obj);
}
这样运行的结果就都为true了。但是到这里问题并没有结束,虽然符合了对称性,却还没符合传递性,实例如下:
package com.zejian.test;
public class BigCar extends Car {
int count;
public BigCar(int batch, int count) {
super(batch);
this.count = count;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof BigCar) {
BigCar bc = (BigCar) obj;
return super.equals(bc) && count == bc.count;
}
return super.equals(obj);
}
public static void main(String[] args) {
Car c = new Car(1);
BigCar bc = new BigCar(1, 20);
BigCar bc2 = new BigCar(1, 22);
System.out.println(bc.equals(c));
System.out.println(c.equals(bc2));
System.out.println(bc.equals(bc2));
}
}
运行结果:

true

true

false

bc,bc2,c的批次都是相同的,按我们之前的需求应该是相等,而且也应该符合equals的传递性才对。但是事实上运行结果却不是这样,违背了传递性。出现这种情况根本原因在于:

父类与子类进行混合比较。

子类中声明了新变量,并且在子类equals方法使用了新增的成员变量作为判断对象是否相等的条件。

只要满足上面两个条件,equals方法的传递性便失效了。而且目前并没有直接的方法可以解决这个问题。因此我们在重写equals方法时这一点需要特别注意。虽然没有直接的解决方法,但是间接的解决方案还说有滴,那就是通过组合的方式来代替继承,还有一点要注意的是组合的方式并非真正意义上的解决问题(只是让它们间的比较都返回了false,从而不违背传递性,然而并没有实现我们上面batch相同对象就相等的需求),而是让equals方法满足各种特性的前提下,让代码看起来更加合情合理,代码如下:

package com.zejian.test;
public class Combination4BigCar {
private Car c;
private int count;
public Combination4BigCar(int batch, int count) {
c = new Car(batch);
this.count = count;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Combination4BigCar) {
Combination4BigCar bc = (Combination4BigCar) obj;
return c.equals(bc.c) && count == bc.count;
}
return false;
}
}
从代码来看即使batch相同,Combination4BigCar类的对象与Car类的对象间的比较也永远都是false,但是这样看起来也就合情合理了,毕竟Combination4BigCar也不是Car的子类,因此equals方法也就没必要提供任何对Car的比较支持,同时也不会违背了equals方法的传递性。

4.equals()的重写规则之必要性深入解读

前面我们一再强调了equals方法重写必须遵守的规则,接下来我们就是分析一个反面的例子,看看不遵守这些规则到底会造成什么样的后果。

package com.zejian.test;
import java.util.ArrayList;
import java.util.List;
/** * 反面例子 * @author zejian */
public class AbnormalResult {
public static void main(String[] args) {
List<A> list = new ArrayList<A>();
A a = new A();
B b = new B();
list.add(a);
System.out.println("list.contains(a)->" + list.contains(a));
System.out.println("list.contains(b)->" + list.contains(b));
list.clear();
list.add(b);
System.out.println("list.contains(a)->" + list.contains(a));
System.out.println("list.contains(b)->" + list.contains(b));
}
static class A {
@Override
public boolean equals(Object obj) {
return obj instanceof A;
}
}
static class B extends A {
@Override
public boolean equals(Object obj) {
return obj instanceof B;
}
}
}
上面的代码,我们声明了 A,B两个类,注意必须是static,否则无法被main调用。B类继承A,两个类都重写了equals方法,但是根据我们前面的分析,这样重写是没有遵守对称性原则的,我们先来看看运行结果:

list.contains(a)->true

list.contains(b)->false

list.contains(a)->true

list.contains(b)->true

19行和24行的输出没什么好说的,将a,b分别加入list中,list中自然会含有a,b。但是为什么20行和23行结果会不一样呢?我们先来看看contains方法内部实现

@Override
public boolean contains(Object o) {
return indexOf(o) != -1;
}
进入indexof方法
@Override
public int indexOf(Object o) {
E[] a = this.a;
if (o == null) {
for (int i = 0; i < a.length; i++)
if (a[i] == null)
return i;
} else {
for (int i = 0; i < a.length; i++)
if (o.equals(a[i]))
return i;
}
return -1;
}
可以看出最终调用的是对象的equals方法,所以当调用20行代码list.contains(b)时,实际上调用了

b.equals(a[i]),a[i]是集合中的元素集合中的类型而且为A类型(只添加了a对象),虽然B继承了A,但此时

a[i] instanceof B
结果为false,equals方法也就会返回false;而当调用23行代码list.contains(a)时,实际上调用了a.equal(a[i]),其中a[i]是集合中的元素而且为B类型(只添加了b对象),由于B类型肯定是A类型(B继承了A),所以
a[i] instanceof A
结果为true,equals方法也就会返回true,这就是整个过程。但很明显结果是有问题的,因为我们的 list的泛型是A,而B又继承了A,此时无论加入了a还是b,都属于同种类型,所以无论是contains(a),还是contains(b)都应该返回true才算正常。而最终却出现上面的结果,这就是因为重写equals方法时没遵守对称性原则导致的结果,如果没遵守传递性也同样会造成上述的结果。当然这里的解决方法也比较简单,我们只要将B类的equals方法修改一下就可以了。
static class B extends A{
@Override
public boolean equals(Object obj) {
if(obj instanceof B){
return true;
}
return super.equals(obj);
}
}
到此,我们也应该明白了重写equals必须遵守几点原则的重要性了。当然这里不止是list,只要是java集合类或者java类库中的其他方法,重写equals不遵守5点原则的话,都可能出现意想不到的结果。

5.为什么重写equals()的同时还得重写hashCode()

这个问题之前我也很好奇,不过最后还是在书上得到了比较明朗的解释,当然这个问题主要是针对映射相关的操作(Map接口)。学过数据结构的同学都知道Map接口的类会使用到键对象的哈希码,当我们调用put方法或者get方法对Map容器进行操作时,都是根据键对象的哈希码来计算存储位置的,因此如果我们对哈希码的获取没有相关保证,就可能会得不到预期的结果。在java中,我们可以使用hashCode()来获取对象的哈希码,其值就是对象的存储地址,这个方法在Object类中声明,因此所有的子类都含有该方法。那我们先来认识一下hashCode()这个方法吧。hashCode的意思就是散列码,也就是哈希码,是由对象导出的一个整型值,散列码是没有规律的,如果x与y是两个不同的对象,那么x.hashCode()与y.hashCode()基本是不会相同的,下面通过String类的hashCode()计算一组散列码:

package com.zejian.test;
public class HashCodeTest {
public static void main(String[] args) {
int hash=0;
String s="ok";
StringBuilder sb =new StringBuilder(s);

System.out.println(s.hashCode()+" "+sb.hashCode());

String t = new String("ok");
StringBuilder tb =new StringBuilder(s);
System.out.println(t.hashCode()+" "+tb.hashCode());
}

}
运行结果:

3548 1829164700

3548 2018699554

我们可以看出,字符串s与t拥有相同的散列码,这是因为字符串的散列码是由内容导出的。而字符串缓冲sb与tb却有着不同的散列码,这是因为StringBuilder没有重写hashCode方法,它的散列码是由Object类默认的hashCode方法计算出来的对象存储地址,所以散列码自然也就不同了。那么我们该如何重写出一个较好的hashCode方法呢,其实并不难,我们只要合理地组织对象的散列码,就能够让不同的对象产生比较均匀的散列码。
原文链接:https://blog.csdn.net/javazejian/article/details/51348320

❺ 方法重载和重写的区别

重载:重载字面意思多次的意思,也就是同一个方法实现多个不同的逻辑,并可以在同一个类中可以实现。其实现的原理是,方法名相同,参数的个数或者类型不同即可。
重写:重写就是要重新去写(实现),一个类中不可能两个定义一样的方法。因此,重写就是子类对父类定义的方法重新实现一次。
(5)重写原理分析方法扩展阅读
一、方法重载的具体规范:
1、必须具有不同的参数列表;
2、可以有不同的返回类型,只要参数列表不同就可以了;
3、可以有不同的访问修饰符;
4、可以抛出不同的异常。
二、方法重写的具体规范:
1、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载;
2、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载;
3、访问修饰符的限制一定要大于被重写方法的访问修饰符号、(public>protected>default>private);
4、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。
参考资料:搜狗网络——方法重载搜狗网络——方法重写

❻ java重载和重写的区别

怎样才算是一个方法覆盖:
1 首先要保证方法名、参数类型、参数个数、参数顺序完全一样
2 返回类型也必须要一致
3 子类方法不能缩小父类方法的访问权限比如不能由public变成

private了如果可以的话请看下面一段代码会出现什么问题
4 子类方法不能抛出比父类方法更多的异常,只能够相同,或者是父类

方法抛出的异常类的子类。
因为如果可以的话,就会与Java语言的多态机制发生冲突
5 父类的static方法不能被子类覆盖为非static方法 子类可以定义

static方法覆盖父类的static方法 子类不可以定义static方法覆盖父

类的非static方法
6 子类方法覆盖父类方法的前提是,子类必须能够继承父类的特定方法
7 父类的抽象方法可以被子类通过两种途径覆盖:一是子类实现父类的

抽象方法;二是子类重新声明父类的抽象方法。

所以答案1:methodTwo和methodFour覆盖了父类的方法。分析各个方法:因为methodOne不符合规则5,所以没有覆盖。你的methodTwo我认为应该是public static void 不是你发出来的public void void,所以符合规则5,所以methodTwo覆盖了父类的方法。methodThree方法不符合规则5,所以没有覆盖。methodFour符合规则5,所以覆盖了父类的方法。

答案2:重载是在同一个类中,所以子类没有可能重载父类的任何一个方法。原则是:方法名一样。所以父类的四个方法都没有被子类重载。

问题3:根据原则5,可以看出static对方法覆盖有影响,对重载也没有影响。

第四个问题:是覆盖。因为方法名一样,返回类型一样,参数个数和参数类型一样。重载是在同一个类中,所以不是重载。
第五个问题:因为Object有toString方法,而所有的类都是继承自Object,所以每个类中都有一个toString方法,如果我们在类中再写toString方法,就是重载了。覆盖是在父类和子类中说的,也就是平时所说的方法重写。

对于方法重载来说,关键就是参数的类型、参数的个数、参数的顺序至

少有一项不相同。至于修饰符

(private/protected/public/abstract/final/static),返回类型都

无所谓。

❼ java中重载和重写有什么区别最好举一个程序例子分析一下。3Q

1,重载是指方法的参数个数或者类型不同,如果function(int i){}与function(String s){},这个构成了重载。
2,重写是指子类覆盖了父类的方法,子类的方法名、参数与父类相同,就是重写

❽ 文件重写方法和原理(知情者进)

1、选用专业文件粉碎机软件:

>Data Shredder(www.datashreddergold.com)

CBL公司的Data Shredder,符合美国、加拿大、德国和英国政府数据消除标准。真正清空你的垃圾箩而不只是删除而已。方式是通过多次重写反复改写数据不同的位模式,直到它完全无可挽救。

>Eraser(www.heidi.ie/eraser/)

彻底删除文件、清除回收站内删除的文件,以及清除驱动器未用磁盘空间,但不影响未删除的文件的工具软件,可以彻底清除以前删除文件的任何痕迹。

程序支持最高的Gutmann算法35次消除,同时还内置符合美国防部U.S. DOD 5220.22-M标准的U.S. DOD 5220.22-M(C and E)消除算法,可以彻底防止软件和硬件恢复的工具。

程序同时也内置防止软件恢复且速度快的Pseudorandom Data(伪随机数据覆盖)算法。另外软件允许用户自己定制消除算法。

>Wipe(wipe.sourceforge.net/)

卸载工具EZ Wipe V2.0是文件清理工具,可以用来删除档案文件。 只要鼠标点击就可以完成任务,功能也很强大,所有的被删除文件据说都不能复员。

>Evidence Nuker( www.EvidenceNuker.com)

据说可永久删除以下的电脑选项:Address Bar History、Browser Cache、Visited Sites History、Cookies、Autocomplete Data、Documents History、Recycle Bin、Run History、Search / Find Menu history、Windows Temp folder、Error Checking Temp、Click History、Clipboard,以及Media playerhistory。

>Zilla Data Nuker(zilla-data-nuker.en.softonic.com/ )

适用于视窗95、98、me、XP、NT3.x 、NT4.x版本,以及2000,据知能以不同的粉碎文件方式(例如:快速模式) 粉碎销毁硬盘驱动器里的任何敏感文件。

>File Shredder(www.fileshredder.org)

集免费的个人和商业用途于一体的软件,适合Windows NT 、 2000 、 XP、2003年的服务器和Vista平台 。可选择5种不同的碎纸法,也能扫除剩余磁盘空间。

另外,众多国内的软件如优化大师、瑞星、金山、上网助手等软件也都拥有文件粉碎功能,可尝试使用。

2、在Windows 2000以上版本都内置了一个这样的工具——cipher.exe。cipher使用方法很简单,在命令行窗口中,键入: cipher /w:盘符:\目录
其中,目录是可选的,用于卷挂接点。一般情况下,只写磁盘盘符就行了。比如清除E盘,就用“cipher /w:e”。
命令开始运行后,会依次用0X00、 0XFF和随意数字覆盖该分区中的全部空闲空间,能够消除任何已删除文件的痕迹。 此命令适用于NTFS格式的磁盘。cipher命令存在于Windows 2000、Windows XP、Windows 2003和Vista。

3、文件泄露的一个很主要的途径就是在电脑维修时发生的。一个比较可行也更实在的方法,是将电脑硬盘上锁。市面上一些笔记本电脑已经出现硬盘上锁功能,如联想的TVT (ThinkVantage Technology) 安全技术,就可以将电脑硬盘的资料上锁,包括指纹识别软件及IBM安全芯片系统,提供进阶的加密措施并方便管理,即使将电脑送去维修,也不怕资料被盗取 。利用每个人的指纹将电脑里的数据安全的锁在电脑里的保安方式最可靠。

阅读全文

与重写原理分析方法相关的资料

热点内容
艾米粒肾包的使用方法 浏览:667
小米5s关闭手势在哪里设置方法 浏览:963
清洗头皮的方法与技巧 浏览:166
百香果如何保鲜的方法 浏览:921
笔记本usb声音怎么设置在哪里设置方法 浏览:129
哪些修辞方法及作用 浏览:693
膀胱肌瘤的治疗方法 浏览:349
室内电线接头的安装方法 浏览:621
大话2伤害计算方法 浏览:982
平衡健身训练方法 浏览:747
什么是柳卡解题方法 浏览:202
电电脑版qq截图在哪里设置方法 浏览:808
手机壳的拉环去除方法 浏览:379
如何判断html的解密方法 浏览:917
电厂面试技巧和方法 浏览:156
线槽安装螺丝方法 浏览:707
安装工绩效考核的方法 浏览:721
宝宝膝盖囊肿怎么治疗方法 浏览:766
什么方法知道女友在哪里 浏览:567
舞蹈眼神的训练方法有哪些 浏览:702