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