长沙java培训
达内长沙芙蓉路中心

18487146383

热门课程

java语言:OOP面向对象程序编程

  • 时间:2016-11-23
  • 发布:长沙Java培训
  • 来源:博客园

长沙Java培训机构的老师知道,OOP(Object-oriented Programming)面向对象程序编程

初谈类和对象,所谓万物皆对象,类和对象有什么区别和联系?

类,是对某一种类型的定义,比如字符串,动物,人,飞机等等,而对象是指具体的字符串,动物,人...

如:猪是类,定义了,猪,有体重,有年龄,可以吃饭,可以睡觉,而对象是这只猪,那只猪,或者某只猪起个名字,叫小白,那么这种具体的猪,就是对象,而小白这个名字,则称为对象的引用,因为通过小白,我们可以找到指定的那头猪。

package com.yq;

public class Pig {

private int height;

private int age;

void eat() {

System.out.println("eat()");

}

void sleep() {

System.out.println("sleep()");

}

public String toString() {

return getClass().getName() + "===@===" + Integer.toHexString(hashCode());

}

//   public String toString() {

//       return getClass().getName() + "@" + Integer.toHexString(hashCode());

//   }

public static void main(String[] args) {

Pig xiaoBai = new Pig();

Pig xiaoHei = new Pig();

xiaoBai.eat();

xiaoHei.sleep();

System.out.println(xiaoBai);

System.out.println(xiaoHei);

System.out.println("xiaoBai==xiaoHei?" + (xiaoBai == xiaoHei));

System.out.println(xiaoBai.getClass());

System.out.println(xiaoHei.getClass());

System.out.println("xiaoBai.getClass()==xiaoHei.getClass()?" + (xiaoBai.getClass() == xiaoHei.getClass()));

}

}

eat()

sleep()

com.yq.Pig===@===74a14482

com.yq.Pig===@===1540e19d

xiaoBai==xiaoHei?false

class com.yq.Pig

class com.yq.Pig

xiaoBai.getClass()==xiaoHei.getClass()?true

关于'=='

对于引用变量而言,比较的时候两个引用变量引用的是不是同一个对象,即比较的是两个引用中存储的对象地址是不是一样的。

对于基本数据类型而言,比较的就是两个数据是不是相等。

对于String类型,它是特殊而有趣的。

package com.yq;

public class Test {

public static void main(String[] args) {

//String作为一个对象来使用

System.out.println("String作为一个对象来使用");

String str = new String("hello");

String str2 = "he" + new String("llo");

System.out.println("str==str2?" + (str == str2));

System.out.println(str + "@" + str.hashCode());

System.out.println(str2 + "@" + str2.hashCode());

//String作为一个基本类型来使用

//如果String缓冲池内不存在与其指定值相同的String对象,那么此时虚拟机将为此创建新的String对象,并存放在String缓冲池内。

//如果String缓冲池内存在与其指定值相同的String对象,那么此时虚拟机将不为此创建新的String对象,而直接返回已存在的String对象的引用。

System.out.println("String作为一个基本类型来使用");

String s1 = "java";

String s2 = "java";

System.out.println("s1==s2?" + (s1 == s2));

System.out.println(s1 + "@" + s1.hashCode());

System.out.println(s2 + "@" + s2.hashCode());

System.out.println("String混合使用");

String st1 = "hello java";

String st2 = new String("hello java");

System.out.println("st1==s2?" + (st1 == st2));

System.out.println(st1 + "@" + st1.hashCode());

System.out.println(st2 + "@" + st2.hashCode());

}

}

String作为一个对象来使用

str==str2?false

hello@99162322

hello@99162322

String作为一个基本类型来使用

s1==s2?true

java@3254818

java@3254818

String混合使用

st1==s2?false

hello java@-1605094224

hello java@-1605094224

输出结果中,明明hashCode相等,为何对象不相同?

public int hashCode() {

int h = hash;

if (h == 0 && value.length > 0) {

char val[] = value;

for (int i = 0; i < value.length; i++) {

h = 31 * h + val[i];

}

hash = h;

}

return h;

}

上述String源码中,可以看出,String类是使用它的value值作为参数然后进行运算得出hashcode的,

换句话说,只要值相同的String不管是不是一个对象,hash值全部相等。

在Object超类中,hashCode()是一个native本地方法,看不到实现。

对象存放在内存的堆中,而基本类型则存放在内存的栈中。

上一篇:java嵌套类:内部类
下一篇:java语言:操作符

长沙java培训机构 程序员为什么睡眠不好?答案在这里!

【长沙Java培训】程序员记住,你写的代码是给人看的?

学编程培训班多少钱?你得看下课程含金量!

学习从构造函数看线程安全!长沙达内java

选择城市和中心
贵州省

广西省

海南省