黑马程序员_JavaAPI

来源:互联网 发布:windows10的编程软件 编辑:程序博客网 时间:2024/05/22 05:00

 ----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

System.out.println();是可以输出引用类型数据的!
必须收当定义了一个学生类的时候,而这个学生类什么也没有定义,
只是一个空类,运行测试类的时候,是可以实例化的,然后
System.out.println();直接输出 学生类对象的!
输出的是:cn.itcast.Student@1db05b2
输出语句可以输出引用类型的!
cn.itcast.Student@1db05b2   1db05b2后面的是一个16进制的地址值!从这个地方引用出来源码!
找到JDK中的,有一个src打包文件, java文件夹 然后是lang包,其中找到了math.java文件。
我们之前就用过math文件,但是用的都是class文件,
也就是说:我们用的文件统统都打包放到了lib文件中
在tools.jar 和dt.jar中  这两个jar文件里面放的都是class文件。
于是:如果都在这些jar文件中,那是如何使用的?
都是在每个项目的JRE System Library【JavaSE-1.7】中都可以找到,这里面装的都是class文件
导入包的时候,都是直接已经有了!代码都已经有了!类似于我们自己导入我们自己的包。相似。
我们用的ApI都在里面。其实,API就是一个目录索引!
因此:
以后,如果我们在使用API提供的功能的时候,知道怎么用了,还是想知道如何实现的
那就必须看源码!
源码是什么就是  (.java  文件)
System.out.println  前面的System.out是一个对象,println()是一个方法!
也就是这个可以通过类名调用,也就是前面直接就是一个对象。

* class System { * public static final PrintStream out = ...; *  * //自己定义的 * public static final int x = 10; *  *   使用的时候: *   int y = System.x; *  
 *   下面这个也应该理解:
 *   PrintStream ps = System.out;//   System.out  是ps对象的,而ps对象时PrintStream的
System.out 是一个输入流中的一个方法!!
那这个地方问道之前的  1db05b2  是怎么输出的!
看源码:
如何看:在查看的内容,左手Ctrl 右手点击!
在Eclipse中的window中的Prefence中  Installed JREs中,有关于JDK
安装路径,其实导入的时候已经导入了所有的文件 
class 文件,和  java文件!
类object是层次结构的根类,每个类都是以object作为超类(根类),所有的
类都直接或者间接的继承自boject类!
如果我定义一个对象s,  然后我System.out.println(s); 用输入语句输出这个s,
这个s属于某个类,这个类一定是object的子类,继承自object,也就是说,s可以调用object的方法。
其实,System.out.println(s); 就是用的就是object中的 tostring()方法。
这以写成 System.out.println(s.tostring());
输出语句,输出对象的时候,一般调用的是对象的toString()方法,这个方法来自object
要记住object类是从JDK1.0开始使用的!
要记住的方法:toString():返回该对象的字符表示。
返回该对象的字符串表示。
通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。
结果应是一个简明但易于读懂的信息表达式。
建议所有子类都重写此方法。
返回的值等价于:
getClass().getName() + '@' + Integer.toHexString(hashCode())    
cn.student.student@530cf2
等价于:
该类的类名,应该是全路径+@+对象的哈希值的十六进制的表示。
object也有一个方法,也就是他的本省getclass();
getClass():返回此 Object 的运行时类
public  final  Class  getClass()
其实getClass()返回的是class文件的对象。
class是字节码文件,于是这个类就是表示字节码文件的类!反射的时候讲!
所以上述getClass().getName() + '@' + Integer.toHexString(hashCode()) 
getName()是返回的是getClass()的,而getClass()返回的又是public  final  Class  getClass()中的Class!
于是找到了class类,属于java.lang,里面有个方法,getName
getName类:以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。 
 String.class.getName()     returns "java.lang.String" byte.class.getName()     returns "byte" (new Object[3]).getClass().getName()     returns "[Ljava.lang.Object;" (new int[3][4][5][6][7][8][9]).getClass().getName()     returns "[[[[[[[I"
通过对getNeme中的了解!
public final Class getClass():放回此object的运行时类。反射的时候讲。
简单记:getName():次对象返回的所表示的类或接口名。一定是带包的。
getClass().getName() + '@' + Integer.toHexString(hashCode())
Integer.toHexString(hashCode())
首先解释了  hashCode() 
返回该对象的哈希码值!
简单记忆就是这个哈希值可以理解为对象的逻辑地址值,
但不是对象的实际地址值。(java拿不了对象的实际地址值)
Integer.toHexString(hashCode())
Integer.toHexString() 推断HexString是一个静态的方法,Integer是一个类名。
toHexString()方法:
如果对象是空的,运行返回一个对象逻辑地址值时:每一次都不一样,
因为每一次运行的时候都是从新申请空间。所以每一次值都不一样!
System.out.println(s);//cn.student.student@530cf2
System.out.println(Integer.toHexString(s.hashCode()));//530cf2
System.out.println(s.hashCode());//5442802
我们可以发现第三个地址是将第一个地址换算过来的!
讲了这个多,才发现toString()的方法实现!
但是之前提到的:
要记住的方法:toString():返回该对象的字符表示。
返回该对象的字符串表示。
通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。
结果应是一个简明但易于读懂的信息表达式。//
建议所有子类都重写此方法。
结果应该是一个简明但易于读懂的,如果是对象输出的时候输出的不是地址值,而是成员变量。
所以子类要重写toString()方法!
System.out.println(s);
//这个地方应该调用的是父类的,但是,对toString()进行了重写,
//于是,直接对student类进行了调用。
//这里就是对多态的应用。
//但是为什么没有直接调用student,因为有可能调用的不是student
//也可以是teacher类。所以在源码中
//写的是(object x)
以上说的就是:
如果没有将toString()重写的话,那就是无聊的一堆地址值。
如果重写了,那就是输出应该得出的值。
结论就是:当输出对象的时候不是地址值得话,那就是重写了toString()方法,
 当输出对象的时候是地址值得花,那就是没重写toString()方法!
连个对象是不会相等的,因为不同的对象有不同的地址。
System.out.println(s1==s2);//结果是false;
如果s1=s2;
System.out.println(s1==s2);//这个时候对象就是相等的,true;
equals  object类中方法。
        指示其他某个对象是否与此对象“相等”。 这里比较对象是比较的地址值。
面试题:
==和equals的区别
==:     在基本类型的比较中: 比较的是基本类型的值是否相同?      默认比较的是:对象地址值
        在引用类型的比较中: 比较的是对象的地址值是否相同?
equals:在默认的情况下,我们比较的是:对象的地址值是否相同。     默认比较的是:对象地址值
但,一般我们都会重写该方法,用于比较对象的内容是否相同。
length() :String()类中的方法!返回字符串的长度。
String()是不需要导入包的!
StringBuffer 是属于java.lang包下,只要在这个包下面是不需要导包的。
StringBuffer是线程安全的可变字符序列。
是一个可变的字符串!
同时:StringBuffer也是从JDK1.0版本就开始有了。
StringBuffer是线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。
虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
String和StringBuffer的区别是:
String的长度固定,但是StringBuffer长度是可以发生变化的。
比如有两个空间hello、world!
如果是String的话,必须要从新开辟空间,同时hello和world这两个空间都浪费了,
但是:StringBuffer却是可以直接将world补充到hello的那个空间里的! 
StringBuffer叫做字符串的缓冲区,所以说跟String中的方法有许多相似处,
用法一样。在刘意讲的视频中,就没有讲。
StringBuffer中重点讲的两个删除方法是:delete   deleteCharAt
这两个方法都是从JDK1.2方法开始的。
StingBuffer是从1.1开始的,而这两个方法都是从1.2开始的。也就是说:
不是出现类之后就相应的出现了类中的方法。
如果说:一个类中的方法没有标明版本,那就是说:方法是随着类的出现而出现的。
StringBuffer中的方法,append(),insert(),delete(),deleteCharAt(),返回的都是
StringBuffer的类型。
当翻开API功能文档的时候记得看每个类和方法的版本。有时候类出现的版本和方法的版本不一样。
开发工具产生的方法都是private修饰的,并不是public修饰的,所以说:我们在开发的时候,建议还是

用public修饰。之所以用private修饰是因为能够更好的封装。


 ----------- android培训java培训、java学习型技术博客、期待与您交流! ------------















 














0 0