导航:首页 > 编程语言 > java隐藏与覆盖

java隐藏与覆盖

发布时间:2023-01-30 06:17:25

‘壹’ java的覆盖重写隐藏和C#中的不同

区别如下:
1)重写:C#用override关键字重写父类同名且被virtual或abstract关键字修饰的方法。而JAVA则不必。
2)隐藏:C#可以用new关键字隐藏父类的同名方法,而JAVA则不存在这个概念。

‘贰’ Java语言中隐藏,覆盖,重载的含义!

多态性
通过继承,一个类可以用作多种类型:可以用作它自己的类型、任何基类型,或者在实现接口时用作任何接口类型。这称为多态性

重载
每个类型成员都有一个唯一的签名。方法签名由方法名称和一个参数列表(方法的参数的顺序和类型)组成。只要签名不同,就可以在一种类型内定义具有相同名称的多种方法。当定义两种或多种具有相同名称的方法时,就称作重载。即重载时相同名称成员的参数列表是不相同的(参数顺序和类型)。

继承,重写和隐藏成员
派生的类型继承其基本类型的所有成员;也就是说,这些成员是在派生类型之上定义的,并可用于派生类型。继承成员的行为和质量可以通过以下两种方式来修改:

1、派生类型可通过使用相同的签名定义一个新成员,从而隐藏继承的成员。将先前的公共成员变成私有成员,或者为标记为 final 的继承方法定义新行为时,可以采取这种方法。

2、派生类型可以重写继承的虚方法。重写方法提供了对方法的一种新定义,将根据运行时的值的类型,而不是编译时已知的变量类型来调用方法。只有当虚方法没有标记为 final 且新方法至少可以像虚方法一样进行访问的情况下,成员才能重写虚方法。
方法名,参数相同形成重写,重写的方法不能降低原方法的"可见度",也不能改变原方法的返回值类型。

方法名相同,参数不同(个数、类型)形成重载,重载的方法可看成一个全新的方法,与原方法相比它可以有不同的"可见度"和“返回值类型”。如下例:

class A {
protected int method1(int a, int b) { return 0; }
}
public class B extends A{
public int method1(int a, int b) { return 0; } //正确,重写父类方法,可以扩大访问权限
//private int method1(int a, int b) { return 0; } //错误,重写父类方法,不能降低了访问权限
//private long method1(int a, int b) { return 0; } //错误,重写父类方法,不能改变返回值类型
public short method1(int a, long b) { return 0; }//正确,重载自身的方法,可以有不同的访问权限和返回值类型
private int method1(int a, long b) { return 0; }//正确,重载自身的方法,可以有不同的访问权限和返回值类型
}

但这里 方法public short method1(int a, long b) { return 0; }和 方法private int method1(int a, long b) { return 0; }不能同时存在,因为在同一类中,不允许存在相同名字和参数类型的方法(重写的方法)。

override可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。在覆盖要注意以下的几点:
1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;
2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
overload对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行。在使用重载要注意以下的几点:
1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为fun(int,int));
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;
4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。
下面是对override和overload的测试程序,其中注释中的内容都是会产生编译错误的代码,我们将注释去掉,看看在编译时会产生什么效果。
//对overload测试的文件:OverloadTest.java
publicnewOverrideTest1();
try{
test.fun();
test.fun1();
}catch(Exceptione){}
}
}

{
//以下正常Override
publicvoidfun()throwsTestException2{
System.out.println("funinOverrideTest1");
}

//不能Override父类中的方法,因为它定义了不同的异常类型和
//返回值。
//publicintfun()throwsTestException1{
//System.out.println("methodfuninTest");
//return1;
//}

//不能Override父类中的方法,因为它抛出了比父类中非法范围
//更大的异常。
//publicvoidfun()throwsException{
//System.out.println("funinOverrideTest1");
//}

//这个方法并没有Override父类中的fun1方法,因为这个方法在
//父类是private类型,所以这里只是相当于定义了一个新方法。
publicvoidfun1(){
System.out.println("methodfun1inTest");
}
}

{
publicTestException(Stringmsg){
super(msg);
}
}

{
publicTestException1(Stringmsg){
super(msg);
}
}

{
publicTestException2(Stringmsg){
super(msg);
}

‘叁’ JAVA方法的覆盖与域的隐藏有何不同

方法的覆盖出现在父类与子类之间,若子类中定义的某个方法特征与父类中定义的某个方法特征完全一样,那么就说子类中的这个方法覆盖了父类中的相应的那个方法。
父类中定义了:public
void
todo(String
str);
子类也定义了:public
void
todo(String
str);
则子类的todo方法覆盖了父类的todo方法!!
域的隐藏,你是指private么,私有的变量、方法只能在自己家里调用,儿子老爹都不能用,其他人更不能用。
class
A
{
private
int
num;
//num只能在A里面用,例如:num
=
num
+
1;
}
class
B
{
//num不能在这里用:a.num
=
a.num
+
1;
}

‘肆’ 方法隐藏和方法覆盖的区别和用法

属性的隐藏是指实例变量和方法内部变量相同时,实例变量在该方法内会被隐藏,比如你在方法内直接输出变量,前面不加this,那么只会输出方法内那个变量的值。
方法的覆盖是指子类继承父类时,对父类的方法进行重写,要求返回类型,参数都要与父类一致,当然返回类型可以返回原来返回类型的子类。
一个是对变量而言一个是对方法而言,对于变量,你在方法内可以是任何的类型,和实例变量的类型没有关系。

小弟不才,学java一段时间了,从来没有看到过属性的隐藏会出现在继承中。在继承时,子类中出现与父类相同的属性时,那个属性和父类中的属性没有关系,如果父类中的属性可以被子类继承,子类自然继承了那个属性,出现属性名字相同时,那只是只类的一个自己的属性而已。在子类中用super当然能区别是那个属性,这没有什么奇怪的,继承的一个特点而已。
除了静态变量外,你要访问属性得要有实例对象,你在一个类中同时初始化父类对象和子类对象,他们互不影响,除非你用多态的方式调用,就算用多态调用,使用的属性也只会是父类的属性!调用的方法则是子类重写的方法!

‘伍’ 如何理解Java中的隐藏与覆盖

隐藏与覆盖类方法
在讲清这个问题之前,先明白什么是隐藏?什么是覆盖?
所谓隐藏,是指运行时系统调用当前对象引用的编译时类型中定义的方法;对于覆盖,则指运行时系统调用当前对象引用运行时类型中定义的方法。
所以在执行Student1
s
=
new
Graate1();和Graate1
g
=
new
Graate1();时,(1)先进行Student1类的构造,这里包括两个方法study()和exercise(),由于study()方法被覆盖,所以先执行Graate1里study(),再执行Student1里的exercise();(2)再进行Graate1类的构造,同样包括两个方法study()和exercise(),所以执行顺序为先Graate1里的study()方法,再Graate1里的exercise()方法。
2.
隐藏与覆盖成员变量
如果子类中的变量和父类中的变量具有相同的名字,那么子类中的变量就会隐藏父类中的变量,不管他们的类型是什么,也不管他们是类变量还是实例变量。
所以在执行诸如System.out.print(s.math);之类的s实例的程序时,显示为Student1类的成员变量,而执行诸如System.out.print(g.math);之类的g实例的程序时,显示为Graate1类的成员变量。

‘陆’ java中重载,覆盖和隐藏的区别

重载是发生在同一个类中,许多名称相同而签名不同或返回类型不同的方法。签名指的是方法的参数类型,参数个数等。比如在某个类中,有一个CreateStudent(int no,string name) 方法。现在我再写一个包含三个参数,名称也叫CreateStudent的方法CreateStudent(int no,string name,string sex)那么我现在写的这个方法(三个参数)就是刚刚那个方法(两个参数)的重载。当然不一定非得参数个数不同,参数类型不同或者返回类型不同也都是可以的,但是名称必须相同。

而覆盖,又叫重写,是发生在子类中,来覆盖(重写)父类的方法。注意子类中的方法名称和签名跟父类是一模一样的,返回值也与父类相同或是父类的子类。比如我现在有一个类B继承父类A。Class B extends A 在A类中有一个方法int Math(int a,int b){return a+b;} 现在我在子类B中也写一个跟父类A返回类型、名称、签名都一样的方法 int Math(int a,int b){return a-b;} 现在我创建一个B的实例 B b = new B(); 调用Math方法 b.Math,此时b调用的方法是 子类中的a-b 而不是父类中的a+b 因为子类的方法把父类覆盖了。换句话说也就是子类重写了父类的 int Math方法。

‘柒’ java的覆盖和隐藏的区别

一个被覆盖,那么另一个就被隐藏

‘捌’ JAVA成员变量隐藏和方法的覆盖

从入口程序main开始看,第一句话是
Subclass Subc=new Subclass();
其作用是实例化Subclass类的一个实例出来,使用的构造函数是无参构造函数。

现在转向看Subclass类,在这个类的无参数构造函数中代码如下:
Subclass(){
super();//A
x=5;//B
System.out.println("in Subclass:x="+x);//②
}
可以看得见第一句使用的是super()方法,起作用是继承父类Superclass的构造方法:
Superclass(){
x=3;
System.out.println("in Superclass:x="+x);//①
}
也就是说Subclass()方法代码内容是如下的内容:
Subclass(){
x=3;
System.out.println("in Superclass:x="+x);//①
x=5;//B
System.out.println("in Subclass:x="+x);//②
}

所以现在这里有两个输出语句,结果如下:
in Superclass:x=3
in Subclass:x=5

现在返回入口程序main()方法,开始执行该方法中的第二句话:
Subc.dosomething();
这句话的作用是执行Subclass类中的dosomething方法,所以我们查看Subclass类的方法void dosomething()内容如下:

super.dosomething();
System.out.println("in Subclass.dosomething()");
System.out.println("super.x="+super.x+"\tsub.x="+x);

可以看到,第一句话super.dosomething();是继承父类的dosomething()方法,用父类的这个方法内容替换掉这句话,void dosomething()内容如下:

System.out.println("in Superclass.dosomething()");//③
System.out.println("in Subclass.dosomething()");//④
System.out.println("super.x="+super.x+"\tsub.x="+x);//⑤

所以这里就是连续输出三句话:
in Superclass.dosomething()
in Subclass.dosomething()
super.x=3 sub.x=5

一定要知道super的作用,super()就是使用父类的构造函数,super.属性/s uper.方法,就是使用父类属性/方法。

‘玖’ JAVA多态中的隐藏和覆盖

Java的引用变量有两个类型,一个是编译时类型,一个是运行时类型
编译时类型:由声明该变量时使用的类型决定
运行时类型:由该变量指向的对象类型决定
如果编译时类型和运行时类型不一致,会出现所谓的多态。因为子类其实是一种特殊的父类,因此java允许把一个子类对象直接赋值给一个父类引用变量,无须任何类型转换,或者被称为向上转型,由系统自动完成。
如 Father f = new Son(); Son是Father的子类
引用变量f就会出现编译时类型和运行时类型不一致的情况 编译时是Father类型的 运行时是Son类型的
当变量的编译时类型和运行时类型不一致时,通过变量访问它所引用的对象的实例时,该实例变量的值由声明该变量的类型决定。
通过变量访问它所引用的对象的方法时,该方法的行为由所引用的对象实际类型所决定。

‘拾’ 有关java中覆盖和隐藏的问题

隐藏一般是对静态的属性和方法来说的。
你看一下下面的这段代码:
class
planet
{
public
static
void
hide()
{
system.out.println("the
hide
method
in
planet.");
}
public
void
override()
{
system.out.println("the
overrid
method
in
planet.");
}
};
public
class
earth
extends
planet
{
public
static
void
hide()
{
system.out.println("the
hide
method
in
earth.");
}
public
void
override()
{
system.out.println("the
override
method
in
earth.");
}
public
static
void
main(string[]
args)
{
earth
myearth
=
new
earth();
planet
myplanet
=
(planet)
myearth;
myplanet.hide();
myplanet.override();
}
}
覆盖就是子类的方法跟父类的方法具有完全一样的签名和参数。我们看到上面那两个类,父类的override在子类中重写了,因为有跟父类有相同的签名和参数,所以叫做覆盖,但是hide方法,因为是静态的,所以在这里叫做隐藏。

阅读全文

与java隐藏与覆盖相关的资料

热点内容
苹果平板如何开启隐私单个app 浏览:704
空调压缩机一开就停止 浏览:528
如何下载虎牙app 浏览:847
日语年号的算法 浏览:955
dev里面的编译日志咋调出来 浏览:298
php函数引用返回 浏览:816
文件夹和文件夹的创建 浏览:259
香港加密货币牌照 浏览:838
程序员鼓励自己的代码 浏览:393
计算机网络原理pdf 浏览:752
吃鸡国际体验服为什么服务器繁忙 浏览:94
php中sleep 浏览:490
vr怎么看视频算法 浏览:86
手机app如何申报个人所得税零申报 浏览:694
如何截获手机app连接的ip 浏览:331
冰箱压缩机是否需要电容 浏览:346
python列表每一行数据求和 浏览:275
自己有一台服务器可以玩什么 浏览:657
社会学波普诺pdf 浏览:584
解压做食物的小视频 浏览:760