Java 隐藏和覆盖间的区别
在JAVA中所谓隐藏,是指运行时系统调用当前对象引用的编译时类型中定义的方法;也就是子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同
所谓覆盖,则指运行时系统调用当前对象引用运行时类型中定义的方法。也就是父类和子类拥有相同名字的属性或者方法时,父类的同名的属性或者方法形式上不见了,实际是还是存在的
两者的区别主要在于:
被隐藏的属性,在子类被强制转换成父类后,访问的是父类中的属性
被覆盖的方法,在子类被强制转换成父类后,调用的还是子类自身的方法
在使用隐藏和覆盖的时候主要注意以下几点:
一、父类的实例变量和类变量能被子类的同名变量隐藏。
二、父类的静态方法被子类的同名静态方法隐藏,父类的实例方法被子类的同名实例方法覆盖。
三、不能用子类的静态方法隐藏父类的实例方法,也不能用子类的实例方法覆盖父类的静态方法,否则编译器会异常。
四、用final关键字修饰的最终方法不能被覆盖。
五、变量只能被隐藏不会被覆盖,子类的实例变量可以隐藏父类的类变量,子类的类变量也可以隐藏父类的实例变量。
java中 什么叫隐藏
技术核心和实例前面已经给出,这里只是给出大家对这种现象的一个定义而已,马克-to-win:子类重新定义一个与父类那里继承来的域变量完全相同的变量,称为域的隐藏。
这里所谓隐藏是指子类拥有了两个相同名字的变量,一个继承自父类,另一个由自己定义。当子类执行父类的方法时,处理的是父类的变量,而当子类执行它自己定义的方法时,所操作的就是它自定义的变量,而把继承自父类的变量“隐藏”起来了。
上面说的是一般的情况,子类方法操作子类的变量。其实,也可以子类的方法通过super操作父类的成员变量。
下面的例子当中,就分新卡和老卡,this获取新卡的余额,super获取老卡的余额。
例1.4.1
class HealthCardM_t_w {
double balance = 90;
double getBalance() {
return this.balance;
}
}
class New_Card extends HealthCardM_t_w {
double balance; // 隐藏父类的balance
public New_Card(int in) {
balance = in;
}
double getOldBalanceInNew_Card() {
return super.balance;
}
double getOldBalanceByMythodInNew_Card() {
return super.getBalance();
}
double getThisBalanceInNew_Cardget() {
return this.balance;
}
}
public class Test {
public static void main(String args[]) {
JAVA程序中封装与隐藏是什么意思
隐藏就是封装吧。。。。
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装是一种信息隐藏技术,在java中通过关键字private实现封装。什么是封装?封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际
上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。
封装的简单例子:
先来个例子看看;
public class Man
{
//对属性的封装,一个人的姓名,年龄,妻子都是这个对象(人)的私有属性
private String name;
private int age;
private Woman wife;
//对改人对外界提供方法的封装,可以设定妻子,姓名,年龄也可以获得男人的姓名和年龄
public void setWife(Woman wife)
{
this.wife = wife;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
}
public class Woman
{
//属性封装
private String name;
private int age;
private Man husband;
//方法封装
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public Man getHusband()
{
return husband;
}
public void setHusband(Man husband)
{
this.husband = husband;
}
}
/**
* 仔细看就会发现,Man类没有提供getWife的方法,这是以为男人不想让自己的妻子被外界访问,
*
* 直接下来呢,就是封装可以吧一个对象的属性私有,而提供一些可以被外界访问的属性的方法,
*
* 比如说,name属性,Man和Woman类都有相应的get和set方法,外界都可以通过这些方法访问和修改
*
* 同时对一些改对象不想让外界访问的属性,就不提供其方法,比如说Man的wife属性,就没有get方法
*
* 外界是不能带到Man类的wife属性的
*
*/
上面那例子可能没有突出封装的好处,下面来个超简单的表达下:
public class Show
{
public static void show(String str)
{
System.out.println(str);
}
}
上面就是对 System.out.println();的封装。
调用的时候 :
public class Use
{
public static void main(String[] args)
{
Show.show(“封装”);
}
}
这样用的时候就不用使:System.out.println(“封装”);
方法隐藏和方法覆盖的区别和用法
属性的隐藏是指实例变量和方法内部变量相同时,实例变量在该方法内会被隐藏,比如你在方法内直接输出变量,前面不加this,那么只会输出方法内那个变量的值。
方法的覆盖是指子类继承父类时,对父类的方法进行重写,要求返回类型,参数都要与父类一致,当然返回类型可以返回原来返回类型的子类。
一个是对变量而言一个是对方法而言,对于变量,你在方法内可以是任何的类型,和实例变量的类型没有关系。
小弟不才,学java一段时间了,从来没有看到过属性的隐藏会出现在继承中。在继承时,子类中出现与父类相同的属性时,那个属性和父类中的属性没有关系,如果父类中的属性可以被子类继承,子类自然继承了那个属性,出现属性名字相同时,那只是只类的一个自己的属性而已。在子类中用super当然能区别是那个属性,这没有什么奇怪的,继承的一个特点而已。
除了静态变量外,你要访问属性得要有实例对象,你在一个类中同时初始化父类对象和子类对象,他们互不影响,除非你用多态的方式调用,就算用多态调用,使用的属性也只会是父类的属性!调用的方法则是子类重写的方法!
java中 什么是隐藏?什么是重写?二者有何区别?
隐藏是指当父类和子类有相同名字的属性的时候,父类的同名变量形式上不可见了。但是实际还是存在的。
譬如A有int变量a = 10,父类B有变量a = 5;
当B b = new A()得时候,若用b.a 那么父类的5就被隐藏了,此时b.a = 子类的10。在子类里面访问super.a得时候只能得到子类的值
重写是针对方法的,通常是父类的方法在子类中重新写过。当执行子类的实例得时候,实际运行的是子类的方法。在子类里面可以通过super.method()来显式的访问。