Java中,一切皆是对象,为何数据类型中还分为:基本类型和对象?

Java中,一切皆是对象!为何数据类型中还分为:基本类型和对象?按理不应该只有一个类型—对象吗?

1.首先,Java中一切皆是对象!这句话没错,因为八种基本类型都有对应的包装类(int的包装类是Integer),包装类自然就是对象了。基本类型一直都是Java语言的一部分,这主要是基于程序性能的考量,基本类型定义的变量是存放在栈中,比如int i=5;Integer j=new Integer(10); j则只是一个对象的引用,存放在栈中,而实际的数值10则是放在堆里,堆的读写速度远不及栈了。再有就是基本类型定义的变量创建和销毁很快,而类定义的变量还需要JVM去销毁。
2.其实java不是100%的面向对象编程,比如基本数据类型如int,boolean等等都不是对象,也就是不能用new的方式获取,但是java对这些基本数据类型都有解决办法,就是对着一个封装类型,但是他们的封装类是对象。比如int对应着Integer,boolean对应着Boolean,他们都是为了解决基本数据类型面向对象用的。

【对象与基本数据类型的区别】

基本数据类型在栈中进行分配,而对象类型在堆中进行分配。
所有方法的参数都是在传递引用而非本身的值(基本类型例外)。
对象之间的赋值只是传递引用,基本类型之间的赋值是创建新的拷贝。

有关值传递还是引用传递见Java 中引用传递还是值传递
注意:
①对于基本类型,“==”和“!=”是在比较值。而对于对象来说,“==”和“!=”是在比较两个引用是否相同。
②Java 语言里的 equals方法其实是交给开发者去覆写的,让开发者自己去定义满足什么条件的两个Object是equal的。所以我们不能单纯的说equals到底比较的是什么。你想知道一个类的equals方法是什么意思就是要去看定义。

public static void main(String[] args) {
        Date a = new Date(1496620800000L);//创建对象a,L代表long int 
        Date b = new Date(1496620800000L);//创建对象b
        Date c=a;//将对象a赋值给c,只是传递引用,即对于非基本数据类型变量, = 操作是复制了变量的引用

        System.out.println(a);
        System.out.println(b);
        System.out.println(c);

        System.out.println("a==b?  "+(a==b));
        System.out.println("a equals b? "+(a.equals(b)));
        System.out.println("c==a?  "+(c==a));

    }

输出结果如下

Mon Jun 05 08:00:00 CST 2017
Mon Jun 05 08:00:00 CST 2017
Mon Jun 05 08:00:00 CST 2017
a==b?  false
a equals b? true
c==a?  true

模拟图解是这样的
这里写图片描述

对象 a 、b ,用== 判断结果为不等,因为而对于对象a、b来说,“==”是在比较两个引用是否相同,显然不等。
对象 a 、b ,用equals() 判断结果为等。查看API可以知道,Date类中equals()方法 比较的是getTime()的返回得long int 值是否相等。

two Date objects are equal if and only if 
the getTime method returns the same long value for both.

对象 a 、c ,,用== 判断结果为等,因为而对于对象a、c来说,两个引用是否相同,显然等。

猜你喜欢

转载自blog.csdn.net/summerxiachen/article/details/79402086
今日推荐