当前位置: 首页 > 知识库问答 >
问题:

从抽象类继承

谭越
2023-03-14

继承一个可以实现的普通超类有什么不同吗?

atm我有一个名为abstractcar的抽象类,我有bigcar/smallcar扩展这个抽象类

public abstract class AbstractCar{
    private int capacity;
}

class BigCar extends AbstractCar{}

class SmallCar extends AbstractCar{}

abstractcar中的一个字段设置为"私有int容量"

但是在子类“小型汽车”中,当我输入“容量”作为构造函数中使用的变量时,它说“容量在抽象汽车中有私有访问”

我想:

>

子类继承超类的所有字段和方法?

我现在该怎么进行?

共有2个答案

桑睿识
2023-03-14

首先,抽象类和普通类有什么区别?你不能实例化一个抽象类,所以它是专门为Super类设计的。普通类可以随时实例化。

那是什么?继承意味着您可以将一个已设计类的所有数据成员和方法继承到另一个类中,并将其功能/行为作为单个实体加以利用。当继承Super类时,无论它是抽象类还是常规类,其所有数据成员和方法都按原样继承,这意味着将实现所有私有成员作为私有,保护成员作为保护成员,公共成员作为公共,并实现相同的访问机制。在这种情况下,要么必须在Super类中将数据成员声明为protective或public,以便直接从子类访问,要么必须在Super类中实现setter和getter方法,以便访问私有成员。

公冶嘉
2023-03-14

实例方法和字段由super类的派生类继承,但这并不意味着它们也可以访问。

super类中标记为private并由sub类继承的字段是sub类对象的一部分,但在sub类中无法对其进行修改

[非推荐解决方案]

实例字段应该总是声明为私有的。不这样做是不好的做法。但是为了理解我的观点,我提出以下三点,然后是推荐的方法。

您需要将该字段声明为非私有,以便子类可以访问它。

  1. 您可以声明超类中的字段是受保护的。受保护的字段可以在子类中访问。
  2. 如果子类和超类共享同一个包,那么就不能应用任何修饰符(默认包级别)。这将使子类可以访问该字段。
  3. 您可以将该字段声明为公共。在这种情况下,每个类都可以访问该字段。

[推荐解决方案]

添加一种在super类中设置字段的方法。如果字段是对象生命的一部分(基本字段),那么可以在超类中创建构造函数,否则可以使用setter方法并调用它们。

public abstract class AbstractCar{
    private int capacity;
    public AbstractCar(int capacity) {
        this.capacity = capacity;
    }
}

class BigCar extends AbstractCar{

    public BigCar() {
        super(6);
    }
}

class SmallCar extends AbstractCar{
    public SmallCar() {
        super(4);
    }
}

此外,还可以定义setter方法,并使用受保护的修饰符。可以调用这些setter方法来设置超类中的字段。

 类似资料:
  • 问题内容: 我可以以某种方式在抽象类上对一组注释进行分组,并且扩展该类的每个类都已自动分配了这些注释? 至少以下情况不起作用: 问题答案: 答案是不 除非注释类型具有@Inherited元注释,否则不会继承Java注释:https : //docs.oracle.com/javase/7/docs/api/java/lang/annotation/Inherited.html。 Spring的注释

  • 我能以某种方式将一组注释分组到一个抽象类上,并且每个扩展该类的类都自动分配了这些注释吗? 至少以下内容不起作用:

  • 我有一个抽象类,这个类是在她的子类中扩展的: < li >我在这个抽象类上实现了一个方法,并抽象了另一个方法 < li >实现的方法是每个子类对象都必须访问的通用方法。所以我决定在抽象类上实现它,避免在每个子类上实现相同的方法。 小例子: 我想听听你对这种实施方式的看法, 问候。

  • 问题内容: 我有六个类,它们都扩展了相同的抽象类。抽象类具有一个静态变量,该静态变量指向一些JNI代码,我只希望在每个类实例化时加载一次。 据我了解,这将导致实例化此静态变量的一个实例,但是我想要的是每个扩展类都具有自己的变量静态实例,该实例对于给定的子类是唯一的。我想在我的抽象类中编写一些代码来修改和/或释放该抽象类。是否可以同时执行这两项操作? 例如,我可以编写一个抽象类栏,其中包含变量foo

  • 问题内容: 通过使用抽象类,我们可以实现与接口相同的功能,那么为什么Java不允许以下代码? 我知道可以通过仅使用接口来实现多重继承,但是上面的代码与接口所做的事情相同。 问题答案: 不允许这样做,因为您可以对抽象类做更多的事情。允许多重继承是没有意义的,前提是您只在可以使用接口的情况下才使用抽象类。 仅将抽象类用于无法通过接口执行的操作会更简单,在这种情况下,您将无法使用两个抽象父类。 注意:使

  • 我目前正在尝试使用JaxB,但对于一个相对简单的示例,我并不是很成功。我的示例如下: 我所有的尝试(甚至编组)都失败了。我浏览了BlaiseDoughan的博客,包括http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-xsitype.html但他们似乎对我的例子都没有帮助。我很可能误用了他的例子。在我看来,我的示例应该是JaxB中