Tag: 实例化

获取Java类的行为

我在java中有一个generics类定义为: public static class KeyCountMap { private Map map = new LinkedHashMap(); // … rest of the properties… public KeyCountMap() { } @SuppressWarnings({ “unchecked”, “rawtypes” }) public KeyCountMap(Class mapType) throws InstantiationException, IllegalAccessException { map = mapType.newInstance(); } //… rest of the methods… } 我在.NET中定义了相同的类: public static class KeyCountMap { private Dictionary map = new Dictionary(); […]

为什么Java接口可以在这些代码中实例化?

可能重复: 创建接口的“对象” 我是Java新手。 根据我的理解: 我们无法实例化Interface 。 我们只能实例化一个实现interface的class 。 new关键字用于从类创建对象。 但是,当我读取某些Java程序的源代码时,我发现有时会实例化一个接口。 例如: 例1: JButtonObject.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //codes } }); 例2: SwingUtilities.invokeLater(new Runnable() { public void run() { //codes } }); 在上面的示例中,ActionListener和Runnable都是Java接口。 我可以知道为什么可以在这些代码中实例化它们吗? 实例化接口的目的是什么? 参考这个例子 ,似乎我们应该创建一个实现接口的类的实例。

Java – 对非静态字段列表进行静态引用

我刚刚进行了实验,发现当我运行滚动代码时,它无法编译,我无法弄清楚原因。 我的IDE说’不能对非静态字段列表进行静态引用’,但我真的不明白这是什么或为什么。 它还适用于什么,即:它只是私有变量和/或方法,为什么?: public class MyList { private List list; public static void main (String[] args) { list = new LinkedList(); list.add(“One”); list.add(“Two”); System.out.println(list); } } 但是,当我将其更改为以下内容时,它可以正常工作: public class MyList { private List list; public static void main (String[] args) { new MyList().exct(); } public void exct() { list = new LinkedList(); list.add(“One”); list.add(“Two”); System.out.println(list); […]

为什么要将对象分配给接口?

我曾多次听说过在实例化对象时你应该这样做: “Interface”name = new“Class”(); 例如,对于实现List的类链表: List name = new LinkedList(); LinkedList实现了许多接口,包括queue,deque等。上面的代码和之间有什么区别 LinkedList name = new LinkedList(); 要么 Queue name = new LinkedList(); 为什么必须两次指定类型; 这似乎是多余的,但oracledocs似乎并未提及它。

PMD:避免在循环内实例化新对象

我有PMD规则的问题Avoid instantiating new objects inside loops 。 这是一些示例代码: import java.awt.Dimension; public class PMDDemo { public static void main(final String[] args) { final Dimension[] arr = new Dimension[10]; for (int i = 0; i < arr.length; i++) { arr[i] = new Dimension(i, i); // rule violation here } } } PMD在代码中的标记位置给出了上述规则违规。 如何创建类的n个实例而不在循环中创建它们? 我知道PMD的一些规则是有争议的(比如onlyOneExit规则)。 但到目前为止,我至少理解他们背后的想法。 我不明白这条规则背后的原因。 有人可以帮助我吗?

Java:在运行时扩展类

我有能力在编译时扩展一个类,但我需要能够在运行时使用已经实例化的超类的实例创建该子类的实例。 这在理论上应该是可能的,因为超类构造函数已经在子类构造函数之前调用。 我无法充分访问该程序以将实例化更改为我的子类,也无法中断原始实例化。 用例:存在类X的现有实例数组。我的代码在之后加载。 我需要覆盖其中一个实例X的一个方法,我的加载子类Y扩展X.父程序只通过该数组访问对象,所以我想用我的Y实例替换该数组元素,但它需要表现得好像它最初被实例化到那个数组中。 我不能只包含超类实例和转发调用,并且重新实现超类有很多复杂的问题。 我希望更清楚。

我应该如何根据用户选择选择应该实例化哪个具体实现?

我有一个接口Fruit有两个实现Apple和Banana 。 我想创建一个Fruit实例。 应该由用户选择具体实现应该是Apple还是Banana 。 我还没有设计用户界面,所以用户做出这个选择没有限制。 我知道有以下选择: 使用抽象工厂模式 使用reflection从给定的类名创建实例 使用reflection从给定的类对象创建实例 这些选项的优缺点是什么? 请注意,虽然有几个类似的问题讨论了一种或另一种方法,但我没有找到一个比较。 以下是相关问题列表: 为什么Class.newInstance()“邪恶”? 我可以将Class.newInstance()与构造函数参数一起使用吗? 如何制作类的ArrayList? Class.newInstance()是否遵循“抽象工厂”设计模式?

抽象类NumberFormat – 对getInstance()非常困惑

我是Java新手,我有一个初学者问题: NumberFormat是一个抽象类,所以我假设我不能创建它的实例。 但是有一个允许我这样做的公共静态(工厂?)方法getInstance() NumberFormat nf = NumberFormat.getInstance(); 我很困惑。 如果有人能给我提示,我会很高兴: 如果有一个公共方法来获取这个抽象类的实例,为什么我们还没有一个构造函数呢? 这是一个抽象的类; 我们怎么能有这个静态方法给我们一个类的实例? 为什么选择这样的设计? 如果我假设它有可能有一个抽象类的实例(???),我不明白为什么这个类应该是抽象的。 谢谢。

带有内部类的newInstance()

我一直在研究一种实例化方法,它允许我将各种类似的类打包到一个外部类中。 然后,我可以通过将该类型的名称传递给构造函数来实例化每个唯一的类类型。 经过大量的研究和错误,这就是我想出的。 我留下了一个错误,以certificate我的问题。 import java.lang.reflect.Constructor; public class NewTest { public static void main(String[] args) { try { Class toRun = Class.forName(“NewTest$” + args[0]); toRun.getConstructor().newInstance(); } catch(Exception ex) { ex.printStackTrace(); System.out.println(ex.getMessage()); } } public NewTest(){} private class one //Does not instantiate { public one() { System.out.println(“Test1”); } } private static class two //Instantiates okay { […]

从Class 使用String值?

我发现很难将确切的问题写成文字,所以我只想举个例子。 我有两种Enum类型: enum Shape { CAT, DOG; } enum Color { BLUE, RED; } 我有一个方法: public Object getInstance(String value, Class type); 我想用这样的方法: // someValue is probably “RED”, and someEnumClass is probably Color.class Color c = getInstance(someValue, someEnumClass); 我一直无法确定如何实现getInstance() 。 一旦知道要实例化的确切Enum类,就很容易: Color.valueOf(“RED”); 但是如何用一个未知的Class完成上述这一行呢? (但是,已知someEnumClass是Enum的子类。) 谢谢!