首页 > 试题广场 >

下列对继承的说法,正确的是( )

[单选题]

在java中,下列对继承的说法,正确的是( )

  • 子类能继承父类的所有成员
  • 子类继承父类的非私有方法和状态
  • 子类只能继承父类的public方法和状态
  • 子类只能继承父类的方法

使用反射可以看出子类是继承了父类的私有方法的(不管是否是final),只是直接调用父类的私有方法是不可以的,但是利用反射的方式可以调用。字段同理。

package work.litao;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Method;
class Parent{
    Parent() {
        System.out.println("调用父类构造方法!");
    }
    private static void staticParent() {
        System.out.println("调用父类静态方法");
    }
    private final  void finalParent() {
        System.out.println("调用父类final方法");
    }
    private void printParent(){
        System.out.println("调用父类私有方法");
    }
}
class Child extends Parent {
    public void printChild(){
        System.out.println("调用子类公有方法");
    }
}
public class Test {
    public static void main(String[] args) throws Exception {
        //获取子类
        Class clazz = Class.forName("work.litao.Child");
        //得到父类
        Class superClass = clazz.getSuperclass();
        //得到父类非继承的所以方法
        Method[] methods = superClass.getDeclaredMethods();
        //设置私有方法可以被访问
        AccessibleObject.setAccessible(methods,true);
        for (Method m:methods) {
            System.out.println();
            System.out.println("子类调用方法"+m.getName()+"()的调用结果:" );
            m.invoke(new Child());
        }

    }
}

运行结果:



A subclass inherits all the members (fields, methods, and nested classes) from its superclass. Constructors are not members, so they are not inherited by subclasses, but the constructor of the superclass can be invoked from the subclass.   [子类从其父类继承所有成员(字段,方法和嵌套类)。 构造函数不是成员,所以它们不被子类继承,但是可以从子类调用超类的构造函数。]


编辑于 2017-08-31 15:52:59 回复(42)
其实private方法是可以继承的,只是不能调用
发表于 2017-07-09 12:27:59 回复(8)
在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象。所以所谓的继承使子类拥有父类所有的属性和方法其实可以这样理解,子类对象确实拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有,但不能使用。就像有些东西你可能拥有,但是你并不能使用。所以子类对象是绝对大于父类对象的,所谓的子类对象只能继承父类非私有的属性及方法的说法是错误的。可以继承,只是无法访问到而已。
发表于 2017-07-09 10:10:42 回复(8)
选A

我们有时候会分不清继承和访问权限的问题。子类可以继承父类所有的成员,但是对private这样的,没有访问权。
发表于 2018-06-28 09:33:47 回复(0)
B选项应该有问题,不在同一个包下的子类不能继承父类的默认修饰符修饰的方法
发表于 2017-06-01 22:21:36 回复(4)
Java语言规范(JLS)中是这么说的:
Members of a class that are declared private are not inherited by subclasses of that class. Only members of a class that are declared protected or public are inherited by subclasses declared in a package other than the one in which the class is declared.(https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2)

被声明为私有的类的成员不由该类的子类继承。
只有被声明为受保护或公开的类的成员才由在声明类的包中声明的子类继承。
构造函数,静态初始化器,以及实例的初始化不是成员,所以不能被继承。


发表于 2018-05-24 19:18:02 回复(2)
子类可以继承父类所有成员,只是对某些成员具有访问权限
发表于 2018-06-03 19:35:12 回复(0)
个人感觉这道题应该有问题。
我的理解是这样的:
1:如果父类中的成员使用public修饰,子类无条件继承。
2:如果父类中的成员使用protected修饰,子类也继承,即使父类和子类不在同一个包中。
3:如果父类和子类在同一个包中,此时子类可以继承父类中 缺省修饰符的成员。
4:如果父类中的成员使用private修饰,子类打死也都继承不到。private只能在本类中访问。
5:父类的构造器,子类也不能继承,因为构造器必须和当前的类名相同。
6:父类的方法使用final修饰,子类可以继承,但不可重写
7:如果一个类使用final修饰,则不可以继承
发表于 2019-04-16 22:48:29 回复(0)
子类可以继承父类的一切,但是并不一定可以调用,比如private不能调用,final可以被继承,但是不能被修改,若父子类不在同一个包里面,default修饰的也不能没调用,但是可以被继承
发表于 2017-07-16 18:42:59 回复(3)

从继承的概念来说: private和final不被继承。Java官方文档上是这么说的。
从内存的角度来说: 父类的一切都被继承(从父类构造方法被调用就知道了,因为new一个对象,就会调用构造方法,子类被new的时候就会调用父类的构造方法,所以从内存的角度来说,子类拥有一个完整的父类)。子类对象所引用的内存有父类变量的一份拷贝.

发表于 2017-11-15 16:58:55 回复(1)
这题是有点问题的。根据 oracle的java语言规范
Members of a class that are declared private are not inherited by subclasses of that class.

Only members of a class that are declared protected or public are inherited by subclasses declared in a package other than the one in which the class is declared.

Constructors, static initializers, and instance initializers are not members and therefore are not inherited.

更多关于继承可以参考我的这篇继承博文,希望指正

编辑于 2017-08-28 16:45:20 回复(0)

关于构造,子类从其父类继承所有成员(字段,方法和嵌套类)。 构造函数不是成员,所以它们不被子类继承,但是可以从子类调用超类的构造函数。
发表于 2017-09-10 12:02:56 回复(0)
这道题纯扯淡,题库里不是还有一道题是说父类的构造方法不能被继承的么
发表于 2017-08-21 11:21:22 回复(5)
使用反射可以看出子类是继承了父类的私有方法的(不管是否是final),只是直接调用父类的私有方法是不可以的,但是利用反射的方式可以调用。字段同理。谨记Q
子类可以继承父类所有的方法和状态,但是父类中的私有方法是不能直接调用的,但是吧利用反射还是可以调用的,获取父类再调用呗。。
发表于 2017-08-06 21:28:27 回复(0)
原来如此,确定可以继承,但继承后不能调用。所以本题选A。
发表于 2021-12-05 14:43:44 回复(1)
子类可以继承父类的所有成员,包括属性,方法,以及嵌套类。但是构造函数不属于父类的成员,因此构造函数不会被子类继承,但是所有父类的构造函数可以在子类中被调用!
发表于 2021-02-07 10:02:42 回复(0)
private修饰的是不能继承的,Oracle官网有这么一句话
Members of a class that are declared private are not inherited by subclasses of that class
发表于 2018-04-09 12:37:10 回复(0)
子类可以继承父类的所有成员,只是无法访问罢了
发表于 2022-03-06 21:54:34 回复(0)
这题目***!前后矛盾
发表于 2021-05-31 11:11:38 回复(0)
我吐了,一会儿说构造方法不继承,一会儿说全部继承,到底咋样
发表于 2021-01-24 02:40:20 回复(1)