1. class A {
2. protected int method1(int a, int b) { return 0; }
3. }
Which two are valid in a class that extends class A? (Choose two)
A. public int method1(int a, int b) { return 0; }
B. private int method1(int a, int b) { return 0; }
C. private int method1(int a, long b) { return 0; }
D. public short method1(int a, int b) { return 0; }
E. static protected int method1(int a, int b) { return 0; }
我个人觉得选A与D
有人说A与C
有人帮我解释一下 谢谢了
2. protected int method1(int a, int b) { return 0; }
3. }
Which two are valid in a class that extends class A? (Choose two)
A. public int method1(int a, int b) { return 0; }
B. private int method1(int a, int b) { return 0; }
C. private int method1(int a, long b) { return 0; }
D. public short method1(int a, int b) { return 0; }
E. static protected int method1(int a, int b) { return 0; }
我个人觉得选A与D
有人说A与C
有人帮我解释一下 谢谢了
A是覆盖
C是重载
A是覆盖.
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。
应该是选择A与CA为覆盖父类的方法
C为重载子类的方法D应该为invalid的,因为重载方法不能根据返回类型来确定
E没有见过这种的,不知道为什么错的
B,应该是因为子类不能比父类范围小不知道是不是这样?!
A是覆盖。
C是重载。B:子类的可见权限不能比父类低。(可见权限从高到低为public, protected, private);
D:如果认为是覆盖的话,返回值不一样;如果认为是重载的话,参数又完全一样。这样是不行的。
E:静态方法和实例方法完全一样,也是不行的,静态方法不能够覆盖实例方法。假如子类叫AChild,在编译的时候会报错:
method1(int ,int) in AChild cannot override method1(int,int) in A; overriding method is static.
A覆盖,派生类访问权限要高于基类;
C重载,参数类型改变了;D重载只能根据参数的类型和个数来判断,返回值却不能成为重载的依据;
既然继承,方法的返回类型必须相同,所以D不对方法名,参数相同的是覆盖覆盖不能:
1.降低原方法的"可见度"
2.改变原方法的返回值类型
A是覆盖,且符合上面规则,所以A对
B(想成为覆盖),但是它降低了可见度,所以B不对
D,改变了返回值类型,所以D不对
重载
方法名相同,参数不同构成重载,
"可见度",返回类型不同都不能构成方法的重载C就是重载
重载,也就可以看做是在子类中比父类多了一个全新的方法
既然是全新的方法,不管在已经构成重载的方法中改变返回值类型,还是可见度,都成立
B. 子类的可见权限不能比父类低
C. 重载
D. 返回类型不同,编译器无法区分是哪个方法,所以不对。
E. 不知道
D的返回类型变了,这是不允许的,因为这既不是重载(要求函数的参数签名变化),又不是重写(要求函数签名相同)。
另外,子类中的函数如果重写父类的,可见性一定要大于等于父类函数的可见性。
C的函数是重载了class A中的函数,所以正确。public class A
{
protected int m(int a, int b){
System.out.println("A");
return 0;
} public static void main(String[] args)
{
A b = new B();
A a = new A();
a.m(1, 5);
b.m(1,5);
}
}class B extends A
{
public int m(int a, long b)
{
System.out.println("B");
return 0;
}
};打印结果为:
A
A可见两个对象对m的调用都是父类中的方法。
在实际编程中应该尽量避免这种写法。
2. protected int method1(int a, int b) { return 0; }
3. }
Which two are valid in a class that extends class A? (Choose two)
A. public int method1(int a, int b) { return 0; }
B. private int method1(int a, int b) { return 0; }
C. private int method1(int a, long b) { return 0; }
D. public short method1(int a, int b) { return 0; }
E. static protected int method1(int a, int b) { return 0; }
首先我们看修饰符 父类是protected
那么子类只能是默认或者public,因为子类如果是private的话,在多态的时候会引起问题
而编译的时候是可以通过的
例如c的情况下,假设父类是A 子类是B 那么不能使用 A a = new B();因为在使用a.method1(……)的时候有问题,所以bc排除 e很明显不对d,也不对,因为重载只能依据参数 而不能依据返回值。只选a完毕。
————————引用一下——————————首先
既然继承,方法的返回类型必须相同,所以D不对方法名,参数相同的是覆盖覆盖不能:
1.降低原方法的"可见度"
2.改变原方法的返回值类型
A是覆盖,且符合上面规则,所以A对
B(想成为覆盖),但是它降低了可见度,所以B不对
D,改变了返回值类型,所以D不对
重载
方法名相同,参数不同构成重载,
"可见度",返回类型不同都不能构成方法的重载C就是重载
重载,也就可以看做是在子类中比父类多了一个全新的方法
既然是全新的方法,不管在已经构成重载的方法中改变返回值类型,还是可见度,都成立----------------可是最后一段话错了————————————在java里面 如果重载的话,子类的方法不能比父类的方法的参数更“大”
比如父类是int 子类就不能是long 比如我们写
class A{
protected int a(int c){
return 0;} }
class B extends A{
int a(long c){
return 1;
}
public static void main(String args[]){
A a = new B();
System.out.println(a.a(1));//这里只能用a.a(1)而不能a.a(1l)}}
}还是在继承中的多态考虑才要求这一点的。