Tag: oop

为什么在Object中定义了equals和hashCode?

决定在java.lang.Object中包含这些方法的原因是什么? 对于许多类来说,平等和散列是没有意义的。 制作两个接口更合乎逻辑: interface Equalable { boolean equals(Equalable other); } interface Hashable extends Equalable { int hashCode(); } 例如,HashSet定义可能看起来像 class HashSet … 它可以防止一个常见的初学者错误 – 使用一组项而不实现equals / hashCode。

什么是封装?

我有两个封装定义,不能适合一个定义。 封装是数据隐藏。 通过使用private , protected和public ,将数据打包到单个组件中。 无论发生什么变化都包含在内。 保护任何易于改变的东西。 这两个定义如何讨论相同的概念?

单个文件中的多个类

我在将多个类放入单个文件时遇到问题。 例如,当我的文件看起来像: public class FirstClass() {} public class SecondClass() {} public class ThirdClass() {} 我在编译期间遇到错误。 我不太确定是什么导致了这一点。 有任何想法吗?

何时使用静态方法和字段?

我知道静态是什么,但不知道何时使用它。 静态变量:我只将它用于常量字段。 有时类中有几十个常量,因此使用静态常量可以节省大量内存。 还有其他典型的用例吗? 静态方法:我在编写关于算法的类时使用它。 例如,提供不同排序算法的类。 它是否反对OOP设计? 我认为保持这种方式比在每个需要使用它们的类中实现排序算法更好。 我错了吗? 什么是好用例? 此外,使用静态和非静态字段/方法之间是否存在性能差异?

Java,调用对象方法,ar arylylist

基于这个问题增量变量名称? 我有一个arraylist’peopleHolder’,它拥有各种“人物”物品。 我想基于for循环自动创建’person’对象。 我做了以下 peopleHolder.add(new person()); 我想从人类课程中调用方法。 例如person.setAge; 如何通过arraylist调用此类方法? 我想方法为每个对象设置值。 我看过这个答案: Java – 调用ArrayList中对象的方法 但我认为解决方案依赖于调用静态方法,并且我希望在存储对象值时让对象特定于该对象。 谢谢

对象类型和引用类型之间的差异

我正在研究“Head First Java”中的多态性并得出了这个概念。 有人可以用一个例子来解释吗? 编译器检查引用类的类 – 而不是Object类型。 那么参考类型和对象类型有什么区别?

接口上用于强制一致性的静态方法的替代方法

在Java中,我希望能够定义标记接口,强制实现提供静态方法。 例如,对于简单的文本序列化/反序列化,我希望能够定义一个如下所示的接口: public interface TextTransformable{ public static T fromText(String text); public String toText(); 因为Java中的接口不能包含静态方法(如许多其他post/线程所述: 这里 , 这里 , 这里代码不起作用。 然而,我正在寻找的是表达相同意图的一些合理范例,即对称方法,其中一种是静态的,并由编译器强制执行。 现在我们能想到的最好的是某种静态工厂对象或通用工厂,这两者都不是真正令人满意的。 注意:在我们的例子中,我们的主要用例是我们有许多“值 – 对象”类型 – 枚举,或者具有有限数量值的其他对象,通常不会超出其值,并且我们解析/ de -parse数秒钟的时间,所以实际上关心重用实例(如Float,Integer等)及其对内存消耗的影响/ gc 有什么想法吗? 编辑1:为了消除一些混乱 – 我们有许多不同的对象适合这种模式 – 实际上我们正试图为具有2个语义的调用者提供优雅的东西: 作为合同的接口 – 访问的统一性(例如TextTransformable作为一种能力) 要求通过子类/实现实现(例如强制它们实现自己的转换 就我们对Flyweight,Factories的看法而言 – 它们都是我们考虑过的选项,我们真的试图看看我们是否能找到更优雅的东西,而不是依赖于JavaDoc说“实现工厂并委托调用它,或按惯例在XXX地点公开“

接口的多重inheritance歧义

我们都知道有关多重遗传的钻石问题 – A / \ BC \ / D 这个问题描述了D类的模糊情况。 如果A类有一个方法并且B和/或C两个/都覆盖了该方法,则D覆盖哪个版本的方法? 这个问题是否也适用于Java中的接口? 如果没有,Java接口如何解决这个问题?

在Java中重载和多次调度

我有一个集合(或列表或数组列表),我想在其中放置String值和double值。 我决定使它成为对象的集合并使用重载ond多态,但我做错了。 我做了一点测试: public class OOP { void prova(Object o){ System.out.println(“object”); } void prova(Integer i){ System.out.println(“integer”); } void prova(String s){ System.out.println(“string”); } void test(){ Object o = new String(” “); this.prova(o); // Prints ‘object’!!! Why?!?!? } public static void main(String[] args) { OOP oop = new OOP(); oop.test(); // Prints ‘object’!!! Why?!?!? } } 在测试中,似乎参数类型是在编译时决定的,而不是在运行时决定的。 […]

多重inheritance和类对象

我对OOP很新。 我们都知道Java不支持多重inheritance; 但是,所有Java类都inheritance自Object ,并且还可以从另一个类inheritance。 我们可以将其视为多重inheritance吗? Java如何处理这样的事情?