Tag: inheritance

Javainheritance与多态

inheritance和多态是否构成IS-A关系? 并且在运行时发生inheritance和“重写”多态是真的,而在编译时发生“重载”多态吗? 我问这个的原因是因为许多论坛似乎给出了相互矛盾且经常令人困惑的答案。 谢谢!

如何在Java中实现抽象的单例类?

这是我的示例抽象单例类: public abstract class A { protected static A instance; public static A getInstance() { return instance; } //…rest of my abstract methods… } 以下是具体实施: public class B extends A { private B() { } static { instance = new B(); } //…implementations of my abstract methods… } 不幸的是我无法在B类中获取静态代码来执行,因此实例变量永远不会被设置。 我试过这个: Class c = B.class; A.getInstance() […]

Java – 内联类定义

我在Java中看到过几个类似的例子,我希望有人可以解释发生了什么。 看起来像一个新类可以内联定义,这对我来说似乎很奇怪。 第一个打印输出行是预期的,因为它只是toString。 然而第二个看起来像函数可以重写内联。 这有技术术语吗? 或者任何更深入的文档? 谢谢! 如果我有以下代码: public class Apple { public String toString() { return “original apple”; } } public class Driver { public static void main(String[] args) { System.out.println(“first: ” + new Apple()); System.out.println(“second: ” + new Apple() { public String toString() { return “modified apple”; } } ); } } 代码输出: […]

方法链接:如何在多级inheritance的情况下使用getThis()技巧

我的问题是在方法链接+inheritance的背景下不能很好地发挥作用? 。 但不幸的是,方法链的所有示例/答案都使用单级inheritance。 我的用例涉及多级inheritance,例如 abstract class PetBuilder{…} class DogBuilder extends PetBuilder{..} class DogType1Builder extends DogBuilder {…} 要构造一个Dog Object,我将使用DogBuilder或DogType1Builder 如何使用getThis技巧用于上述用例? 我想使用构建器模式来构造一个复杂的Dog对象(Dog Object Model) 。“DogType1将有一些添加的属性。 所以使用getThis Trick声明上面的类会变得像 abstract class PetBuilder<T extends PetBuilder> class DogBuilder<T extends DogBuilder> extends PetBuilder<DogBuilder> class DogType1Builder extends DogBuilder 现在这会产生两个问题 ‘DogBuilder’中的1.builder方法看起来像 public T someMethodInDog(String dogName) { .. return (T)this; ///i dont want type casting […]

在不使用final的情况下停止inheritance

除了将其声明为final或者将其构造函数声明为private之外,还有其他方法可以阻止类的inheritance吗?

构造函数中的多态方法(Java)

A类在构造函数中调用公共方法f() 。 B类用自己的实现覆盖方法f() 。 假设您实例化对象B ..对象B方法f()将在对象A的构造函数中调用,尽管对象B未完全初始化。 谁能解释这种行为? 编辑:是的,它不推荐练习..但我不明白为什么 Java没有调用基类A的f()实现而不是“伸出”到派生类B的f()实现。 码: class A { A() { System.out.println(“A: constructor”); f(); } public void f() { System.out.println(“A: f()”); } } class B extends A { int x = 10; B() { System.out.println(“B: constructor”); } @Override public void f() { System.out.println(“B: f()”); this.x++; System.out.println(“B: x = ” + x); […]

为什么@OneToMany在Hibernate中不能inheritance

@Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) public class Problem { @ManyToOne private Person person; } @Entity @DiscriminatorValue(“UP”) public class UglyProblem extends Problem {} @Entity public class Person { @OneToMany(mappedBy=”person”) private List problems; } 我觉得很清楚我想做什么。 我希望@ManyToOne人能够被UglyProblem类inheritance。 但是会有例外情况说:“UglyProblem类中没有找到这样的属性(mappedBy =”person“)”。 我发现的就是这个 。 我无法找到Emmanuel Bernard解释其背后原因的post。 不幸的是,根据Hibernate文档“忽略了未映射为@MappedSuperclass的超类属性”。 嗯,我认为这意味着,如果我有这两个类: public class A { private int foo; } @Entity public class B extens A […]

具有inheritance的实体的JPA本机查询

我有一个实体类和一个基于该实体的子类: @Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public class A 和 @Entity public class B extends A 我需要发出一个仅在基类(A)上使用存储过程的本机查询。 如果我尝试如下: entityManager.createNativeQuery(“select * from A a where procedure(f)”,A.class).getResultList() 我收到有关“在ResultSet中找不到列clazz_”的错误。 我假设JPA提供程序添加此列以区分基类和扩展类。 我可以通过显式添加clazz列和子类中的所有字段来解决此问题: entityManager.createNativeQuery(“select *,1 as clazz_,null as prop1,null as prop2 from A a where procedure(f)”,A.class).getResultList() 其中“prop1”和“prop2”是子类B的属性。但是,这似乎是一个不必要的黑客,如果子类B发生变化,则容易出现维护问题。 我的问题是:如何在已定义inheritance的实体上使用存储过程进行查询?

使用inheritance的重载方法

我有两节课: public class ClassA { public void method(Number n) { System.out.println(“ClassA: ” + n + ” ” + n.getClass()); } } 和: public class ClassB extends ClassA { public void method(Integer d) { System.out.println(“ClassB: ” + d + ” ” + d.getClass()); } } 但是当我跑步时: ClassA a = new ClassB(); a.method(3); 我明白了: ClassA: 3 class […]

使用带有generics的hibernate

我在理解Hibernate如何处理generics方面遇到了一些麻烦,并且想知道实现目标的最佳方法。 给出一个简单的通用实体: @Entity public class Box{ private T t; @Id private long id; public void setT(T t) { this.t = t; } public T getT() { return t; } public void setId(long id) { this.id = id; } public long getId() { return id; } } 在进行hibernate初始化时,我得到了exception: …has an unbound type and no explicit target […]