本文将给大家介绍面向对象编程中一个基本的概念–属性隐藏(Field Hiding)。
1、Java中,属性能否被覆盖?
来让我们看看下面的这个示例代码,它创建了两个子类实例:一个被赋值给子类引用,另外一个赋值给父类引用。
package com.diguage.books.simplejava.ar18;
/**
* 属性隐藏示例
* <p/>
* Coder:D瓜哥,http://www.diguage.com/
* <p/>
* Date: 2015-01-25 19:48
*/
class Super {
String s = "Super";
}
class Sub extends Super {
String s = "Sub";
}
public class FieldOverriding {
public static void main(String[] args) {
Sub c1 = new Sub();
System.out.println(c1.s);
Super c2 = new Sub();
System.out.println(c2.s);
}
}
输出是什么呢? 阅读全文…
在本文中,我们先用一个例子来展示什么是实例变量初始化器(instance variable initializer)、实例初始化器(instance initializer)和静态初始化器(static initializer)。然后,再解释一下实例初始化器的工作机制。
1、执行顺序
看下面这个类,你知道哪个先执行吗? 阅读全文…
1、定义
对于Java初学者来说,覆盖(Overriding)和重载(Overloading)是两个非常容易混淆的概念。
重载的情况是这样的,在同一个类中,有两个甚至更多的方面,他们名称相同,但是有不同的参数列表。
覆盖的意思是,有两个同名的方法,同时还有相同的参数列表,但是却有不同的实现。其中一个存在于父类中,另外一个在子类中。
2、覆盖 vs 重载
对于覆盖和重载有几个非常重要的事实需要注意:
- 真实的对象类型,而不是引用变量的类型,至于哪个覆盖方法会被使用是在运行时决定的;
- 引用类型在编译时决定那个重载方法被使用;
- 多态性取决于覆盖,而不是重载。
3、覆盖示例
这里有一个覆盖的示例。阅读代码,然后 阅读全文…
Java的最基本的父类java.lang.Object
中有两个非常重要的方法定义:
public boolean equals(Object obj)
public int hashCode()
实践证明,正确理解这两个方法非常重要,尤其是向Map
中添加用户自定义的对象时。即便如此,甚至有些高级开发人员有时很很难说清楚它们到底应该怎么用。在这篇文章里,我将先展示几个常见的 阅读全文…
Comparable
和Comparator
是Java核心API提供的两个接口(interface)。从它们的名字就可以看出,他们用于比较对象的大小。但是,确切来说,它们到底是什么呢?以及它们直接有什么不同之处呢?接下来的两个例子来回答这个问题。这个简单的例子就是比较两种HDTV的尺寸。当阅读完下面的代码,你就知道如何使用Comparable
和Comparator
。
1、Comparable
一个类实现Comparable
接口,是为了可以让其自身的对象和其他对象进行比较。类本身必须实现这个接口,为的是可以和它自己的实例进行比较。要求实现的方法是compareTo()
。下面的 阅读全文…
让我们从下面这行代码开始:
String x = null;
上面这句话到底做了什么?
在回答这个问题之前,我们需要先回顾一下什么是变量以及什么是变量值?一个常见的比喻是变量就类似一个箱子。就像你可以使用箱子盛放东西一样,你能用变量存放变量值。当你声明一个变量时,你就需要设置它的类型。
Java中主要分为两种数据类型:基本类型和引用类型。声明为基本类型的变量存储变量值;声明为引用类型的变量存储引用。在 阅读全文…
如何检查一个数组(未排序)中是否包含某个特定的值?在Java中,这是一个非常有用并又很常用的操作。同时,在StackOverflow中,有时一个得票非常高的问题。在得票比较高的几个回答中,时间复杂度差别也很大。在下面的例子中,D瓜哥将展示每个方法花费的时间。
1、不同的实现方式
1) 使用List
:
/**
* Coder:D瓜哥,http://www.diguage.com/
*/
public static boolean useList(String[] arr, String targetValue) {
return Arrays.asList(arr).contains(targetValue);
}
2) 使用 阅读全文…
Java中,可以通过下面两个方法来创建一个字符串:
/**
* Coder:D瓜哥,http://www.diguage.com/
*/
String x = "abc";
String y = new String("abc");
用双引号和用构造函数有什么区别呢? 阅读全文…
首先,在开始正文之前,请你快速回答如下问题:
在不使用任何IDE自动补全的情况下,如何获取一个数组的长度?以及,如何获取一个字符串的长度?
这个问题,我问过初级和高级,两个不同层次的开发人员。他们都不能准确而自信地回答这个问题。当IDE提供方便的代码自动补全功能时,它也会带来“理解肤浅”的问题。在这篇文章中,D瓜哥将给大家介绍几个关于Java数组的关键概念。
上述问题的正确答案是: 阅读全文…
前面有说明“图解Java字符串的不可变性”,后面有解释“为什么Java中的字符串是不可变的? ”。还有一篇与时俱进的“substring()
方法在JDK6和JDK7中的异同 ”。下面,上演第四篇“Java字符串的‘引用传递’”。
这也是一个Java中的一个经典问题。很多类似的问题在StackOverflow被提出。同样有很多不完整甚至不正确的回答。如果不深入思考,这问题很简单。但是,如果我们稍微深究一下,那么她却显得很“迷人”。
1、一段有趣而诡异的代码 阅读全文…