一、final 关键字
final 关键字
final 可以修饰类、属性、方法
final 修饰属性 --> 该属性不能被修改(重新指定内存位置)
final修饰属性:表示这个值已经被确定了,不能被修改,但是赋值过程可以在声明时赋值,也可以在构造方法中赋值
final修饰方法、类 —> 不可以被重写、继承
使用场景:容器(二维数组、对象):注意自增a++虽然没有改变地址,但其不是容器,不可以改变
二、static 关键字
static 静态
static 可以修饰属性、方法、类(?内部类:类里面才可以加static)、代码块
static 修饰属性 —> 叫做静态属性,也有叫做类变量(区分成员变量,实例变量)
类变量的调用规则:可以使用对象来调用 ,也可以使用类名直接调用(public static int a)
实例变量的调用规则:只可以使用对象来调用 (public int a)
类变量全局只有一个,对象共同使用。
static 修饰方法 --> 叫做静态方法(类方法)
调用与静态属性类似
static 修饰的属性和方法可以被继承(有的叫包含),静态方法不可以被重写(就近原则)
static 动态与静态的调用关系:(静态的在要用类的时候全部加载进元数据区或常量池中)动态可以调用静态,静态不可调用动态。先静后定,先父后子。
静态代码块
static{
}
加载并运行,只加载一次就完了,已经加载后就不在进行加载了
三、接口 interface
接口内所有属性都是静态(static)常量(final),就是public,不可有其他的访问控制
//接口内的方法全是抽象方法(默认public、abstract),没有承载普通方法的能力
//接口不是类,没有构造方法
//里氏替换原则可以成立
//接口与接口之间为多继承,类中为单继承
//eg: public interface IUSB extends IFoo,ITest {}
//仍是抽象方法,但是可以写方法体,jdk1.8后新特性
default void input() {
}
类、抽象类与接口关系:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tESmUvW4-1618794531254)(C:\Users\11141\Desktop\捕获.JPG)]
四、常用类 (String类)
Java String 类
字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。
创建字符串
创建字符串最简单的方式如下:
String str = “AAAA”;
在代码中遇到字符串常量时,这里的值是 “AAAA”",编译器会使用该值创建一个 String 对象。
和其它对象一样,可以使用关键字和构造方法来创建 String 对象。
用构造函数创建字符串:
String str2=new String(“aaaa”);
String 创建的字符串存储在公共池中,而 new 创建的字符串对象在堆上:
String s1 = “aaaa”; // String 直接创建 String s2 = “aaaa”; // String 直接创建 String s3 = s1; // 相同引用 String s4 = new String(“aaaa”); // String 对象创建 String s5 = new String(“aaaa”); // String 对象创建
String 类有 11 种构造方法,这些方法提供不同的参数来初始化字符串,比如提供一个字符数组参数:
StringDemo.java 文件代码:
public class StringDemo{ public static void main(String args[]){ char[] helloArray = { ‘r’, ‘u’, ‘n’, ‘o’, ‘o’, ‘b’}; String helloString = new String(helloArray); System.out.println( helloString ); } }
以上实例编译运行结果如下:
runoob
**注意:**String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了(详看笔记部分解析)。
如果需要对字符串做很多修改,那么应该选择使用 StringBuffer & StringBuilder 类。
字符串长度
用于获取有关对象的信息的方法称为访问器方法。
String 类的一个访问器方法是 length() 方法,它返回字符串对象包含的字符数。
下面的代码执行后,len 变量等于 14:
StringDemo.java 文件代码:
public class StringDemo { public static void main(String args[]) { String site = "www.baidu.com"; int len = site.length(); System.out.println( "网址长度 : " + len ); } }
以上实例编译运行结果如下:
网址长度 : 14
连接字符串
String 类提供了连接两个字符串的方法:
string1.concat(string2);
返回 string2 连接 string1 的新字符串。也可以对字符串常量使用 concat() 方法,如:
"我的名字是 ".concat("aaaa");
更常用的是使用’+'操作符来连接字符串,如:
"Hello," + " aaaa" + "!"
结果如下:
"Hello, aaaa!"
下面是一个例子:
StringDemo.java 文件代码:
public class StringDemo { public static void main(String args[]) { String string1 = “菜鸟教程网址:”; System.out.println(“1、” + string1 + “www.runoob.com”); } }
以上实例编译运行结果如下:
1、菜鸟教程网址:www.runoob.com
创建格式化字符串
我们知道输出格式化数字可以使用 printf() 和 format() 方法。
String 类使用静态方法 format() 返回一个String 对象而不是 PrintStream 对象。
String 类的静态方法 format() 能用来创建可复用的格式化字符串,而不仅仅是用于一次打印输出。
如下所示:
System.out.printf("浮点型变量的值为 " + "%f, 整型变量的值为 " + " %d, 字符串变量的值为 " + "is %s", floatVar, intVar, stringVar);
//你也可以这样写
String fs; fs = String.format("浮点型变量的值为 " + "%f, 整型变量的值为 " + " %d, 字符串变量的值为 " + " %s", floatVar, intVar, stringVar);
String 方法
下面是 String 类支持的方法,更多详细,参看 Java String API 文档:
String:在java.lang这个包下面,这个包下面的类型,是不需要导包就可以使用的
String是一个类型,遵循java对类型的定义。
String不能用==判别内容,得用equals方法
equals():比较对象,若对象不同一定为falseS。
hashCode和equals的关系或区别:equals方法是用来判断俩个对象中的值或者侧重点是否相等的一个方法
而hashCode是用来给出对象在内存中的一个标识,标识相同不能确定俩个对象相等还是不相等,标识不同,这俩个对象一定不相等
把String当做一个容器来对待,容器具有求长,替换,定位
求长:length()
定位:
知道角标拿内容
charAt() 定位一个字符,参数为角标
subString() beginIndex、endIndex(不包括最后一个字符,不写默认到最后)
知道内容拿角标
indexOf(“参数”) 找到字符串中参数字符串第一次出现的角标,没有返回-1
indexOf(“参数1”,参数2) 找到从参数2开始(包括参数2)开始出现参数1的角标
lastIndexOf(“参数”),从后往前找,其使用与indexOf类似
//System.out.println(string.lastIndexOf('e',6));
//都不影响原来字符串,重新设置为一个新的字符串赋值
//isEmpty() 注意null(报错)与""(true)的区别
//split(",") 以逗号为分割 存入字符串数组中
五、Java StringBuffer 和 StringBuilder 类
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。
实例
public class AAAATest{ public static void main(String args[]){ StringBuilder sb = new StringBuilder(10); sb.append("baidu.."); System.out.println(sb); sb.append("!"); System.out.println(sb); sb.insert(8, "Java"); System.out.println(sb); sb.delete(5,8); System.out.println(sb); } }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nJlGIEWB-1618794531262)(https://www.runoob.com/wp-content/uploads/2013/12/2021-03-01-java-stringbuffer.svg)]
以上实例编译运行结果如下:
baidu..
baidu..!
baidu..Java!
baiduJava!
然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
Test.java 文件代码:
public class Test{ public static void main(String args[]){ StringBuffer sBuffer = new StringBuffer(“官网:”); sBuffer.append(“www”); sBuffer.append(".baidu"); sBuffer.append(".com"); System.out.println(sBuffer); } }
以上实例编译运行结果如下:
官网:www.baidu.com
StringBuffer 方法
以下是 StringBuffer 类支持的主要方法:
序号 | 方法描述 |
---|---|
1 | public StringBuffer append(String s) 将指定的字符串追加到此字符序列。 |
2 | public StringBuffer reverse() 将此字符序列用其反转形式取代。 |
3 | public delete(int start, int end) 移除此序列的子字符串中的字符。 |
4 | public insert(int offset, int i) 将 int 参数的字符串表示形式插入此序列中。 |
5 | replace(int start, int end, String str) 使用给定 String 中的字符替换此序列的子字符串中的字符。 |
下面的列表里的方法和 String 类的方法类似:
序号 | 方法描述 |
---|---|
1 | int capacity() 返回当前容量。 |
2 | char charAt(int index) 返回此序列中指定索引处的 char 值。 |
3 | void ensureCapacity(int minimumCapacity) 确保容量至少等于指定的最小值。 |
4 | void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 将字符从此序列复制到目标字符数组 dst 。 |
5 | int indexOf(String str) 返回第一次出现的指定子字符串在该字符串中的索引。 |
6 | int indexOf(String str, int fromIndex) 从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。 |
7 | int lastIndexOf(String str) 返回最右边出现的指定子字符串在此字符串中的索引。 |
8 | int lastIndexOf(String str, int fromIndex) 返回 String 对象中子字符串最后出现的位置。 |
9 | int length() 返回长度(字符数)。 |
10 | void setCharAt(int index, char ch) 将给定索引处的字符设置为 ch 。 |
11 | void setLength(int newLength) 设置字符序列的长度。 |
12 | CharSequence subSequence(int start, int end) 返回一个新的字符序列,该字符序列是此序列的子序列。 |
13 | String substring(int start) 返回一个新的 String ,它包含此字符序列当前所包含的字符子序列。 |
14 | String substring(int start, int end) 返回一个新的 String ,它包含此序列当前所包含的字符子序列。 |
15 | String toString() 返回此序列中数据的字符串表示形式。 |
11 | void setLength(int newLength) 设置字符序列的长度。 |
| 12 | CharSequence subSequence(int start, int end) 返回一个新的字符序列,该字符序列是此序列的子序列。 |
| 13 | String substring(int start) 返回一个新的 String
,它包含此字符序列当前所包含的字符子序列。 |
| 14 | String substring(int start, int end) 返回一个新的 String
,它包含此序列当前所包含的字符子序列。 |
| 15 | String toString() 返回此序列中数据的字符串表示形式。 |