理解:
通俗说:设计一个机器人踢足球,需要进行向前、向后、射门等命令,设计者需要提供一些控制机器人行为的接口类,类中定义了机器人行为的方法;
理解:
需要学习如何使用,不需要关心如何实现。
通过帮助文档学习。
使用帮助文档的方式:
①右键打开该文档;
②找到索引选项卡中的输入框;
③输入所要查询的类,例如Random/Scanner
④看类在哪个包下(注意:java.long下的类是不需要导包的)
⑤看类的描述
⑥看类的构造方法
⑦看成员方法,着重看返回值、方法名、参数、描述信息
案例:使用Scanner获取键盘录入的字符串数据
public class ScannerDemo { public static void main(String[] args){ //创建对象 Scanner sc = new Scanner(System.in); //解释:类名 对象名 = new 类名(参数) // Scanner(System.in)是有参数的构造方法 //接收对象 System.out.println("请输入一个字符串:"); String str = sc.nextLine(); //书写对象调方法 并 接收返回值时,可以直接写对象.方法; 之后使用快捷键补齐Ctrl+Alt+V int isc = sc.nextInt(); //输出字符串 System.out.println("输入的字符串是:" + str); } }
注意:
调用方法的时候,如果方法有明确的返回值,需要用变量接收
可以手动完成,也可以使用快捷键Ctrl + Alt + V
书写对象调方法 并 接收返回值时,可以直接写对象.方法; 之后使用快捷键补齐Ctrl+Alt+V int isc = sc.nextInt(); 也就是先写 sc.nextInt(); 之后使用快捷键Ctrl + Alt + V 实现 int isc = sc.nextInt();String String概述
软件包在java.long包下——使用时不需要导包String类代表字符串,java程序中的所有字符串文字都被实现为此类的对象。例如“abc”就是String类的对象 = java程序中所有双引号字符串都是String类的对象。特点:
①字符串不变,在创建后不能被更改;
②String的值不可以更改,但是它们可以被共享;
③字符串效果上相当于字符数组(char[]),但是底层原理是字节数组(byte[]);JDK8以及之前是字符数组,JDK9及以后是字节数组。
String构造方法
方法名 说明
推荐直接使用直接赋值的方式创建字符串对象
案例:
public class StringDemo { public static void main(String[] args){ //通过无参构造方法创建对象 String str = new String(); System.out.println("str:" + str);//输出str: //通过 String(char[] chs),通过字符数组创建字符串对象 //创建字符数组 char[] arr = {'a','b','c'}; String str1 = new String(arr); System.out.println("str1:" + str1);//输出str1:acx //通过String(byte[] bys),通过字节数组创建字符串对象 byte[] bys = {97,98,99};//字节数组存储内容是数据,也就是字符在计算机低层存储的对应值。97对应的是a String str2 = new String(bys); System.out.println("str2:" + str2);//str2:abc // 直接通过 = “字符串” String str3 = "abc"; System.out.println("str3:" + str3);//str3:abc } }String对象的特点
通过new创建的字符串对象,每一次new都会申请一个内存空间,虽然内容相同,但是地址值不同。
char[] chs = {'a','b','c'}; String s1 = new String(chr); String s2 = new String(chr); 解释:JVM会首先创建一个字符数组,然后每一次new的时候都会有一个新的地址,只不过s1和s2参考的字符串内容是相同的。
以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM都只会建立一个String对象,并在字符串池中维护。
String s3 = “abc”; String s4 = “abc”; 理解:针对第一行代码,JVM会建立一个String对象放在字符串池中,并给s3参考;第二行则让s4直接参考字符串池中的String对象,也就是说它们本质上是通一个对象。
内存示例图:
提到常量池
案例:
public class StringDemo1 { public static void main(String[] args){ //通过构造方法创建对象 char[] chs = {'a','b','c'}; String str1 = new String(chs); String str2 = new String(chs); System.out.println(str1 == str2);//false //通过字符串直接赋值的方式创建对象 String str3 = "abc"; String str4 = "abc"; System.out.println(str3 == str4);//true System.out.println(str1 == str3);//false } }String的比较 使用==做比较
基本类型:比较的是数据值是否相同引用类型:比较的是地址值是否相同 字符串比较内容
由于字符串是引用类型,使用==符号只能比较地址是否相同。字符串是对象,它比较内容是否相同,是通过一个方法来实现的,这个方法叫equals()
public boolean equals(Object anObject) 将此字符串与指定对象进行比较,由于比较的是字符串,所以参数直接传递一个字符串。
案例:字符串对象的地址、内容比较
//字符串地址 内容的比较 public class StringDemo2 { public static void main(String[] args){ //构造方法得到对象 char[] chs = {'a','b','c'}; String str1 = new String(chs); String str2 = new String(chs); //直接赋值得到的对象 String str3 = "abc"; String str4 = "abc"; //比较地址 System.out.println(str1 == str2);//false 由于采用构造方法的方式得到对象,不同的对象会在堆内存中开辟不同的存储空间,所以地址不一样。 System.out.println(str3 == str4);//true 采用直接赋值的方式,字符串会在堆内存中的常量池存储,对应有地址; 使用直接赋值的方式,若两个对象所要赋值的字符串相同(顺序以及大小写相同),那么两个对象在栈内存所存储的堆内存的地址是一样的。 System.out.println(str1 == str3);//false 构造方法创建对象、直接赋值方法创建对象都会另开辟内存空间的。 System.out.println("-----------"); 比较内容,主要判断字符串中字符的顺序和大小写是否一致。 System.out.println(str1.equals(str2));//true System.out.println(str1.equals(str3));//true System.out.println(str3.equals(str4));//true } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)