day12
- API使用和类库
1.1 API的使用
API : Application Programming Interface 应用程序开发接口
接口 : 规则限定
API对于咱们开发人员,相当于是一个Java语言的而开发手册,API中包含JDK给开发人员写好的,所有的类文件,以及这些类文件的定义方式,以及使用方式
1.2 类库
类库 : 程序员最终开发的项目代码,需要交付给客户. 交付的都是.class文件
一系列的.class文件集合在一起,形成了一个jar包,jar包在Java中,属于标准的文件压缩包
在eclipse中,创建一个工程,在工程中,包含JRE System Libary (JRE系统类库),包含了JDK给你写好的,程序员可以直接使用的一些类文件
1.2.1 Jar包的导入和导出
- jar包的导出 : 将写好的程序中的.class文件,导出成一个jar包,可以给其他人或者客户使用
点击项目工程—>鼠标右键—>Export(导出)
点击Java---->JAR file---->Next
点击Next之后,需要填写一个jar包生成之后,存放的路径:
导出jar包成功
- 将jar包导入到项目中使用
1)点击项目工程---->右键---->new —> Folder(文件夹),在项目工程下新建一个lib文件夹
给文件夹起名为lib
- 将准备好的jar包,复制到lib文件夹下,ctrl+c ,ctrl+v
- 在lib文件夹下,点击jar包---->鼠标右键—>build path ----->add to build path
项目导入成功后,可以在使用导入项目中的类文件代码
-
Object类
2.1 Object类的概述
Object类,来自于java.lang包
Object是所有类的根类,最顶层父类. 每个类都使用 Object 作为超类。当一个类没有定义直接父类的时候,Object类就默认成为这个类的父类. 包括数组都实现Object类的方法
class A extends B{}
class B extends Object{} -
Object 类也有构造方法,可以创建对象,因为Object是顶层父类,Object再无父类,Object构造方法中,没有super()
代码
package com.zgjy.objectDemo;
public class CreateObject {public static void main(String[] args) {
// 创建一个Object对象, Java中,来自于java.lang包中的类
// 可以直接使用,不需要导包
Object obj = new Object();
//java.lang.Object@15db9742
System.out.println(obj);
}
}
2.2 Object类中的常用方法
2.2.1 getClass() 方法
getClass() : 返回运行时类(反射内容),返回值类型Class类型
所有类在内存运行时,都属于运动状态,这种运动状态的类型都属于Class类型
Class类中,有一个方法,叫做getName() : 能返回带有完整包的的类名字符串结果
代码
package com.zgjy.objectDemo;
public class CreateObject {
public static void main(String[] args) {
// 1. 创建一个Object对象, Java中,来自于java.lang包中的类
// 可以直接使用,不需要导包
Object obj = new Object();
// 2. Object中的getClass方法,返回正在运行的Object类的类型
Class c = obj.getClass();
System.out.println©;// class java.lang.Object
}
}
package com.zgjy.objectDemo;
// Person类没有直接父类,Object默认成为Person的父类
public class Person {
// Person继承了Object中的所有非私有方法
}
package com.zgjy.objectDemo;
public class TestObject {
public static void main(String[] args) {
Person p = new Person();
// 1. getClass() 方法,返回值类型Class类型
Class c = p.getClass();
//class com.zgjy.objectDemo.Person
System.out.println©;
// 2. Class类中方法,getName() : 返回带有完整包名的类名
// 返回值结果字符串类型
String name = c.getName();
//com.zgjy.objectDemo.Person
System.out.println(name);
}
}
2.2.2 hashCode()方法
hashCode() : 返回对象的哈希码值,返回值类型int类型
解释 :
- hashCode()方法一般用于比较,多个对象是否是同一个对象,去重复
- 将每一个对象的内存地址,转换成一个int类型的数据进行返回,根据int类型结果是否相等,判断对象是否是同一个对象
验证规律:
- 不同的对象,返回不一样hashCode值
- 相同的对象,返回的hashCode的值是相同的
代码
package com.zgjy.objectDemo;
public class TestObject {
public static void main(String[] args) {
Person p = new Person();
// 1. 再次创建一个Person对象
Person p1 = new Person();
// 2. Object中hashCode() 方法
int hash = p.hashCode();
int hash2 = p1.hashCode();
System.out.println(hash);
System.out.println(hash2);
System.out.println(hash == hash2);
//3. 相同的对象,返回相同的hashCode值
int hash3 = p.hashCode();
System.out.println("-----"+hash3);
System.out.println(hash == hash3);
}
}
2.2.3 toString()方法
Object源代码: 将对象的地址值打印出来
public String toString() {
//com.zgjy.objectDemo.Person@6d06d69c
return getClass().getName() + “@” + Integer.toHexString(hashCode());
}
- getClass().getName() : 结果String类型,带有完整包名的类名
- “@” : 表示一个分隔符
- Integer.toHexString(hashCode()) : 将对象的hashCode的int类型结果,转换成一个16进制数
- toString方法打印出了对象在内存中对应的16进制地址值
- 很多场景下,toString方法打印出对象在内存中的地址值,意义不大,因此,需要子类重写父类Object中的toString方法,通常toString打印的结果是当前对象的成员变量值
如何重写 :
使用快捷键 alt + shift +s : 去选择你想要生成的代码
代码
package com.zgjy.objectDemo;
// Person类没有直接父类,Object默认成为Person的父类
public class Person {
private String name ;
private int age ;
// Person继承了Object中的所有非私有方法
// alt +shift +s : 能将eclipse提供的自动生成代码列表展示出来
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {// 重写了父类的toString方法,打印对象中成员变量的值
return “Person [name=” + name + “, age=” + age + “]”;
}
}
package com.zgjy.objectDemo;
public class TestObject {
public static void main(String[] args) {
Person p1 = new Person();
// 1. 没重写toString方法
String ss = p1.toString();
// com.zgjy.objectDemo.Person@6d06d69c
System.out.println(ss);
// 2. 重写toString方法后,打印结果Person [name=null, age=0]
System.out.println(p1);
}
}
2.2.4 equals()方法
Object类是所有类的父类,equals方法的参数是一个父类类型,那么方法实际调用时,Object类本身以及Object类的任意子类对象,都可以作为参数传递,使用的是多态
equals(Object obj) : equals方法用于比较两个对象是否相等,两个对象分别是,一个是equals方法的调用者,一个就是equals方法的参数,返回值类型boolean
equals Object源代码比较的是两个对象的地址值是否相等
在真实的而开发场景中,一般不比较对象地址,比较对象的内容,比较对象的成员变量的值(去重复),重写equals, alt + shift + s ,重写equals方法
public boolean equals(Object obj) {//
return (this == obj);
}
this关键字 : 表示本类对象引用,this表示对象引用
哪个对象调用了带有this的方法,那么this就表示哪个对象
代码
package com.zgjy.objectDemo;
// Person类没有直接父类,Object默认成为Person的父类
public class Person {
private String name ;
private int age ;
// Person继承了Object中的所有非私有方法
// alt +shift +s : 能将eclipse提供的自动生成代码列表展示出来
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return “Person [name=” + name + “, age=” + age + “]”;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
package com.zgjy.objectDemo;
public class TestObject {
public static void main(String[] args) {
// 1. equals 方法
Person per = new Person();
Person per1 = new Person();
// 比较per对象和per1对象是否相等
// this == obj , this就表示per对象
// 哪个对象调用了带有this的方法,那么this就表示哪个对象
// Object源代码,比较的是两个对象的地址值是否相等
boolean boo = per.equals(per1);
System.out.println(boo);// false
}
}
2.2.5 == 和 equals的区别
- == 比较运算符,判断符号两边的数据是否相等
- equals 方法,判断两个对象是否相等
区别:
-
== , 可以比较基本数据类型,判断两个数据是否相等
== , 可以比较引用数据类型,判断两个对象的地址值是否相等 -
equals , 不能比较基本数据类型
equals比较引用数据类型, Object源代码比较的是两个对象的地址值是否相等
Object子类重写了equals方法后,比较的是两个对象的成员变量值是否相等 -
String类
3.1 String类的概述
String类,来自于java.lang包,使用的时候不需要导包(java.lang包下的所有的类使用的时候,不需要导包,可以直接使用) -
String就表示字符串,Java中,所有的字面意义上的””,都是String类型的对象
-
String类型字符串,叫做常量字符串,常量指使用final修饰的变量
private final char value[];
在Java中定义了一个字符串,”字符序列”,String底层将一个字符串里面的每一个字符获取到,然后封装到一个数组中,private final char value[];
定义:
String s = “abc”;//private final char value[]; private final char[] value = {‘a’,’b’,’c’};
3.2 String类的构造方法
-
空参数构造 : String()
String s = new String(); // 创建一个空的字符串 -
String(String original) : 创建一个与original一致的字符串
String类型字符串,存储在方法区的常量池中,如果有多个字符串常量内容一致,那么会指向常量池中的同一块内存区域
-
String(byte[] bytes) : 将一个byte类型的数组,通过系统默认的编码集,将byte类型数据,转换成字符,将字符转换成字符串
-
String(byte[] b , int offset ,int length ): 将byte数组的一部分转换成字符串,从数组的offset索引位置开始,截取length长度的字节
-
String(char[] ch) : 将一个字符数组,转换成字符串
-
String(char[] ch, int offset , int length) : 将字符数组的一部分,转换成一个字符串,从数组offset索引值开始,截取length个字符
代码
package com.zgjy.stringdemo;
public class StringDemo {
public static void main(String[] args) {
// 1. "abc"就是一个String类型的对象,相当于new
String s = “123”;
System.out.println(“abc”);
// 2. String类型的构造方法,String()使用很少
String s1 = new String();
System.out.println(s1);
// 2.1 String(String org): 创建一个与org一致的字符串
// 在内存中开辟两块内存空间
String s2 = new String("1234");
System.out.println(s2);
// 2.2 String(byte[] b) : 3.将一个byte类型的数组,通过系统默认
//的编码集,将byte类型数据,转换成字符,将字符转换成字符串
byte[] b = {96,97,98,99};// a
String s3 = new String(b);
System.out.println(s3);//`abc
// 2.3 String(byte[] b , int offset ,int length ): 将byte数组的一部分转换成字符串
// ,从数组的offset索引位置开始,截取length长度的字符
String s4 = new String(b,1,2);
System.out.println(s4);// ab
// 2.4 String(char[] ch) : 将一个字符数组,转换成字符串
char[] ch = {'A','a','8','夹'};
String s5 = new String(ch);
System.out.println(s5);//Aa8夹
// 2.5 String(char[] ch, int offset , int length) : 将字符数组的一部分,
// 转换成一个字符串,从数组offset索引值开始,截取length个字符
String s6 = new String(ch,0,3);
System.out.println(s6);//Aa8
}
}
3.3 String字符串常量在内存中的存储
代码
package com.zgjy.stringdemo;
public class StringTest {
public static void main(String[] args) {
String s = “123”;
changeString(s);
System.out.println(s);// 123
}
public static void changeString(String s) {
s = “abc”;// 将s的地址值修改了
System.out.println(s);// abc
}
}
String常量在内存中的运行存储过程:
3.4 String类中的判断方法
- equals(Object obj) : String重写了父类的equals方法,比较字符串的内容是否相等,返回值类型boolean
- contains(String s) : 判断字符串中是否包含s字符串
- startsWith(String s) : 判断字符串是否以s字符串开头
- endsWith(String s) : 判断字符串是否以s字符串结尾
- isEmpty() : 判断字符串是否为空,如果字符串为空,返回true,如果不为空,返回false
代码
package com.zgjy.stringdemo;
public class StringPanDuanMethod {
public static void main(String[] args) {
// 1. equals(Object obj) :
String s = "abc";
String s1 = "123";
boolean boo = s.equals(s1);
System.out.println(boo);// false
String s2 = "ABc";
boolean boo1 = s.equals(s2);
System.out.println(boo1);// false
// 2. contains
String s3 = "helloworld";
boolean boo2 = s3.contains("llo");
System.out.println(boo2);// true
// 3. startsWith : 判断字符串是否以s字符串开头
// endsWith : 判断字符串是否以s字符串结尾
String s4 = "hello1234";
boolean boo3 = s4.startsWith("hello12");
System.out.println(boo3);// true
boolean boo4 = s4.endsWith("1234");
System.out.println(boo4);// ture
// 4. isEmpty():判断字符串是否为空,如果字符串为空,返回true,如果不为空,返回false
// null 值调用任何方法,全部报出NullPointerException
String s5 = null;
// NullPointerException
// boolean boo5 = s5.isEmpty();
System.out.println(s5);
String s6 = "";// 空字符串
boolean boo5 = s6.isEmpty();
System.out.println(boo5);// true
System.out.println(s4.isEmpty());// false
}
}
3.5 String类的获取功能
- length() : 求字符串的长度,返回值int类型
- charAt(int index): 求字符串中指定的索引值index,对应的字符,返回值结果char类型
- subString(int index): 获取到字符串的一部分,从字符串的index索引开始,到字符串最后,截取成一个新的字符串,返回值类型String类型
- substring(int beginIndex , int endIndex):
截取字符串的一部分,从beginIndex索引开始到endIndex索引结束
包含开始索引,不包含结束索引
JDK的方法中,针对于两个索引值的操作,一般情况下都是包含开始索引,不包含结束索引 - indexOf(String s) : 获取s字符串在方法调用字符串中第一次出现的所以位置,返回值类型int类型,没有指定s字符串,返回-1的索引值
代码
package com.zgjy.stringdemo;
public class StringGetMethod {
public static void main(String[] args) {
// 1. length() : 求字符串的长度
String s = “helloworld”;
String s1 = “”;
String s2 = " ";// 一个空格也作为一个字符存在
System.out.println(s.length());//10
System.out.println(s1.length());//0
System.out.println(s2.length());//2
// 2. charAt(int index):返回字符串中指定索引位置的char字符
// 字符串的索引位置从0开始
char ch = s.charAt(7);
System.out.println(ch);// r
for( int i = 0 ; i< s.length() ; i ++) {
System.out.println("----"+s.charAt(i));
}
// 3. substring(int index):获取到字符串的一部分,从字符串的index索引开始,
//到字符串最后,截取成一个新的字符串,返回值类型String类型
String s3 = "1234abcd";
String ss = s3.substring(5);
System.out.println(ss);//bcd
// substring(int beginIndex , int endIndex):
// 截取字符串的一部分,从beginIndex索引开始到endIndex索引结束
// 包含开始索引,不包含结束索引
// JDK的方法中,针对于两个索引值的操作,一般情况下都是包含开始索引,不包含结束索引
System.out.println(s3.substring(1, 5));//234a
//4. indexOf(String s): 获取s字符串在方法调用字符串中第一次出现的所以位置
//,返回值类型int类型,没有指定s字符串,返回-1的索引值
String s4 = "12234567ty";
System.out.println(s4.indexOf("2"));//1
System.out.println(s4.indexOf("9"));//-1
}
}
3.6 String类的转换功能和其他功能
- toCharArray() : 将一个字符串转换成一个字符数组,返回值类型字符数组类型
- toUpperCase(): 将字符串中的所有字符,转换成大写,返回值类型字符串类型
- toLowerCase(): 将字符串中的所有字符,转换成大写,返回值类型字符串类型
- trim(): 去除字符串前后的空格和制表符
代码
package com.zgjy.stringdemo;
import java.util.Arrays;
public class StringZHuanHuanMethod {
public static void main(String[] args) {
// 1.toCharArray() : 将一个字符串转换成一个字符数组,
// 返回值类型字符数组类型
String s = "hello";
char[] ch = s.toCharArray();
System.out.println(Arrays.toString(ch));
// 2. toUpperCase(): 将字符串中的所有字符,转换成大写,返回值类型字符串类型
String s1 = "helloW一23";
String ss = s1.toUpperCase();
System.out.println(ss);
// 3. toLowerCase(): 将字符串中的所有字符,转换成大写,返回值类型字符串类型
System.out.println(s1.toLowerCase());
// 4. trim() : 去除字符串前后的空格和制表符
String s2 = " ";
String ss1 = s2.trim();
System.out.println(ss1.length());// 0
String s3 = " 34 5 ";
String ss2 =s3.trim();
System.out.println(ss2);
System.out.println(ss2.length());// 5
}
}
快捷查看方法:
-
查看类或者方法的源代码,ctrl+点击类名或方法名
-
导入JDK源文件
-
看一个类文件中的所有的成员大纲,outline中,可以查看,点击某一个成员,还会快速的定义到指定的成员位置
-
alt + shift + s : 快捷键,生成eclipse自动生成代码列表,选择setter 和 getter,自动生成私有成员对应的set和get方法 ; 选择 toString ,自动生成toString方法重写