Java 访问抽象类字段的正确方法?
我试图找出访问抽象类的私有字段的正确方法,然后在扩展抽象类的类中使用它 下面是我的抽象类 过程类(摘要):Java 访问抽象类字段的正确方法?,java,oop,abstract-class,Java,Oop,Abstract Class,我试图找出访问抽象类的私有字段的正确方法,然后在扩展抽象类的类中使用它 下面是我的抽象类 过程类(摘要): public abstract class Process implements Runnable { private final Properties props; private final String processName; public Process(String processName, Properties props) { this.process
public abstract class Process implements Runnable {
private final Properties props;
private final String processName;
public Process(String processName, Properties props) {
this.processName = processName;
this.props = props;
}
public abstract void shutdown();
public Properties getProps() {
return props;
}
public String getProcessName() {
return processName;
}
}
下面是我如何扩展上述抽象类并使用props
Properties对象的一种方法
ProcessA类:
public class ProcessA extends Process {
private ProcessConsumer<byte[], byte[]> consumer;
public ProcessA(String processName, Properties props) {
super(processName, props);
}
@Override
public void run() {
// is this the right way?
String processName = getProcessName();
Properties props = getProps();
consumer = new ProcessConsumer<>(props);
// .. some other code with try catch block
// using processName and consumer
}
@Override
public void shutdown() {
consumer.wakeup();
}
}
public class ProcessB extends Process {
private final ProcessConsumer<byte[], byte[]> consumer;
public ProcessB(String processName, Properties props) {
super(processName, props);
// is this the right way to use props object?
this.consumer = new ProcessConsumer<>(props);
}
@Override
public void run() {
String processName = getProcessName();
// .. some other code with try catch block
// using processName and consumer
}
@Override
public void shutdown() {
consumer.wakeup();
}
}
公共类进程扩展进程{
私人消费者;
公共进程A(字符串进程名、属性道具){
超级(进程名、道具);
}
@凌驾
公开募捐{
//这条路对吗?
字符串processName=getProcessName();
Properties=getProps();
消费者=新流程消费者(道具);
//…使用try-catch块的其他代码
//使用processName和consumer
}
@凌驾
公共空间关闭(){
consumer.wakeup();
}
}
下面是我如何扩展上述抽象类并使用properties对象的第二种方法
ProcessB类:
public class ProcessA extends Process {
private ProcessConsumer<byte[], byte[]> consumer;
public ProcessA(String processName, Properties props) {
super(processName, props);
}
@Override
public void run() {
// is this the right way?
String processName = getProcessName();
Properties props = getProps();
consumer = new ProcessConsumer<>(props);
// .. some other code with try catch block
// using processName and consumer
}
@Override
public void shutdown() {
consumer.wakeup();
}
}
public class ProcessB extends Process {
private final ProcessConsumer<byte[], byte[]> consumer;
public ProcessB(String processName, Properties props) {
super(processName, props);
// is this the right way to use props object?
this.consumer = new ProcessConsumer<>(props);
}
@Override
public void run() {
String processName = getProcessName();
// .. some other code with try catch block
// using processName and consumer
}
@Override
public void shutdown() {
consumer.wakeup();
}
}
公共类ProcessB扩展进程{
私人最终消费者;
publicprocessB(字符串processName、属性props){
超级(进程名、道具);
//这是使用道具对象的正确方法吗?
this.consumer=新流程消费者(道具);
}
@凌驾
公开募捐{
字符串processName=getProcessName();
//…使用try-catch块的其他代码
//使用processName和consumer
}
@凌驾
公共空间关闭(){
consumer.wakeup();
}
}
我想在制作ProcessConsumer
对象时使用props
属性,但我不知道使用props
对象的正确方法是什么?我应该在run方法中调用抽象类上的getProps
方法,然后使用它吗?或者只是把它放在构造器中,然后在那里构建它
什么是区别,什么是正确的方法?扩展抽象类时,子类继承私有字段,但它们不可访问。因为私有字段只能在定义它们的类的范围内访问 因此,要初始化私有字段,您可以使用
super
,以及访问它们。您可以将super
视为此的母亲:
public abstract class AbstractProcess{
private final String processName;
public AbstractProcess(String name){
processName = name;
}
public String getName(){
return processName;
}
}
public class MyProcess extends AbstractProcess{
public MyProcess(ProcessName name){
//like you did is true
super(name);
}
//now to access them
public String getName(){
return super.getName();
}
}
您还可以使用protected
绕过整个私有+继承的问题。受保护的字段类似于私有字段
,但由子类继承和访问。因此,您可以只调用this.someProtectedField
(注意它不是一个“getter”函数),而不是super.getSomePrivateField()
我希望这就是您要问的,并且我已经说得很清楚了。当您扩展抽象类时,子类继承私有字段,但它们不可访问。因为私有字段只能在定义它们的类的范围内访问
因此,要初始化私有字段,您可以使用super
,以及访问它们。您可以将super
视为此的母亲:
public abstract class AbstractProcess{
private final String processName;
public AbstractProcess(String name){
processName = name;
}
public String getName(){
return processName;
}
}
public class MyProcess extends AbstractProcess{
public MyProcess(ProcessName name){
//like you did is true
super(name);
}
//now to access them
public String getName(){
return super.getName();
}
}
您还可以使用protected
绕过整个私有+继承的问题。受保护的字段类似于私有字段
,但由子类继承和访问。因此,您可以只调用this.someProtectedField
(注意它不是一个“getter”函数),而不是super.getSomePrivateField()
我希望这就是你要问的,并且我已经说得很清楚了。你的两种解决方案都能奏效。
但我会使用完全不同的解决方案:
public abstract class Process implements Runnable {
private final Properties props;
private final String processName;
public Process(String processName, Properties props) {
this.processName = processName;
this.props = props;
}
protected abstract void shutdown();
protected abstract void run(String processName, Properties props);
@Override
public final void run() {
run(processName, props);
}
}
public class ProcessA extends Process {
private ProcessConsumer<byte[], byte[]> consumer;
public ProcessA(String processName, Properties props) {
super(processName, props);
}
@Override
public void shutdown() {
consumer.wakeup();
}
@Override
protected void run(String processName, Properties props) {
consumer = new ProcessConsumer<>(props);
}
}
公共抽象类进程实现可运行{
私人最终财产道具;
私有最终字符串processName;
公共进程(字符串processName、属性props){
this.processName=processName;
this.props=props;
}
受保护的抽象无效关机();
受保护的抽象无效运行(字符串processName、属性props);
@凌驾
公开最终作废运行(){
运行(进程名、道具);
}
}
公共类ProcessA扩展了进程{
私人消费者;
公共进程A(字符串进程名、属性道具){
超级(进程名、道具);
}
@凌驾
公共空间关闭(){
consumer.wakeup();
}
@凌驾
受保护的无效运行(字符串processName、属性props){
消费者=新流程消费者(道具);
}
}
所以这个过程只有一个公共方法,
您将run方法设置为final,因此没有人可以覆盖它。
您可以在另一个run方法中获得参数。两个解决方案都可以工作。
但我会使用完全不同的解决方案:
public abstract class Process implements Runnable {
private final Properties props;
private final String processName;
public Process(String processName, Properties props) {
this.processName = processName;
this.props = props;
}
protected abstract void shutdown();
protected abstract void run(String processName, Properties props);
@Override
public final void run() {
run(processName, props);
}
}
public class ProcessA extends Process {
private ProcessConsumer<byte[], byte[]> consumer;
public ProcessA(String processName, Properties props) {
super(processName, props);
}
@Override
public void shutdown() {
consumer.wakeup();
}
@Override
protected void run(String processName, Properties props) {
consumer = new ProcessConsumer<>(props);
}
}
公共抽象类进程实现可运行{
私人最终财产道具;
私有最终字符串processName;
公共进程(字符串processName、属性props){
this.processName=processName;
this.props=props;
}
受保护的抽象无效关机();
受保护的抽象无效运行(字符串processName、属性props);
@凌驾
公开最终作废运行(){
运行(进程名、道具);
}
}
公共类ProcessA扩展了进程{
私人消费者;
公共进程A(字符串进程名、属性道具){
超级(进程名、道具);
}
@凌驾
公共空间关闭(){
consumer.wakeup();
}
@凌驾
受保护的无效运行(字符串processName、属性props){
消费者=新流程消费者(道具);
}
}
所以这个过程只有一个公共方法,
您将run方法设置为final,因此没有人可以覆盖它。
您可以在另一个run方法中获得参数。这不是我要问的。我的问题是如何访问抽象c的道具