一、抽象
(一)抽象方法
1、抽象:抽取相似的,相同的代码部分
2、抽象方法:只有方法的声明没有方法的实现,额外在声明上加上abstract关键字,表示一个抽象方法
3、定义格式:
public abstract void 方法名(形参列表);
(二)抽象类
1、可以定义抽象方法的类,普通类不能添加抽象方法
2、格式:
abstract class 类名 {}
public class Demo01_Abstract {
public static void main(String[] args) {
Student stu = new Student();
stu.test();
}
}
abstract class Person {
public abstract void test();
}
class Student extends Person {
@Override
public void test() {
System.out.println("学生类的方法执行了");
}
}
(三)抽象类特点
1、抽象类和抽象方法都必须使用abstract关键字进行修饰
(1)抽象类:abstract class 类名 {}
(2)抽象方法:public abstract void 方法名(形参列表);
2、抽象类和抽象方法的特点
(1)抽象方法必须放在抽象类中
(2)抽象类未必都是抽象方法
3、抽象类不能创建对象,不能实例化
4、抽象类的内容:
(1)成员变量:可以有,子类终究是一个非抽象类,所有成员遍历用于给子类继承
(2)构造方法:可以有;子类在创建对象的时候,子类构造需要访问父类构造,父类构造方法必须存 在,父类构造用于给自己私有的属性进行赋值
(3)非抽象成员方法:可以有:书写一些子类共性的行为,子类就不需要创建方法,提高代码复用性
(4)抽象方法:可以有;由于声明方法,等待子实现类实现抽象方法的逻辑
5、抽象类的用途
(1)虽然抽象类不能创建对象,但是抽象类可以被继承,如果子类是一个实现类,可以将具体的抽象方 法逻辑进行实现
(2)如果子类依然是一个抽象类,就会继承抽象父类的抽象方法以及其他内容,等到再往下一级或者更 多级会遇到子实现类,这个时候再去实现抽象方法的逻辑
public class Demo01_Abstract {
public static void main(String[] args) {
Student stu = new Student();
stu.test();
//new Person();
}
}
/**
* 抽象父类
*/
abstract class Person {
//成员变量可以存在
private String name;
//成员方法可以存在
public void show() { }
//构造方法可以存在:用于子类调用以及给私有属性赋值
public Person() {}
public Person(String name) {
this.name = name;
}
public abstract void test();
}
/**
* 抽象父类
*/
abstract class Teacher extends Person {
}
/**
* 子实现类
*/
class Student extends Person {
public Student() {
}
public Student(String name) {
super(name);
}
@Override
public void test() {
System.out.println("学生类的方法执行了");
}
}
二、代码块
(一)概述
1、使用大括号将一段代码包围起来,具有不同的名称、不同的作用
2、分类:
(1)局部代码块
(2)构造代码块
(3)静态代码块
(4)同步代码块【线程】
(二)局部代码块
1、格式:任意一对大括号包围起来
2、位置:方法中
3、作用:限定变量的生命周期
public class Demo02_BlockInMethod {
public static void main(String[] args) {
{
int num1 = 20;
}
//不能访问
//System.out.println(num1);
}
}
(三)构造代码块
1、格式:任意一对大括号包围起来
2、位置:类成员位置(和方法平级)
3、作用:用于执行所有的构造方法中共性的内容或者给成员变量赋值
public class Demo03_BlockInClass {
public static void main(String[] args) {
//默认初始化 > 显示初始化 > 构造代码块赋值 > 构造方法初始化
//构造代码块赋值 > 构造方法赋值
//new Test01("构造方法赋值").show();
new Test01().show();
}
}
class Test01 {
String name = "显示初始化";
{
name = "构造代码块赋值";
}
public Test01() {
}
public Test01(String name) {
this.name = name;
}
public void show() {
System.out.println(name);
}
}
(四)静态代码块
1、格式:
static {
}
2、位置:类成员位置
3、执行特点
(1)随着类的加载而加载
(2)类只加载一次,所以静态代码块只执行一次
(3)在最初执行,早于所有对象相关的内容
4、作用
(1)给静态成员变量赋值
(2)用于执行哪些必须在最初执行的一些代码,例如:加载配置文件,加载驱动
public class Demo04_StaticInClass {
public static void main(String[] args) {
System.out.println(Test02.name);
}
}
class Test02 {
static String name;
static {
name = "陈舒婷";
}
}
三、String
(一)概述
1、String类型表示字符串,属于Java.lang底下,不需要导包
2、所有的字符串常量也是String类型的对象
3、字符串字面值常量,存储在方法区的静态区中
4、String类型本身为一个常量,不能修改
public class Demo05_String {
public static void main(String[] args) {
String str1 = new String("");
String str = "qwe";
//计算对象的地址值
System.out.println(str.hashCode());
str = "asd";
System.out.println(str.hashCode());
str1.charAt(1);
str.charAt(1);
}
}
(二)构造方法
1、
String():创建一个空字符串
2、
String(byte[] bytes, int offset, int length):将byte数组的一部分解析为字符串
3、
String(char[] value, int offset, int count):将char数组的一部分解析为字符串
4、后面补充
public class Demo06_StringCon {
public static void main(String[] args) {
String str1 = new String();
System.out.println(str1);
byte[] arr1 = {23, 56, 78, 41, 67, 34, 99, 22};
String str2 = new String(arr1, 3, 3);
System.out.println(str2);
char[] arr2 = {'a', '4', 'g', '8'};
String str3 = new String(arr2, 0, arr2.length);
System.out.println(str3);
}
}
(三)常用方法
1、判断功能的方法
equals(Object obj):判断调用者字符串和参数字符串内容是否相等
equalsIgnoreCase(String anotherString):忽略大小写判断调用者字符串和参数字符串内容是否 相等
contains(String str):判断参数字符串是否为调用者字符串的子串;参数是否为调用者的一部分
startsWith(String prefix):判断调用者字符串是否以参数字符串开头
endsWith(String suffix):判断调用者字符串是否以参数字符串结尾
isEmpty():判断调用者字符串是否为空串
public class Demo08_Judge {
public static void main(String[] args) {
//equals(Object obj):判断调用者字符串和参数字符串内容是否相等
String str1 = "abc";
String str2 = "AbC";
boolean boo = str1.equals(str2);
System.out.println(boo);
if (str1.equals(str2)) {
System.out.println("相等");
}
//equalsIgnoreCase(String anotherString): 忽略大小写判断调用者字符串和参数字符串内容是否相等
System.out.println(str1.equalsIgnoreCase(str2));
//contains(String str):判断参数字符串是否为调用者字符串的子串;参数是否为调用者的一部分
String str3 = "abcdefg";
System.out.println(str3.contains(str1));
//startsWith(String prefix):判断调用者字符串是否以参数字符串开头
String name = "张三丰";
System.out.println(name.startsWith("张"));
//endsWith(String suffix):判断调用者字符串是否以参数字符串结尾
System.out.println(name.endsWith("丰"));
//isEmpty():判断调用者字符串是否为空串
System.out.println(name.isEmpty());
}
}
2、获取功能的方法
length():返回字符串的长度
charAt(int index):从调用者字符串上获取指定索引的char值
substring(int beginIndex):从指定索引处开始截取字符串直到结尾
substring(int beginIndex, int endIndex):截取字符串的一部分,从开始索引到结束索引,结束 索引不包含
indexOf(int ch):获取指定字符第一次出现的索引
indexOf(int ch, int fromIndex):获取指定字符第一次出现的索引,从指定位置开始查找
indexOf(String str):获取指定字符串第一次出现的索引
indexOf(String str, int fromIndex):获取指定字符串第一次出现的索引,从指定位置开始查找
lastIndexOf(int ch):倒序查找,获取指定字符第一次出现的索引
lastIndexOf(int ch, int fromIndex):倒序查找,获取指定字符第一次出现的索引,从指定位置 开始查找
lastIndexOf(String str):倒序查找,获取指定字符串第一次出现的索引
lastIndexOf(String str, int fromIndex):倒序查找,获取指定字符串第一次出现的索引,从指定 位置开始查找
import javax.crypto.spec.PSource;
public class Demo09_Get {
public static void main(String[] args) {
String str1 = "qwertyuiop";
//length():返回字符串的长度
int length = str1.length();
System.out.println(length);
//charAt(int index):从调用者字符串上获取指定索引的char值
char c = str1.charAt(3);
System.out.println(c);
//substring(int beginIndex):从指定索引|处开始截取字符串直到结尾
String substring = str1.substring(5);
System.out.println(substring);
//substring(int beginIndex, int endIndex):截取字符串的一部分, 从开始索弓到结束索引,结束索粥|不包含
String sub = str1.substring(2, 5);
System.out.println(sub);
String str = "abcabcacbegcbacabac";
//indexOf(int ch):获取指定字符第一-次出现的索弓|
int c1 = str.indexOf('c');
System.out.println(c1);
//indexOf(int ch, int fromIndex):获取指定字符第一次出现的索引, 从指定位开始查找
int c2 = str.indexOf('c', 3);
System.out.println(c2);
//indexOf(String str):获取指定字符串第一-次出现的索引
int index = str.indexOf("cba");
System.out.println(index);
//indexOf(String str, int fromIndex):获取指定字符串第一次出现的索引,从指定位置开始查找
//lastIndexOf(int ch):倒序查找,获取指定字符第-次出现的索引|
//lastIndexOf(int ch, int fromIndex):倒序查找,获取指定字符第一次出现的索引, 从指定位置开始查找
//lastIndexOf(String str):倒序查找,获取指定字符串第一次出现的索引
//lastIndexOf(String str, int fromIndex):倒序查找,获取指定字符串第一次出现的索引, 从指定位开始查找
}
}
3、转换功能的方法
getBytes():将调用者字符串转为byte数组
toCharArray(): 将调用者字符串转为char数组
toUpperCase():将调用者字符串全部变为大写
toLowerCase():将调用者字符串全部变为小写
concat(String str):将参数字符串拼接到调用者字符串之后
valueOf(int i):将其他数据类型转为字符串【该方法是静态的】
import javax.crypto.spec.PSource;
import java.util.Arrays;
public class Demo10_Transition {
public static void main(String[] args) {
String str1 = "abCeDf";
//getBytes():将调用者字符串转为byte数组
byte[] arr = str1.getBytes();
System.out.println(Arrays.toString(arr));
//toCharArray():将调用者字符串转为char数组
char[] chars = str1.toCharArray();
System.out.println(Arrays.toString(chars));
//toUpperCase():将调用者字符串全部变为大写
String str2 = str1.toUpperCase();
System.out.println(str2);
//toLowerCase():将调用者字符串全部变为小写
String str3 = str1.toLowerCase();
System.out.println(str3);
//concat(String str):将参数字符串拼接到调用者字符串之后
String concat = str1.concat(str2);
String concat1 = concat.concat(str3);
System.out.println(concat1);
System.out.println(str1.concat(str2).concat(str3));
//valueOf(int i):将其他数据类型转为字符串[该访法是静态的]
String str4 = String.valueOf(3);
String str5 = String.valueOf(5.5);
String str6 = String.valueOf('*');
}
}
4、分割功能的方法
split(String regex):将此字符串按照给定的正则表达式,拆分为字符串数组
import java.util.Arrays;
public class Demo07_IsTrue {
public static void main(String[] args) {
String str = "se2ftg2hg2hjt22sdf2vb2mn2gfy2rt2sex2vbh2ui2ty2e2r";
String[] arr = str.split("2");
System.out.println(Arrays.toString(arr));
String[] arr2 = str.split("");
System.out.println(Arrays.toString(arr2));
}
}
四、正则表达式
(一)概述
1、概述:就是一个字符串
2、作用:不仅仅表示一个字符串,还可以表示一类字符串
3、好处:可以用很简洁的代码写出复杂的逻辑
4、弊端:很难写出正确的正则
(二)字符类
1、概述:普通的字符串也是一个正则表达式,只不过该字符串只能表示他自己本身
2、判断一个字符串是否和某个正则表达式匹配的时候,需要使用方法:
matches(String regex)
3、字符类型:表示单个字符,使用符号[],只要使用了[],无论里面写多少个内容,都表示单个字符, 只是允许出现[]里面的任何内容一次
public class Demo11_Regex {
public static void main(String[] args) {
//表示中括号中的字符出现一次为true
System.out.println("c".matches("[abc]"));
System.out.println("&".matches("[^abc]"));
System.out.println("Q".matches("[a-zA-Z]"));
}
}
(三)数量词
1、字符类只能表示一个字符,结合数量词可以表示一串字符
2、注意:数量词只表示紧挨着他的左边的那个字符类
public class Demo11_Regex {
public static void main(String[] args) {
System.out.println("r".matches("[abc]?"));
System.out.println("aaav".matches("[abc]*"));
//5-15 数字 0不能开头
System.out.println("".matches("[1-9][0-9]{4,14}"));
}
private static void test() {
//表示中括号中的字符出现一次为true
System.out.println("c".matches("[abc]"));
System.out.println("&".matches("[^abc]"));
System.out.println("Q".matches("[a-zA-Z]"));
}
}