您的位置:首页 > 其它

这些继承知识你都知道吗?

2009-04-10 15:13 274 查看
本文最初发表在个人博客http://nijiaben058.jspkj.com,欢迎大家光临。
在这里我主要是想记录点继承的基础知识,当是一次小小的总结吧,以便自己将来查阅,也便于初学者学习,此文主要是以知识小结为主,不会详细阐述原理,当然我觉得有必要的还是会讲点的,下面从几个方面来说说哈。

1.子类继承父类哪些东西呢?

子类和父类在同一个包中:子类继承父类的public,protected,默认访问级别的成员变量和成员方法;

子类和父类不再同一包中:子类继承父类的public,protected访问级别的成员变量和成员方法;

2.什么叫方法的重载?
如果两个方法的方法名相同,但参数不一致,那么就可认为一个是另一个的重载方法。

3.重载方法要满足哪些条件呢?

方法名相同;(必需)

方法的返回类型可以不同;

方法的修饰符可以不同;

方法参数类型,顺序,个数至少有一个不同;(必需)

4.什么是方法覆盖?
子类定义一个方法,其名称,返回类型及参数签名正好与父类中某个方法,返回类型以及参数签名相匹配,那么就属于覆盖了。

5.方法覆盖要注意的事项?

Java编译器当碰到子类的一个方法名和父类的一方法名相同时,会先判断它们的参数签名,如果两者一致,那么编译器就认为子类想覆盖父类的方法,接下来分析它们的返回类型,要是该类型也相同,那么就说明是方法覆盖了,否则的话就是方法重载啦;

子类的方法不能缩小父类方法的访问权限,也就是说要是父类的一方法访问权限为protected,那么子类要是想覆盖父类的方法的话,其访问权限至少是protected,当然还可以是public,但是不能是private访问权限;

子类方法不能抛出比父类更多的异常,子类方法抛出的异常必须和父类方法抛出的异常相同,或者子类方法抛出异常是父类方法抛出的异常类的子类;

方法覆盖至存在于子类和父类之间,即不存在于同一个类中;

父类的静态方法不能被子类覆盖为非静态方法;

子类可以定义与父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法;

父类的非静态方法不能被子类覆盖为静态方法;

父类的私有方法不能被子类覆盖;

父类的抽象方法可以被子类通过两种方法:一是子类实现父类的抽象方法,而是子类重新声明父类的抽象方法;

父类的非抽象方法可以被覆盖为抽象方法;

6.子类隐藏父类的静态方法和子类覆盖父类的实例方法有什么区别呢?
运行时,Java虚拟机把静态方法和所属的类绑定,而把实例方法和所属的对象绑定。下面举个例子说明:

Java代码



public class Base{

void method(){

System.out.println("Method of Base");

}

public static void staticMethod(){

System.out.println("Static method of Base");

}

}

public class Sub extends Base{

public void method(){

System.out.println("Method of Sub");

}

public static void staticMethod(){

System.out.println("Static method of Sub");

}

}

public class Test{

public static void main(String args[]){

Base sub1=new Sub();

sub1.method();//打印method of sub

sub1.staticMethod();//打印Static method of Base;

Sub sub2=new Sub();

sub2.method();//打印method of sub

sub2.staticMethod();//打印Static method of Sub;

}

}

public class Base{
void method(){
System.out.println("Method of Base");
}
public static void staticMethod(){
System.out.println("Static method of Base");
}
}

public class Sub extends Base{
public void method(){
System.out.println("Method of Sub");
}
public static void staticMethod(){
System.out.println("Static method of Sub");
}
}

public class Test{
public static void main(String args[]){
Base sub1=new Sub();
sub1.method();//打印method of sub
sub1.staticMethod();//打印Static method of Base;

Sub sub2=new Sub();
sub2.method();//打印method of sub
sub2.staticMethod();//打印Static method of Sub;
}
}


7.只能在构造方法或实例方法内使用super关键字,而不能在静态方法和静态代码块中使用super关键字。

8.多态中常遇到的问题?

对于一个引用类型的变量,Java编译器按照它声明的类型来处理(编译时),例如:Base s=new Sub();在Base和Sub类中都有var属性,那么当我们访问s.var时它指的是Base类中的var变量值;

对于向下转型必须进行强制类型转换;例如:Base s=new Sub();(Sub)s;

对于一个引用类型的变量,运行时Java虚拟机按照它实际引用的对象来处理;

在运行时环境中,通过引用类型变量来访问所引用对象的方法和属性时,java虚拟机采用以下绑定规则: a.实例方法与引用变量实际引用的对象的方法绑定,这种绑定属于动态绑定,因为是在运行时有java虚拟机动态决定的;
b.静态方法与引用变量所声明的类型的方法绑定,这种绑定属于静态绑定,因为实际是在编译阶段已经做了绑定;
c.成员变量(包括静态变量和实例变量)与引用变量所声明的类型的成员变量绑定,这种绑定属于静态绑定,因为实际上是在编译阶段所做的绑定。

9.当一个系统使用一棵继承树上的类时,应该尽可能地把引用变量声明为继承树的上层类型,这样可以提高两个系统间的松耦合
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: