一、Object
(一)API
1、API:Application Programming Interface,应用程序编程接口
2、接口:用于规定方法名称的规则的集合。定义方法名称、修饰符、返回值类型、参数列表、方法功能等。
3、实际:应用程序编程接口,也包含了Java中的接口、类、枚举以及他们其中的方法
4、学习中,更多侧重于基本的使用,以及一些底层原理,这些内容不需要我们自己去定义,只需要我们调用
(二)类库
1、Java代码编译之后会生成.class文件,.class文件包含了代码中所有的内容,Java程序执行时会执行.class文件,就算没有了源代码,.class文件也能够照常使用
2、Java中可以将.class文件,打成压缩包,形成一个Java特有的压缩文件——jar文件:
(1)jar文件,是Java特有的压缩包格式,一旦获取到了jar文件(jar包),我们就能得到里面所有的.class文件了
(2)jar包的生成:在Eclipse中,我们在需要生成jar文件的工程或者包上,右键选择export -> Java -> jar File -> 选择生成的jar文件存储的路径
(3)jar包的使用:在要是用jar包的工程下,创建一各lib文件夹,用于存放已经生成好的jar包,将jar包粘贴进lib目录下,之后再jar包上右键 -> Build Path -> Add to Build Path(将当前jar包下的类,添加到当前工程的编译路径)
(4)jar包的移除:既需要将jar文件从物理结构删除,也要从逻辑结构删除(在当前工程上右键 -> Build Path -> Configure Build Path -> libraries选项卡中,找到对应的jar文件,选择remove,之后apply)
3、类库:
(1)jar包容量还是太小,一系列的jar文件,就组成了一个类库,library
(2)一旦导入了类库,就相当于拥有了这个类库下的所有jar文件,相当于得到了其中所有的.class文件,就可以使用了
(3)添加类库的方式:
右键工程 -> Build Path -> Add libraries -> 选择要添加的类库即可
(三)Object概述
1、Object是所有类型的顶层父类,是所有类的直接或者间接的父类,所有类型中,都可以使用Object类型的方法(包括数组)
2、随意定义一个Java类型,不显式表示继承哪个类型,都会默认继承Object类
3、Object类型的构造方法:
(1)用于自己创建对象
(2)用于让子类的构造来访问
(3)Object类型创建对象时,Object的构造不会再访问别的类型的构造,因为它就是顶层了,它没有父类了
(四)toString方法
1、getClass() 获取到当前对象所属的类型
2、hashCode() 根据对象的情况,计算出对象的哈希码值
3、toString() 返回对象的字符串表示形式
4、推导过程:
(1)我们直接打印一个自定义类型的对象,打印的是对象的地址值
(2)我们通过对象调用继承而来的toString()方法打印而来的还是对象的地址值
(3)在Object类中,toString()方法确实是在计算并且返回对象的地址,计算公式:
getClass().getName() + “@” + Integer.toHexString(hashCode())
(4)我们通过(1)和(2)得到,直接打印对象的声明引用,会自动调用Object类中的toString()方法,得到地址
(5)但是我们作为人类,不需要地址值,拿到也没用
(6)结合方法重写前使用父类的方法,重写后使用子类的方法,我们在子类中重写toStirng要求返回对象的属性值
(7)在子类中重写toString()方法后,打印的就是对象的属性值
5、重写的原则:不要返回地址值,返回属性值
6、最终操作:我们可以自动生成重写:alt + shift + s S
7、如果以后要打印一个对象,先要显示对象的属性值而非地址值,就要在对象所属的类型中重写toString()方法,让其返回属性值而非地址值
代码示例
public class Demo01_ToString {
public static void main(String[] args) {
Person p = new Person("张三", 23);
//1.getClass方法能够获取到当前对象所属类型
//System.out.println(p.getClass());
//2.直接打印对象的声明引用,展示的是对象的地址值
System.out.println(p);//地址值
//3.对象的地址值由所属类型,艾特符号,十六进制数字三部分组成
//4.toString方法调用后,打印的还是对象的地址值
System.out.println(p.toString());
//5.我们猜测:对象的地址值就是由toString方法得来的
//6.计算对象的哈希码值
System.out.println(p.hashCode());
//7.将哈希码值转换为十六进制数字
System.out.println(Integer.toHexString(p.hashCode()));
//8.toString得到地址值的过程
System.out.println(p.getClass().getName() + "@" + Integer.toHexString(p.hashCode()));
}
}
public class Person {
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
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 String toString() {
return name + "..." + age;
}*/
}
(五)equals方法
1、用于比较两个对象是否相等。这两个对象分别为:调用者对象,参数对象
2、在Object类型中,比较的是两个对象的地址值是否一致
3、实际上,比较两个对象的地址不具有太多的实际意义,我们更希望比较对象的属性值来判断对象是否相等,我们就需要在对象所属类型中重写equals方法
4、最终操作:自动生成equals的快捷键:alt + shift + s H
代码示例
public class Demo02_Equals {
public static void main(String[] args) {
Person p1 = new Person("张三", 23);
Person p2 = new Person("李四", 24);
Person p3 = new Person("张三", 23);
System.out.println(p1.equals(p2));
//false 地址不一样
//true 属性都一样
//equals方法比较是按照地址比较的
System.out.println(p1.equals(p3));
}
}
public class Person {
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
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;
}
/*@Override
public boolean equals(Object obj) {//Object obj = new Person("张三", 23);
//1.向下转型,将参数对象从父类引用转为本类引用
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.age;
}*/
/*@Override
public String toString() {
return name + "..." + age;
}*/
}
(六)==和equals的区别
1、共同点:都是用于比较数据是否相等的方式
2、不同点:
(1)==是运算符,equals是方法
(2)比较的内容不同:==既可以基本数据类型,也可以比较引用数据类型;equals只能比较引用数据类型
(3)比较规则不同:==比较基本数据类型,比较值,比较引用数据类型,比较地址;equals重写前比较地址,重写后比较值
代码示例
public class Demo03_Question {
public static void main(String[] args) {
System.out.println(123 == 123);
Person p1 = new Person("zhangsan", 23);
Person p2 = new Person("zhangsan", 23);
System.out.println(p1 == p2);
//p1.equals(p2);
//123.equals(123);
}
}
二、Scanner类型
(一)概述
1、Scanner类型是一个可以扫描基本类型和字符串的简单文本扫描器,可以指定扫描设备
2、构造方法:
(1)Scanner(File source) 扫描指定的文件
(2)Scanner(String source) 扫描指定的字符串
(3)Scanner(InputStream source) 扫描指定的输入流
3、其中,我们使用过第三个构造方法,Scanner(System.in),其中System.in就是一个输入流,标准输入流,默认关联到键盘
4、扫描器可以解析基本数据类型和字符串
(二)录入基本数据类型
1、方法:
(1)nextByte()
(2)nextShort()
(3)nextInt()
(4)nextLong()
(5)nextFloat()
(6)nextDouble()
(7)nextBoolean()
2、注意事项:
(1)没有nextChar()方法
(2)键盘录入时要符合数据类型的取值范围
(3)当录入float数据的时候,没有必要加F,因为键盘录入的内容,不属于Java代码
(4)多个数据同时录入的时候,每个数据之间用空格也可以作为结束标志
代码示例
import java.util.Scanner;
public class Demo05_InputBasicData {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//byte b = sc.nextByte();
//System.out.println(b);
float f = sc.nextFloat();
int num = sc.nextInt();
System.out.println(f);
System.out.println(num);
}
}
(三)录入字符串
1、方法:
(1)next():可以将空格作为分隔标记
(2)nextLine():通过换行来作为结束标记
代码示例
import java.util.Scanner;
public class Demo06_InputString {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//String str1 = sc.next();//将空格或者回车作为技术标志,不能解析空格
//System.out.println(str1);
String str2 = sc.nextLine();//只以回车(换行)作为结束标志,可以解析空格
System.out.println(str2);
}
}
(四)Scanner类型的小问题以及避免方式
1、问题:当我们使用了可以以空格作为分隔和结束标志的方法后,再紧接着使用nextLine()方法,nextLine()会直接被消耗掉
2、解决办法:
(1)创建两个Scanner对象,新的Scanner上次没有录入数据,内部是干净的,用来录入第二个数据
(2)连续调用两次nextLine方法,第一个消耗掉对象中剩余的内容,第二个等待重新录入
(3)所有录入的内容都是用nextLine方法,之后将字符串表示形式的数据再解析为数据本身所对应的类型
代码示例
import java.util.Scanner;
public class Demo07_QuestionAndAnswer {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//Scanner sc1 = new Scanner(System.in);
//int num = sc.nextInt();
//String str = sc.nextLine();
//sc.nextLine();
String str1 = sc.nextLine();//"123"
int num = Integer.parseInt(str1);
String str2 = sc.nextLine();
System.out.println(num + 1);
System.out.println(str2);
}
public static void test1(Scanner sc) {
//以空格作为结束标志或者分隔符的方法不能解析空格
//int num = sc.nextInt();//录入int数可以忽略空格
//String str = sc.next();//
String str1 = sc.nextLine();
float f = sc.nextFloat();
//System.out.println(num);
//System.out.println(str);
System.out.println(f);
System.out.println(str1);
}
}
三、String类型
(一)概述
1、String类型表示字符串,属于java.lang包,不用导包
2、所有的字符串常量(“abc”)也是String类型的对象
3、字符串字面值常量,存储在方法区的常量池中
4、String类型表示的字符串本身是一个常量,创建后就无法修改(不可变字符序列)
5、不可变的原因:String没有提供任何的set方法能够修改字符串本身
6、图示:
代码示例
public class Demo08_StringIntro {
public static void main(String[] args) {
String str = "abc";
String str1 = "abc";
System.out.println(str);
str = "qwe";
System.out.println(str == str1);
}
}
(二)构造方法
1、String() 创建一个空字符串
2、String(byte[] arr, int offset, int length) 将byte数组的一部分解析为字符串
3、String(char[] arr, int offset, int length) 将char数组的一部分解析为字符串
4、String(String str) 返回参数字符串的副本
5、
6、总结**:其他基本数据类型转换为String,可以参考String类型的构造方法**
代码示例
public class Demo09_StringConstructor {
public static void main(String[] args) {
String s = new String();//""
System.out.println(s);
String str = new String("abc");
System.out.println(str);
}
public static void test2() {
char[] arr = {'a', 'z', 'b', 'q'};
//char -> char[] -> String
String str = new String(arr, 1, 3);
System.out.println(str);
}
public static void test1() {
//byte -> byte[] -> String
byte[] arr = {97, 98, 99, 100};
String str = new String(arr);
System.out.println(str);
String str1 = new String(arr, 1, 2);
System.out.println(str1);
}
}
(三)String类型的判断功能
1、equals(Object obj) 判断调用者字符串和参数字符串内容是否相等
2、equalsIgnoreCase(String anotherString) 忽略大小写判断调用者和参数字符串内容是否相等
3、contains(String str) 判断参数字符串是否为调用者字符串的子字符串
4、startsWith(String str) 判断调用者是否为参数字符串开头
5、endsWith(String str) 判断调用者是否为参数字符串结尾
6、isEmpty() 判断调用者是否为空串
代码示例
public class Demo10_Judge {
public static void main(String[] args) {
/*String name = "张三";
System.out.println(name.startsWith("张"));
String sen = "你吃了吗,思密达";
System.out.println(sen.endsWith("思密达"));*/
String str = "";
String str1 = "a";
System.out.println(str.isEmpty());
System.out.println(str1.isEmpty());
}
public static void test1() {
String str = "qwertyuiop";
String str1 = "qwe";
String str2 = "qwe";
String str3 = "abc";
String str4 = "ABC";
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
System.out.println("admin".equals("aaa"));
System.out.println(str3.equals(str4));
System.out.println(str3.equalsIgnoreCase(str4));
System.out.println(str.contains("123"));
System.out.println(str.contains("qwe"));
System.out.println(str.contains("qwertyuiop"));
}
}
(四)String类型的获取功能
1、length() 返回调用者字符串的长度
2、charAt(int index) 从调用者字符串上获取到指定索引的字符并返回
3、substring(int beginIndex) 从指定索引开始,截取调用者字符串的一部分,直到字符串结尾
4、substring(int beginIndex, int endIndex) 截取调用者字符串的任意一部分,范围:[beginIndex, endIndex)
5、indexOf重载:
(1)indexOf(int ch) 顺序查找指定字符第一次出现的索引
(2)indexOf(int ch, int fromIndex) 从指定位置开始顺序查找指定字符的索引
(3)indexOf(String str) 顺序查找指定字符串第一次出现的索引
(4)indexOf(String str int fromIndex) 从指定位置开始顺序查找指定字符串的索引
6、lastIndexOf重载:和indexOf相反
代码示例
public class Demo11_Get {
public static void main(String[] args) {
String str = "abcabcabc";
System.out.println(str.indexOf('b'));
System.out.println(str.indexOf('b', 2));
System.out.println(str.indexOf("cab"));
System.out.println(str.indexOf("cab", 3));
System.out.println(str.lastIndexOf("cab", 7));
}
public static void test1() {
System.out.println("qwertyuiop".length());
//String -> char
System.out.println("qwertyuiop".charAt(3));
System.out.println("qwertyuiop".substring(5));
System.out.println("qwertyuiop".substring(2, 5));
}
}
(五)String类型的转换功能
1、byte[] getBytes() 将调用者字符串转为byte数组
2、char[] toCharArray() 将调用者字符串转为对应的字符数组
3、toUpperCase() 将字符串转为纯大写
4、toLowerCase() 将字符串转为纯小写
5、concat(String str) 将参数字符串追加到调用者字符串之后(拼串)
6、ValueOf重载:都是静态方法,用于将其他数据类型转换为String类型
代码示例
import java.util.Arrays;
public class Demo12_Transition {
public static void main(String[] args) {
//System.out.println("abcdefg".concat("1234567890"));
String str = String.valueOf(123);
System.out.println(str + 1);
}
public static void test2() {
String str = "HeLlOwORld";
System.out.println(str.toUpperCase());
System.out.println(str.toLowerCase());
}
public static void test1() {
String str = "abc";
byte[] arr = str.getBytes();
System.out.println(Arrays.toString(arr));
char[] arr1 = str.toCharArray();
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
}
}