1.子类继承父类哪些东西呢?
- 子类和父类在同一个包中:子类继承父类的public,protected,默认访问级别的成员变量和成员方法;
- 子类和父类不再同一包中:子类继承父类的public,protected访问级别的成员变量和成员方法;
如果两个方法的方法名相同,但参数不一致,那么就可认为一个是另一个的重载方法。
3.重载方法要满足哪些条件呢?
- 方法名相同;(必需)
- 方法的返回类型可以不同;
- 方法的修饰符可以不同;
- 方法参数类型,顺序,个数至少有一个不同;(必需)
子类定义一个方法,其名称,返回类型及参数签名正好与父类中某个方法,返回类型以及参数签名相匹配,那么就属于覆盖了。
5.方法覆盖要注意的事项?
- Java编译器当碰到子类的一个方法名和父类的一方法名相同时,会先判断它们的参数签名,如果两者一致,那么编译器就认为子类想覆盖父类的方法,接下来分析它们的返回类型,要是该类型也相同,那么就说明是方法覆盖了,否则的话就是方法重载啦;
- 子类的方法不能缩小父类方法的访问权限,也就是说要是父类的一方法访问权限为protected,那么子类要是想覆盖父类的方法的话,其访问权限至少是protected,当然还可以是public,但是不能是private访问权限;
- 子类方法不能抛出比父类更多的异常,子类方法抛出的异常必须和父类方法抛出的异常相同,或者子类方法抛出异常是父类方法抛出的异常类的子类;
- 方法覆盖至存在于子类和父类之间,即不存在于同一个类中;
- 父类的静态方法不能被子类覆盖为非静态方法;
- 子类可以定义与父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法;
- 父类的非静态方法不能被子类覆盖为静态方法;
- 父类的私有方法不能被子类覆盖;
- 父类的抽象方法可以被子类通过两种方法:一是子类实现父类的抽象方法,而是子类重新声明父类的抽象方法;
- 父类的非抽象方法可以被覆盖为抽象方法;
运行时,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.成员变量(包括静态变量和实例变量)与引用变量所声明的类型的成员变量绑定,这种绑定属于静态绑定,因为实际上是在编译阶段所做的绑定。