Tag: oop

当我可以通过引用子类访问所有方法时,为什么要引用基类?

我正在学习java概念。 我对javainheritance概念有疑问。 在inheritance中,我们可以将子类实例分配给基类引用,并且我们只能访问基类函数。 我们可以将inheritance层次结构中的任何子类实例分配给基类引用。对于分配给特定基类引用的实例类型,我们只能访问基类函数,但我没有发现任何区别。 任何人都可以给我实际的概念,为什么我们必须将子类实例分配给基类引用? 有什么需要这样做? 相反,我们可以从子类引用只知道访问那些基类函数。 通过考虑层次结构中的特定基类和许多子类来解释。

dependency injection的真实用例是什么?

我理解dependency injection但我真正不理解的是,dependency injection的用途是什么。 正如这里提到的那样,这有助于轻松测试代码(这是一种非常有用的测试技术,因为它允许依赖性被模拟或删除。)但现在有很多模拟框架,如Mockito , powermockito可以这些工作比dependency injection更好吗? 如果有人能用代码解释,那将是很棒的。 提前致谢。

Java包级别访问

我知道具有默认访问控制的类成员可以在包级别访问,但我对包级访问实际意味着什么感到困惑。 如果可以在包级别访问默认成员,那么在下面的示例中,我不应该在类Test2中看到它吗? 1级 package pkg1; public class Test { int i=0; } 2级 import pkg1.Test; public class Test2 { void get(){ Test t = new Test(); ti=0; } } 请帮助我理解这个概念。 提前致谢。

java中对象的大小是多少

众所周知,java使用以下数据类型 byte Occupy 8 bits in memory short Occupy 16 bits in memory int Occupy 32 bits in memory long Occupy 64 bits in memory 如果我创建一个类似的 class Demo{ byte b; int i; long l; } Demo obj = new Demo(); 现在我的问题是obj size是 or = b+i+l的大小是104 bytes 。 请以正当理由给我澄清。 谢谢, 阿尼尔库马尔

为什么shortValue()方法是具体的,但intValue()是抽象到java.lang.Number?

我已经阅读了java.lang.Number源代码,我想知道为什么 intValue() longValue() floatValue() doubleValue() 是抽象的但是 shortValue() byteValue() 具体的。 源代码: public abstract class Number implements java.io.Serializable { public abstract int intValue(); public abstract long longValue(); public abstract float floatValue(); public abstract double doubleValue(); public byte byteValue() { return (byte)intValue(); } public short shortValue() { return (short)intValue(); } private static final long serialVersionUID = -8742448824652078965L; } […]

包私有类中的公共成员

我想知道公共成员是否在包私人课程中是否可行(不被视为不良做法)。 我倾向于将public关键字添加到我的默认可见性类的成员中,以指示这些成员是类API的一部分。 我这样做只是为了提高可读性,因为在这种情况下,公共成员与没有任何访问修饰符(即包可见性)的成员具有基本相同的可见性。 那是对的吗? 例: class ModuleImplementationClass { private int fieldA; private String fieldB; private void someClassInternalMethod() { // impl } public int doSth() { // method that will be called by other classes in the package } }

使用JNDI在Tomcat中共享servlet会话对象和数据

在过去的几周里,我一直在寻找在两个上下文/战争文件之间共享对象的解决方案。 有很多种方法可以做,其中一种是JNDI。 我对Tomcat中使用的JNDI不太熟悉,所以想澄清一些问题: 基本上我有一个对象的实例,它将为多个上下文/应用程序提供以下服务 检查用户是否已登录 检查用户的会话是否有效 登录用户 – 包括记录登录详细信息 注销用户 – 删除会话 每个应用程序将在处理任何请求之前调用此对象以validation用户。 我不明白的是如果对象存储在JNDI上,该对象将如何工作。 我已经看到了一些如何在Tomcat中使用JNDI的示例,但99%的示例显示了如何配置JDBC数据源。 对象在JNDI中的确切初始化程度。 例如,Tomcat文档中的以下配置显示了JDBC的配置 在我的情况下,我将如何做类似的事情,最重要的是,如何在将对象放入JNDI树之前初始化该对象。 一旦它在JNDI树上,它是如何更新的? 我想我想要的是在Tomcat中使用JNDI的简单示例,但不是数据库连接,而是服务提供者类型对象。 我一直在阅读本教程http://docs.oracle.com/javase/tutorial/jndi/ops/bind.html,但它更侧重于LDAP命名目录,这并没有真正帮助。 编辑 好的,我确实在上面列出的教程中找到了一个示例,它显示了如何将对象“绑定”到JNDI树中。 class SerObj { public static void main(String[] args) { // Set up environment for creating initial context Hashtable env = new Hashtable(11); env.put(Context.INITIAL_CONTEXT_FACTORY, “com.sun.jndi.ldap.LdapCtxFactory”); env.put(Context.PROVIDER_URL, “ldap://localhost:389/o=JNDITutorial”); try { // Create the initial […]

C#与Java中的访问修饰符最佳实践

我理解OOD中的经验法则是尽量减少对给定对象的所有成员的访问,尽可能合理地完成。 C#和Java似乎都实现了同一组访问修饰符; 然而,令我困惑一段时间的东西现在是为什么Java类似乎主要被声明为公共,而C#类似乎主要被声明为默认。 这些语言是否存在某些微妙之处,这些差异会带来这些差异,还是仅仅是一种惯例或什么? 我发现自己经常通过我的C#代码(我习惯性地将大多数类公开,除了内部类,匿名类,以及其他类别的狭窄范围和有用性)以试图取悦编译器,但是我想知道我是否可能遗漏了某些东西重要。

调用存在于子类中但不存在于父类中的方法

public class Parent { …. } public class Child1 extends Parent { …. public void foo() { …. } } public class Child2 extends Parent { …. public void foo() { …. } } 这里方法foo()只存在于Child类中,不能添加到Parent类(甚至不是抽象方法)。 在这种情况下,当我想在obj上调用foo()方法时,这是Parent类的引用,那么我需要使用intanceof和多个if..else ,我想避免它。 Parent obj = …// Object of one of the child classes obj.foo(); 编辑:我需要使用obj类型作为Parent 。 否则我将无法调用父类中存在的obj上的方法。 我的解决方案:我想的方法是使用foo()方法定义一个接口说FooInterface并让所有子类实现它,然后我可以输入obj到该接口并调用foo()方法,如下所示: if(obj instanceof […]

如何让Java反映出超类中的字段? 不仅仅是实际的课程

我最近改变了我的模式所以我的类inheritance自超类,问题是我的比较方法生成审计日志,使用Javareflection,现在只循环子类的字段,而不是超类,是有办法获得所有FIELDS? 或者我需要把它投入超级……? 下面是我的方法: public static String GenerateChangeLogForEntity(T old, T updated) { String text = “”; try { Field[] fields = old.getClass().getDeclaredFields(); if(fields != null) { BaseController.getLogger().info(“Z1 num fields:”+fields.length); for (Field field : fields) { if(field.isAnnotationPresent(Column.class)) { String fieldName = field.getName(); BaseController.getLogger().info(field.getName()); if(field.isAnnotationPresent(Variation.class)) { Variation v = field.getAnnotation(Variation.class); fieldName = v.friendlyName(); } field.setAccessible(true); if(field.get(old) != null […]