一、Object源代码

class Object {
private static native void registerNatives();
static {registerNatives();}
public final native Class<?> getClass();
public native int hashCode();
public boolean equals(Object obj) {return (this == obj);}
protected native Object clone() throws CloneNotSupportedException;
public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());}
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < ) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < || nanos > ) {
throw new IllegalArgumentException("nanosecond timeout value out of range");
}
if (nanos >= || (nanos != && timeout == )) {
timeout++;
}
wait(timeout);
}
public final void wait() throws InterruptedException {wait();}
protected void finalize() throws Throwable { }
}

二、首先说下native关键字

1、什么是Native Method?
"A native method is a Java method whose implementation is provided by non-java code."
在定义一个native method时,并不提供实现体,有些像定义一个java interface,因为其实现体是由非java语言在外面实现的.

2、为什么要使用Native Method?
一些底层的任务(与操作系统和硬件相关的任务)用java实现起来不容易,或者用java时效率低,这里用到了Native方法,JVM的一部分是用C写的.

三、Objcet是所有java类的超类,也就是所有对象包括数组,都继承Objcet的11个方法.

1、getClass(),返回一个对象的运行时类,一个类加载到内存时,.class文件已经封装为一个对象,getClass()方法返回一个Class的类的对象,该类描述类的共性 (都有类名,都有构造函数等),反射中用到.

public static void main(String[] args) {
GregorianCalendar cal = new GregorianCalendar();
System.out.println("" + cal.getTime());
System.out.println("" + cal.getClass());
Integer i = new Integer();
System.out.println("" + i.getClass());
}

运行结果如下:

Fri Sep 04 11:56:03 CST 2015
class java.util.GregorianCalendar
class java.lang.Integer

2、equals(Objcet o),默认比较的对象的引用,也就内存地址,也就是说,对于任何非空引用值x和y,此方法返回true当且仅当x和y引用同一个对象(y=y的值为true).基本类型的包装类和字符串实现了equals方法,比较的是值是否相同.

1.基本类型包装类实例:

public static void main(String[] args) {
int i0 = ;
int i1 = ;
Integer i2 = ;
Integer i3 = ;
Integer i4 = ;
Integer i5 = ;
Integer i6 = new Integer(); System.out.println(i0 == i1); // true,双等号用在基本类型变量比较的是值,用在对象比较的是内存地址
System.out.println(i2 == i3); // true,常量池技术,底层享元设计模式实现
System.out.println(i4 == i5); // false
System.out.println(i2 == i6); // false,i6在堆内存中
/* System.out.println(i0.equals(i2)); //编译报错,基本类型没有继承Objcet类 */
System.out.println(i4.equals(i5)); // true,基本类型的包装类已经重写equals
System.out.println(i2.equals(i6)); // true
}

2.String类实例:

public static void main(String[] args) {
String s0 = "aa";
String s1 = "aa";
String s2 = new String("aa");
String s3 = null;
String s4 = null; System.out.println(s0 == s1); // true,常量池
System.out.println(s0 == s2); // false,s2位于堆空间
System.out.println(s0.equals(s1)); // true,String类已经重写equals
System.out.println(s0.equals(s2)); // true
/*
* System.out.println(s3.equals(s4)); //运行期报空指针异常
* System.out.println(s3==s4); //true,null也是常量
*/
}

3.常量池技术

java中的常量池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复重复创建相等变量时节省了很多时间.常量池其实也就是一个内存空间,不同于使用new关键字创建的对象所在的堆空间,java中基本类型的包装类的大部分都实现了常量池技术,这些类是Byte,Short,Integer,Long,Character,Boolean,以及特殊的常量null,两种浮点数类型的包装类则没有实现.另外Byte,Short,Integer,Long,Character这5种整型的包装类也只是在对应值小于等于127大于-128,也就是一个字节以内时才使用对象池,这也合理,毕竟一个字节以内的数使用较为频繁,再大了使用较少,这时使用常量池,反而会使效率变低.常量池底层使用享元设计模式实现.

4.享元设计模式

面向对象可以非常方便的解决一些扩展性的问题,但是在这个过程中系统务必会产生一些类或者对象,如果系统中存在对象的个数过多时,将会导致系统的性能下降.对于这样的问题解决最简单直接的办法就是减少系统中对象的个数.享元模式提供了一种解决方案,使用共享技术实现相同或者相似对象的重用.

享元模式的核心在于享元工厂类,享元工厂类的作用在于提供一个用于存储享元对象的享元池,用户需要对象时,首先从享元池中获取,如果享元池中不存在,则创建一个新的享元对象返回给用户,并在享元池中保存该新增对象.

public class FlyweightFactory {
private HashMap flyweights = new HashMap(); public Flyweight getFlyweight(String key) {
if (flyweights.containsKey(key)) {
return (Flyweight) flyweights.get(key);
} else {
Flyweight fw = new ConcreteFlyweight();
flyweights.put(key, fw);
return fw;
}
}
}

一个例子**经典:

假如我们有一个绘图的应用程序,通过它我们可以出绘制各种各样的形状、颜色的图形,通过享元模式我们就可以实现该属性的共享了.如下:

首先是形状类:Shape.java.它是抽象类,只有一个绘制图形的抽象方法.

public abstract class Shape {
public abstract void draw();
}

然后是绘制圆形的具体类.Circle.java

public class Circle extends Shape{
private String color;
public Circle(String color){
this.color = color;
}
public void draw() {
System.out.println("画了一个" + color +"的圆形");
}
}

再是享元工厂类.FlyweightFactory

public class FlyweightFactory{
static Map<String, Shape> shapes = new HashMap<String, Shape>(); public static Shape getShape(String key){
Shape shape = shapes.get(key);
//如果shape==null,表示不存在,则新建,并且保持到共享池中
if(shape == null){
shape = new Circle(key);
shapes.put(key, shape);
}
return shape;
} public static int getSum(){
return shapes.size();
}
}

最后是客户端程序:Client.java

public class Client {
public static void main(String[] args) {
Shape shape1 = FlyweightFactory.getShape("红色");
shape1.draw();
Shape shape2 = FlyweightFactory.getShape("灰色");
shape2.draw();
Shape shape3 = FlyweightFactory.getShape("绿色");
shape3.draw();
Shape shape4 = FlyweightFactory.getShape("红色");
shape4.draw();
Shape shape5 = FlyweightFactory.getShape("灰色");
shape5.draw();
Shape shape6 = FlyweightFactory.getShape("灰色");
shape6.draw();
System.out.println("一共绘制了"+FlyweightFactory.getSum()+"中颜色的圆形");
}
}

运行结果:

画了一个红色的圆形
画了一个灰色的圆形
画了一个绿色的圆形
画了一个红色的圆形
画了一个灰色的圆形
画了一个灰色的圆形
一共绘制了3种颜色的圆形

PS享元详细参见:https://github.com/Byronlee/Design-patterns/blob/master/patterns_explain/flyweight_pattern/lecture.md

3、hashCode(),此方法返回当前对象的哈希码值,是根据对象的内存地址算出的一个10进制值,基本类型包装类(Byte,Character,Short,Integer,Long)会返回当前对象的值.重写equals方法的都重写了hashCode()方法,例String类从写的hashCode,字符串内容相等,hashCode就相同,接口Collection中有hashCode和equals方法,所以所有的集合类都实现了,equals和hashCode方法,比较的都是集合的内容是否相同而不是内存地址,内容相同equsl返回true,hashCode返回的也是同一整数.具体在集合中总结.

public class Demo {
public static void main(String[] args) {
GregorianCalendar cal = new GregorianCalendar();
System.out.println(cal.hashCode());
Integer i = ;
System.out.println(i.hashCode());
   String s0="ww";
   String s1=new String("ww");
   System.out.println(s0.hashCode()==s1.hashCode());
}
}

运行结果:

1489234018
5
true

4、toString(),返回该对象的字符串表示形式(返回类名+@+16进制内存地址值),集合,数组等都已实现该方法.

public static void main(String[] args) {
Integer i = new Integer(50);
ArrayList list = new ArrayList();
list.add(50);
list.add("Hello World");
System.out.println(list.toString());
}

运行结果:

[50,Hello Wordl]

5.多线程的函数

notify()
唤醒在此对象监视器上等待的单个线程.
void notifyAll()
唤醒在此对象监视器上等待的所有线程.
void wait()
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法.
void wait(long timeout)
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量.
void wait(long timeout, int nanos)
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量.

  

javase(7)_Objcet类的更多相关文章

  1. Java匹马行天下之JavaSE核心技术——工具类

    Java匹马行天之JavaSE核心技术——工具类 一.Object类 java.lang.ObjectObject类是所有类直接或间接的父类 常用的方法: toString():以字符串形式返回对象的 ...

  2. JavaSE 面试题: 类初始化和实例初始化等

    JavaSE 面试题 类初始化和实例初始化等 class Father { private int i = test(); private static int j = method(); stati ...

  3. [javaSE] 反射-获取类的成员属性和构造方法

    成员属性和构造方法皆为对象,通过Class对象的方法可以得到 package com.tsh.reflect; import java.lang.reflect.Constructor; import ...

  4. [javaSE] 反射-Class类的基本操作

    获取类的名称 获取该类的方法 获取方法的返回值类型 获取方法的名称 获取方法的参数的类型 package com.tsh.reflect; import java.lang.reflect.Metho ...

  5. [javaSE] 反射-Class类的使用

    JAVA-Reflect 专题 ①Class类的使用 ②方法的反射 ③成员变量的反射 ④构造函数的反射 ⑤java类的加载机制 Ⅰ在面向对象的世界里,万事万物皆为对象 类是对象,类是java.lang ...

  6. JavaSE(一) IO类层次关系和各种IO流的用法总结

    今天把IO流的这一知点进行一下总结,因为在之前使用io流的时候,就只知道几个重点常用的IO类,比如FileInputStream,BufferedInputStream(缓冲流)等等,但是不知道它处于 ...

  7. JavaSE之Math类

    下列哪个选项是正确计算42度(角度)的余弦值? double d=Math.cos(42) double d=Math.cosine(42) double d=Math.cos(Math.toRadi ...

  8. 06 - JavaSE之常用类

    String类 String 类是不可变的字符序列,String 字符串一旦分配好就不能改变其内容和长度了.(如果使用 s1+=s2; 并不是在s1的后面开辟空间将s2拷贝其内,而是另外开辟一个空间, ...

  9. [javaSE] 集合工具类(Collections-sort)

    java为我们提供了一个集合的工具类,方便我们对集合进行操作,里面的方法都是静态方法. Collections.sort()方法,参数:List<T>集合对象,这个对象带着泛型,是为了保证 ...

随机推荐

  1. Android NDK开发指南(二)Android.mk文件

    http://www.cnblogs.com/yaozhongxiao/archive/2012/03/06/2382225.html 1.  概述 Android.mk文件是用来描述build sy ...

  2. 编译keepalived 方法

    作者的环境: redhat 6.5 64 位版 在编译keepalived 前,需要提前给环境安装两个依赖包--zlib和openssl 编译 zlib 库 参考作者之前的博客 http://www. ...

  3. 安装CocoaPods,ios的库安装工具

    1.需要ruby环境,mac pro自带了 2.终端输入:sudo gem install cocoapods

  4. C - Catch That Cow POJ - 3278

    //标准bfs #include <iostream> #include <cstdio> #include <algorithm> #include <cm ...

  5. JDBC | 查询表数据行数

      两种方法: 1. "select * from userinfo" 利用ResultSet的last和getRow方法来获得ResultSet的总行数,适用于在查询数据的同时统 ...

  6. python虚拟环境四

    python虚拟环境管理器 我们在使用python虚拟环境的时候,最好安装一个虚拟环境管理器,这样我们就能很方便的管理python的 虚拟环境,而python的虚拟环境管理工具包就是virtualen ...

  7. Gym - 101810F ACM International Collegiate Programming Contest (2018)

    bryce1010模板 http://codeforces.com/gym/101810 #include<bits/stdc++.h> using namespace std; #def ...

  8. 谈PHP中的钩子

    钩子,英文为hooks.在程序中应用相当广泛,但是究竟什么是钩子呢?本人介绍一下目前本人对钩子的理解和相关心得. 假如有这么一段程序流: function fun(){ funA(); funB(); ...

  9. [POJ1185][NOI2001]炮兵阵地 状压DP

    题目链接:http://poj.org/problem?id=1185 很裸的状压,考虑对于一行用二进制储存每一种的状态,但是状态太多了做不了. 观察到有很多状态都是不合法的,于是我们预处理出合法的状 ...

  10. arcgis jsapi接口入门系列(4):用代码在地图画点线面

    PS:用代码画点这样写是为了跟后面的用鼠标画点线面区分出来 画点 drawPointGraphic: function () { //点有多种样式:一般的点,显示文字,显示图片 //一般的点 let ...