Tag: inheritance

java中类的内存分配?

B类inheritance了A类。现在当我们创建一个B类型的对象时,为B分配的内存是多少? 是包括A和B,还是内存分配的任何其他程序?

这个Javagenerics范例做了什么以及它叫做什么?

我正在看一些具有以下forms的Java类: public abstract class A <E extends A> implements Comparable { public final int compareTo( E other ) { // etc } } public class B extends A { // etc } public class C extends A { // etc } 我在这里使用“可比较”只是为了说明通用参数“E”的可能用途。 generics/inheritance的这种用法是否有名称? 它是干什么用的? 我的印象是,这允许抽象类提供方法的通用实现(例如compareTo),而不必在子类中提供它。 但是,在此示例中,与inheritance方法不同,它会限制子类在同一子类的其他实例上调用compareTo,而不是任何“A”子类。 这听起来不错吗? 无论如何,只是好奇,如果有任何大师之前已经看过这个,并知道它做了什么。 谢谢!

Javainheritance – 请解释一下

class A { public void talk(){ this.sayIt(); } private void sayIt(){ System.out.println(“class A says…”); } } class B extends A { private void sayIt(){ System.out.println(“class B says…”); } } 测试类,主要方法: B b = new B(); b.talk() //output class A says… 从那以后我无法得到这个: B类inheritance自A类 ,即公共成员,无法查看/inheritance私有函数。 所以在B组中 ,我们可以调用talk() 。 //因为它是由父类inheritance的。 现在,在talk()方法中,调用sayIt(),因为sayIt()是在B类中定义的, 我希望在执行this.sayIt()时调用B.sayIt() 。 “这个”不是指B级吗? 请解释。

Java – 具有相同方法的不同对象的数组

我正在练习inheritance。 我有两个类似的类,我想要同化为一个数组,所以我想使用Object类作为超类,因为所有东西都是Object的子级。 所以,例如我将T类和CT类放入一个名为all的数组中: Object all[] = new Object[6]; all[0] = T1; all[1] = CT2; all[2] =T3; all[3] = CT1; all[4] = T2; all[5] = CT3; 我跳过了声明,因为那不是我的问题。 当我希望使用循环调用数组中的函数时,我的真正问题就变成了: for (int i = 0; i < 6; i++) { all[i].beingShot(randomNum, randomNum, AK47.getAccuracy()); } 分别涉及T和CT的类都有areShot方法,这是公开的。 Eclipse建议将它们作为快速修复。 我想知道除了创建我自己的持有beingShot方法的Object类,或者将其添加到Object类之外是否有任何逻辑替代方法,尽管我觉得这些选择中的任何一个都会在长期内导致更多问题。 谢谢!

为什么从构造函数调用Set方法不是一个好主意?

仅在inheritance或大多数情况下是真的吗? public class MyClass { public int id; public MyClass() { // Some stuff setId(5); } public setId(int id) { this.id = id; } }

Java:为什么反序列化不会调用构造函数以及什么是最佳解决方法?

Java 1.5的Java序列化规范说: 对于可序列化对象,运行第一个非可序列化超类型的no-arg构造函数。 对于可序列化的类,字段将初始化为适合其类型的默认值。 然后通过调用类特定的readObject方法来恢复每个类的字段,或者如果未定义这些方法,则通过调用defaultReadObject方法来恢复。 请注意,在反序列化期间,不会对可序列化类执行字段初始值设定项和构造函数。 但是,这意味着如果我们在类中放置一个静态变量(例如计数器变量),它将不会像通常那样更新: class Foo { static int t; public Foo() { t++; } } public class Bar extends Foo implements Serializable { static int t; public Bar() { t++; } } 在这种情况下,如果反序列化了一个Bar实例,那么Foo的计数器是正确的, Bar的计数器是一个一个。 我想知道为什么反序列化不会调用构造函数? 由于看起来虽然这会在速度上获得一点点,但它可能会导致潜在的问题。 编译器可以很容易地设计为生成一个“静态构造函数”,它只更新将要更新的静态变量,并且在加载类时不依赖于外部信息。 另外,我想知道避免这种情况的最佳方法是什么? 我能想到的解决方案是使用静态变量上的操作打包反序列化。 感谢提前输入!

从抽象类inheritance静态变量

我有六个类,它们都扩展了相同的抽象类。 抽象类有一个静态变量,指向一些JNI代码,我只想在每个类的实例化时加载一次。 根据我的理解,这导致实例化这个静态变量的一个实例,但我想要的是每个扩展类都有自己的变量的静态实例,该实例对于给定的子类是唯一的。 我想在我的抽象类中编写一些代码来修改和/或释放抽象类。 是否有可能同时做这两件事? 因此,作为一个例子,我可以编写一个带有变量foo的抽象类栏和一个打印foo内容的printFoo方法。 然后我按顺序实例化fooBar1,fooBar2和fooBar3,每个扩展bar类并将foo初始化为静态块中的不同值。 如果我调用foobar1.printFoo我想打印由fooBar1构造函数初始化的foo的静态值。 这可以在java中完成吗?

关于@ ForceDiscriminator / @ DiscriminatorOptions(force = true)的使用

为什么在某些inheritance和多态关联的情况下, @ForceDiscriminator或其等效的@DiscriminatorOptions(force=true)必需的? 这似乎是完成工作的唯一方法。 有没有理由不使用它?

Java中的多重inheritance所有类都是从Object类扩展的?

我有一个简单的问题: 如果我声明一个类A – 意味着该类隐式inheritance自Object Class。 现在如果B类inheritance自A类 这个B类也不是从Object类inheritance吗? 如果是,这是否意味着编写关键字’extends’一些如何覆盖隐式inheritance(来自类Object)?

为什么实现类不能将覆盖方法定义为静态?

我很困惑为什么不允许以下内容: public interface MyInterface { MyInterface getInstance(String name); } public class MyImplementation implements MyInterface { public MyImplementation(String name) { } @Override public static MyInterface getInstance(String name) { // static is not allowed here return new MyImplementation(name) } } 我理解为什么接口中的方法不能是静态的,但为什么不能覆盖这个方法呢? 我希望所有类都实现getInstance(String name)方法,但是我目前仅限于只有在对象已经被实例化时才能调用该方法哪种方法失败了… *更新: *感谢您的回答,我现在明白了。 基本上我不应该试图使实用程序类(或工厂类)实现一个接口(或至少,不是这样)…