我正在将一些Java代码转换为C++,我希望保持类结构类似.但是,我遇到了以下问题,我不知道如何解决; 我在Java中这样做:
public class Mother {
protected Father make;
public Mother(){
make = maker();
make.print(); };
public Father maker(){
return new Father();};}
public class Daughter extends Mother {
public Daughter(){
super();}
@Override
public Father maker(){
return new Son();};}
public class Father {
public void print(){
System.out.println("I am the Father!\n");}}
public class Son extends Father {
@Override
public void print(){
System.out.println("I am the son!\n");};}
public static void main(String[] args) {
Daughter dot = new Daughter();
}
Run Code Online (Sandbox Code Playgroud)
会产生:我是儿子! 而:
class father{ …Run Code Online (Sandbox Code Playgroud) 我没有很多Java经验,但我看到代码中有一个带有某个构造函数的抽象类,然后是没有构造函数的抽象类的子类.然后,当实例化子类时,它使用其超类构造函数构造.是对的吗?
我有这个抽象类:
public abstract class Tile{
public int x;
public int y;
public int z;
protected Color color;
protected float friction;
protected float bounce;
protected boolean liquid;
public void Tile(int x, int y, int z){
this.x = x;
this.y = y;
this.z = z;
init();
}
abstract protected void init();
Run Code Online (Sandbox Code Playgroud)
而这个子类:
public class TestTile extends Tile{
protected void init(){
color = Color.RED;
friction = 0.1f;
bounce = 0.2f;
liquid = false;
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我用这个实例化一个TestTile时:
Tile tile = new TestTile(0, 0, …Run Code Online (Sandbox Code Playgroud) 我正在构造函数中通过setter在我的DTO中初始化一些成员变量.
但是下面的pmd错误显示如何消除pmd规则违规?
在对象构造期间调用的重写方法'setAbc'
class A{
private String x;
public getX(){
return x;
}
public setX(String x){
this.x = x ;
}
A(){}
A(B b){
setX("C");
}
Run Code Online (Sandbox Code Playgroud)
}
基类:
public class Base {
private String baseMessage = "Hello!";
public Base() {
printMessage();
}
public void printMessage() {
System.out.println(baseMessage.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
派生类:
public class Derived extends Base {
private String derivedMessage = "World!";
public Derived () {
super();
}
@Override
public void printMessage() {
super.printMessage();
System.out.println(derivedMessage.toString());
}
public static void main(String[] args) {
// new Base();
new Derived();
}
}
Run Code Online (Sandbox Code Playgroud)
我跑的时候
new Base();
Run Code Online (Sandbox Code Playgroud)
我得到了预期的输出:
Hello!
Run Code Online (Sandbox Code Playgroud)
当我跑
new Derived();
Run Code Online (Sandbox Code Playgroud)
我明白了
Hello!
Hello!
Run Code Online (Sandbox Code Playgroud)
然后是NullPointerException.这对我来说似乎有点奇怪.我不知道为什么它打印出来然后抛出一个nullpointerexception,而不是直接抛出它.也许是Eclipse,我不知道.
这里的基本概念是什么?
假设我们有一个类:
public class MyClass extends AbstractClass {
private AnotherObject ao = null;
public MyClass() {
super();
}
@Override
protected void init() {
ao = new AnotherObject();
if (ao != null) {
log.info("NOT NULL");
}
}
@Override
protected void doSomething() {
if (ao == null) {
log.info("It is NULL.");
}
ao.doIt(); //NullPointerException here
}
}
Run Code Online (Sandbox Code Playgroud)
以及相应的抽象类:
public class AbstractClass implements Runnable {
Thread myThread = null;
AbstractClass () {
init();
myThread = new Thread(this, "ThreadName");
myThread.start();
}
public void run() { …Run Code Online (Sandbox Code Playgroud) java ×5
abstract ×1
c++ ×1
class ×1
constructor ×1
factory ×1
inheritance ×1
pmd ×1
polymorphism ×1
subclass ×1