我有一个Wicket页面类,它根据抽象方法的结果设置页面标题.
public abstract class BasicPage extends WebPage {
public BasicPage() {
add(new Label("title", getTitle()));
}
protected abstract String getTitle();
}
Run Code Online (Sandbox Code Playgroud)
NetBeans通过消息"构造函数中的可覆盖方法调用"警告我,但它应该有什么问题呢?我能想象的唯一选择是将其他抽象方法的结果传递给子类中的超级构造函数.但是很多参数很难读懂.
我有这样的事情:
public abstract class Menu {
public Menu() {
init();
}
protected abstract void init();
protected void addMenuItem(MenuItem menuItem) {
// some code...
}
}
public class ConcreteMenu extends Menu {
protected void init() {
addMenuItem(new MenuItem("ITEM1"));
addMenuItem(new MenuItem("ITEM2"));
// ....
}
}
//Somewhere in code
Menu menu1 = new ConcreteMenu();
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,超类的init方法是抽象的,并且在创建对象后由构造函数自动调用.
我很好奇我是否可以遇到像这样的代码的某些问题,当我需要创建一些这样的结构时,其结构不会及时更改.
会有更好的方法吗?它适用于Java,但它可以在C++和ActionScript中使用吗?
谢谢你的答案.
在派生类构造函数中调用超类构造函数时,为什么id = 0的值?创建子对象时,何时在对象的堆中分配内存?基类构造函数运行之后或之前?
class Parent{
int id = 10;
Parent(){
meth();
}
void meth(){
System.out.println("Parent :"+ id);
}
}
class Child extends Parent{
int id = 5;
Child(){
meth();
}
void meth(){
System.out.println("Child :"+ id);
}
}
public class OverRidingEg {
public static void main(String[] args) {
// TODO Auto-generated method stub
Child a= new Child();
}
}
Run Code Online (Sandbox Code Playgroud) 下面是一些示例代码,
class Base
{
private int val;
Base() {
val = lookup();
}
public int lookup() {
//Perform some lookup
// int num = someLookup();
return 5;
}
public int value() {
return val;
}
}
class Derived extends Base
{
private int num = 10;
public int lookup() {
return num;
}
}
Run Code Online (Sandbox Code Playgroud)
class Test
{
public static void main(String args[]) {
Derived d = new Derived();
System.out.println("d.value() returns " + d.value());
}
}
Run Code Online (Sandbox Code Playgroud)
输出:d.value()返回0 //我期望10,因为lookup()被覆盖,但不是0!谁有人澄清这个?
Derived在其查找方法执行时,实例变量的初始化没有发生.如何Derived …
我有反思的有线经验.首先是一些示例代码:
public abstract class A {
public A () {
init();
}
public abstract void init ();
}
public class B extends A {
private int i = 0;
public B () {
super();
System.out.println(i);
}
public void init () {
i = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的代码中的某处,我使用反射api来实例化一个对象B.
Class<AbstractSection> bc = (Class<AbstractSection>) Class.forName(B);
Constructor<?> bcon = bc.getConstructor();
B b = (B) bcon.newInstance();
Run Code Online (Sandbox Code Playgroud)
我期望的是B的实例,变量i设置为值'1'.我得到的是一个B的实例,我仍然设置为'0'.通过调试器仔细观察,我发现这不完全正确:我仍然没有设置为'0'.它在init()方法中更改为"1",并在super()调用返回的那一刻设置回"0".
谁有线索?提前致谢,
曼努埃尔
PS:我知道我可以通过调用init()而不是在超类中但在继承构造函数中来解决这个问题.
我已经专业编程java十多年了.这是我试图追踪的最奇怪的错误之一.我有一个私有成员,我初始化它然后它自己变为null.
public class MyObject extends MyParent
{
private SomeOtherClass member = null;
public MyObject()
{
super();
}
public void callbackFromParentInit()
{
member = new SomeOtherClass();
System.out.println("proof member initialized: " + member);
}
public SomeOtherClass getMember()
{
System.out.println("in getMember: " + member);
return member;
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
proof member initialized: SomeOtherClass@2a05ad6d
in getMember: null
Run Code Online (Sandbox Code Playgroud)
如果您运行此代码,显然它将正常工作.在我的实际代码中,在这个确切的模式中只有这三种情况(如果计算打印输入,则为五次).
我在JVM中遇到过一些错误吗?除非我错了,否则父类不会干扰私有成员,无论我在我向你展示的代码行之间放置什么,我都不能在不使用标识符"成员"的情况下更改成员的值".
现在在一些Java代码中,我有类似的东西
class A {
void f() {
}
A() {
f();
}
}
class B extends A{
@Override
void f() {
//do some stuff
super.f();
}
}
class C extends B {
@Override
void f() {
//do some stuff
super.f();
}
}
Run Code Online (Sandbox Code Playgroud)
我希望f()调用然后向上遍历每个父类,运行重写f().super.f()虽然我不想这样做,但是我通过明确地调用来做到这一点.
我这样做的原因是必须在到达A中的构造函数之后进行后处理.并且每个班级都有适当的初始状态,这就是为什么我们有向上的痕迹f().
所以构造函数A真的是
A() {
//init some state in a
f(); //run f(), which will depend on the previous operation
}
Run Code Online (Sandbox Code Playgroud)
如果我做了new C();我想要C.f()调用的东西,那么B.f() …
我有这个出现在测验中的代码
public class Main {
public static void main(String[] args) {
class b {
int i = 32;
b() { b(); }
void b() { System.out.println(++i); }
}
class d extends b {
int i = 8;
d() {}
void b() { System.out.println(--i); }
}
b b = new d();
}
}
Run Code Online (Sandbox Code Playgroud)
输出应该是什么?原来答案是-1,而我预计它是7。java 坏了吗?