繁体   English   中英

如何将超类构造函数的 System.out.println() 重定向到子类的 System.setOut()?

[英]How can I redirect the System.out.println() of constructor of superclass to System.setOut() of subclass?

在超类的构造函数中有一些多个 System.out.println(),我必须使用 System.setOut(ps) 将它们重定向到 PrintStream object ps。

例如,如果我有这样的超类:

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;

public class SuperClass implements ActionListener{

    public SuperClass(){
        System.out.println("Some message");
    }

    public String toString(){
        return "Some other message";
    }

    @Override
    public void actionPerformed(ActionEvent event)
    {
        System.out.println(toString());
    }
}

和这样的子类:

import java.io.IOException;
import java.io.PrintStream;

public class SubClass extends SuperClass{

    private PrintStream ps;

    public SubClass(){
        super();

        try {
            ps = new PrintStream("file.txt");
        } catch (IOException e){
            e.getStackTrace();
        }

        System.setOut(ps);
    } 
}

每当执行操作时(例如,按下超类中的 JFrame 按钮),actionPerformed() 中的 System.out.println() 将重定向到 PrintStream object,但构造函数中的 System.out.println() 不会。

另外,如何将 System.out 重定向到 PrintStream object 并保留 System.out? (即同时打印 System.out 和 PrintStream)

  1. 问题出在构造函数顺序中。 不久,当您调用SubClass构造函数时,它首先调用SuperClass ,因为您必须先初始化父类。(当您调用子类构造函数时,它总是首先调用父类构造函数)。 这个问题有关于初始化顺序的答案。
  2. 要为文件和控制台添加信息,添加记录器可以满足您的目标。 您可以通过多种方式配置它。 链接如果你想在没有记录器的情况下编写,只是为了文件和控制台,看看这个问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM