Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于创建类对象的机制_Java - Fatal编程技术网

Java 关于创建类对象的机制

Java 关于创建类对象的机制,java,Java,我看到一个类“AttributeSelectedClassifier”曾经通过以下方式创建: AttributeSelectedClassifier classifier = new AttributeSelectedClassifier(); classifier.setClassifier(base); classifier.setEvaluator(eval); 在我看来,这上面的一个看起来很自然。但是接下来的呢 classifier = new AttributeSelectedCl

我看到一个类“AttributeSelectedClassifier”曾经通过以下方式创建:

AttributeSelectedClassifier classifier = new AttributeSelectedClassifier();

classifier.setClassifier(base);
classifier.setEvaluator(eval);
在我看来,这上面的一个看起来很自然。但是接下来的呢

classifier = new AttributeSelectedClassifier();
((AttributeSelectedClassifier)classifier).setClassifier(base);
((AttributeSelectedClassifier)classifier).setEvaluator(eval);
我认为这应该是正确的,但我不太确定如何将分类器定义为((AttributeSelectedClassifier)分类器),如何理解这种用法?

这:

((AttributeSelectedClassifier)classifier)
不是“定义”或“声明”分类器,而是铸造它。大概在这种情况下,
分类器
被声明为
属性SelectedClassifier
的某个超类。但代码并不是特别清晰。我将代码的第二位重写为(假设您不能更改
分类器的声明)

这样,在将值分配给类型不太强的
分类器
变量之前,您可以使用
属性SelectedClassifier
的所有方法

(我可能会使用比
temp
更清晰的名称,但我们没有足够的上下文来确定这样的名称。)

这是:

((AttributeSelectedClassifier)classifier)
不是“定义”或“声明”分类器,而是铸造它。大概在这种情况下,
分类器
被声明为
属性SelectedClassifier
的某个超类。但代码并不是特别清晰。我将代码的第二位重写为(假设您不能更改
分类器的声明)

这样,在将值分配给类型不太强的
分类器
变量之前,您可以使用
属性SelectedClassifier
的所有方法

(我可能会使用比
temp
更清晰的名称,但我们没有足够的上下文来确定这样一个名称是什么。)

通过执行
((AttributeSelectedClassifier)classifier)
您正在强制(“强制”)
classifier
对象的行为类似于
AttributeSelectedClassifier
的实例

分类器
变量以前可能声明为AttributeSelectedClassifier的超类。

通过执行
((AttributeSelectedClassifier)分类器)
您正在强制(“强制”)分类器对象的行为类似于
AttributeSelectedClassifier
的实例


分类器
变量以前可能声明为AttributeSelectedClassifier的超类。

这意味着分类器变量声明为
AttributeSelectedClassifier
的超类或超接口,您需要调用未在类或接口中定义的方法,但仅在
属性SelectedClassifier
上。此符号将变量强制转换为
属性SelectedClassifier

Object classifier = new AttributeSelectedClassifier();
// classifier is a AttributeSelectedClassifier, but references as Object
// to call the following method, we need to cast it to AttributeSelectedClassifier
((AttributeSelectedClassifier)classifier).setClassifier(base);
((AttributeSelectedClassifier)classifier).setEvaluator(eval);

这通常是设计问题的标志。方法应该在超类或接口中,或者变量应该声明为
AttributeSelectedClassifier

这意味着分类器变量被声明为
AttributeSelectedClassifier
的超类或超接口,您需要调用一个未在类或接口中定义的方法,而只在
AttributeSelectedClassifier
上定义。此符号将变量强制转换为
属性SelectedClassifier

Object classifier = new AttributeSelectedClassifier();
// classifier is a AttributeSelectedClassifier, but references as Object
// to call the following method, we need to cast it to AttributeSelectedClassifier
((AttributeSelectedClassifier)classifier).setClassifier(base);
((AttributeSelectedClassifier)classifier).setEvaluator(eval);

这通常是设计问题的标志。方法应该在超类或接口中,或者变量应该声明为
AttributeSelectedClassifier

查看下面的代码。人员实现
CanWalk
界面。如果将
Person
分配给
CanWalk
接口,如main方法中所示(这是一种常见做法),则只能调用
CanWalk
接口中指定的方法,即
walk()
。如果您想调用
f()
,而不是
CanWalk
接口中声明的
f(),那么您可以使用您在文章中指定的第二种机制。i、 e.cast将其转换为
Person
类,然后调用该方法

对于API(这里的主要方法)的用户来说,在处理对象时使用正确的抽象是一个很好的实践。例如,如果客户主要关注移动人员,则应使用CanWalk。这样,客户端不会受到与移动无关的Person类更改的影响。阅读更多细节

interface CanWalk
{
  void walk();
}

class Person implements CanWalk
{
  void walk()
  {
     System.out.println("I am walking");
  }

  void f()
  {
    ///some arbitrary method
  }
}

public stativ void main(String a[])
{
   CanWalk cw=new Person();
   ((Person)cw).f();
}

请看下面的代码。人员实现
CanWalk
界面。如果将
Person
分配给
CanWalk
接口,如main方法中所示(这是一种常见做法),则只能调用
CanWalk
接口中指定的方法,即
walk()
。如果您想调用
f()
,而不是
CanWalk
接口中声明的
f(),那么您可以使用您在文章中指定的第二种机制。i、 e.cast将其转换为
Person
类,然后调用该方法

对于API(这里的主要方法)的用户来说,在处理对象时使用正确的抽象是一个很好的实践。例如,如果客户主要关注移动人员,则应使用CanWalk。这样,客户端不会受到与移动无关的Person类更改的影响。阅读更多细节

interface CanWalk
{
  void walk();
}

class Person implements CanWalk
{
  void walk()
  {
     System.out.println("I am walking");
  }

  void f()
  {
    ///some arbitrary method
  }
}

public stativ void main(String a[])
{
   CanWalk cw=new Person();
   ((Person)cw).f();
}