Java学习第九天
String常用API
//String 字符串的定义和初始化
String str1 = "hqyj";//不创建对象,在常量池中保存的常量
String str2 = new String("hqyj");//创建一个实例对象
System.out.println(str1 == str2);//false
System.out.println(str1.equals(str2));//true
//字符串相关的方法
char c = str1.charAt(1);//返回指定下标的字符
System.out.println(c);
byte[] bytes = str1.getBytes();//获取字符串的字节数组
System.out.println(Arrays.toString(bytes));
String s = str1.toUpperCase();//字符串转大写字母
System.out.println(s);
String s1 = str1.toLowerCase();//字符串转小写字母
System.out.println(s1);
long st1 = System.currentTimeMillis();
String concat = str1.concat(str2);//拼接;两个字符串
String str3 = str1 + str2;//拼接字符串
System.out.println(concat);
System.out.println(str3);
long end1 = System.currentTimeMillis();
System.out.println(end1 - st1);//时间戳 = 1
/*
字符串创建之后不能改变长度,所以做字符串的拼接会不断创建新的对象,性能不高
如果遇到大量字符串拼接,换用StringBuffer(线程安全) 或 StringBUilder(线程不安全)
*/
long st = System.currentTimeMillis();
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(str1);
stringBuffer.append(str2);
str3 = stringBuffer.toString();
System.out.println(str3);
long end = System.currentTimeMillis();
System.out.println(end - st);//时间戳 = 0
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(str1);
stringBuilder.append(str2);
str3 = stringBuffer.toString();
System.out.println(str3);
boolean y = str1.endsWith("y");//判断一个字符串是否是某个字符串结尾
System.out.println(y);
boolean z = str1.startsWith("h");//判断一个字符串是否是以某个字符串开头
System.out.println(z);
boolean yj = str1.contains("yj");//字符串中是否包含某个字符串
System.out.println(yj);
str1 = "This is a String";
int i = str1.indexOf("String");//返回指定字符串第一次出现的起始下标
System.out.println(i);//10
System.out.println(str1.indexOf("is"));//2
System.out.println(str1.lastIndexOf("is"));//5,返回指定字符串最后一次出现的起始下标。
System.out.println(str1.indexOf("is", 3));//从下标3开始找第一次出现的指定字符串的下标
System.out.println(str1.indexOf("of"));//若未找到指定的字符串,返回-1.
//数组的length是属性,字符串的length是方法
System.out.println(str1.length());//字符串的长度(有多少个字符)
System.out.println(str1.substring(1, 6));//两个参数:截取str1中1-6的字符串,包前不包后(左闭右开)
System.out.println(str1.substring(6));//一个参数:从6的位置开始截取字符串直到结束
str2 = " a b c ";
System.out.println(str2.trim());//去掉字符串的前后空格,字符串中间的不会去除
System.out.println(str3.replace("hq", "**"));//替换字符串(旧字符串,新字符串)
String[] s2 = str1.split(" ");
System.out.println(Arrays.toString(s2));//按照指定的符号将字符串拆分成一个数组。
System.out.println(Arrays.toString((str1.split(""))));//用空字符串做split,把一个字符串的所有字符拆分为字符数组。
Math
-
random() 产生0-1的随机数(小数)
-
Math.floor() 取小数的最大整数(向下取整)
-
Math.sell() 取小数的最小整数(向上取整)
-
Math.round() 四舍五入取整
double random = Math.random();//产生一个0-1的随机数 int i = (int) (random * 100); System.out.println(i); System.out.println(Math.floor(random * 100));//向下取整 System.out.println(Math.ceil(random * 100));//向上取整 System.out.println(Math.round(3.14));
Data
-
日期对象Date
-
日期格式对象SimpleDataFormat
Date data = new Date();//创建一个当前日期时间的日期对象 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm-ss"); /* * y 年 * M 月 * d 日 * H 小时 * m 分钟 * s 秒钟 * 日期(-)和时间(:)的符号可以自行改变 *注意大小写 * */ String format = sdf.format(data); System.out.println(format);
抽象关键字abstract
抽象的作用是如果子类都会重写(不一样)方法,定义为抽象方法,节省代码量。
抽象类里面也可以有非抽象的方法,所有子类的代码都一样的方法就在父类中定义,代码重用。
abstract可用于修饰方法和类
抽象方法或类的特性
- abstract用于修饰方法,该方法是抽象方法,如果用于修饰类,该类就是抽象类
- 一个类如果有抽象的方法,类也必须要定义为抽象类
- 抽象类不能直接被实例化
- 如果继承抽象类,必须要重写(实现(implements))父类中的抽象方法。否则子类也只能定义为抽象类。
- 抽象类里可以有非抽象类的方法。
- 抽象类可以有构造方法,子类实例化时会调用父类的构造方法
- 构造方法不能用abstract修饰,因为构造方法只能重载不能重写
- 静态方法也不能用abstract修饰
动物的抽象类,有一个抽象方法shout()
public abstract class Animal {
public Animal() {
System.out.println("Animal的构造方法");
}
public abstract void shout();
public void eat(){
System.out.println("吃东西");
}
}
动物类的子类Cat,重写父类的抽象方法
public class Cat extends Animal{
@Override
public void shout() {
System.out.println("小猫咪");
}
}
抽象面试题
-
抽象类中有构造方法吗?
有,抽象类的构造方法在子类中可以调用
-
执行构造方法的时候,一定会创建出实例对象?
不一定,子类创建对象时,如果默认构造方法,父类(不管是抽象还是默认)的默认构造方法也会被调用
接口 interface
接口中的方法都是没有实现的方法,可以理解为全是抽象方法
接口的作用一般是定义规范(方法名、参数、返回类型),它的实现类必须按照接口的方法的定义去实现方法。
接口还用于框架或设计模式中,利用多态的特性,便于程序的扩展。
接口可以实现多接口,弥补了类的继承只能单继承的缺点。
定义接口的语法:
修饰符 interface 接口名{
}
接口实现的语法:
[修饰符] [abstract] (可以不写) class 类名 implement 接口名{
}
接口的实现类可以是抽象类,如果是抽象类就不要求实现每一个方法;具体类就必须实现所有方法。
Usb interface
public interface Usb {
void init();//初始化usb接口
void send();//发送数据
void reject();//弹出usb设备
}
实现类
Usb 2.0
public class Usb2 implements Usb{
@Override
public void init() {
System.out.println("Usb 2.0 初始化");
}
@Override
public void send() {
System.out.println("Usb 2.0 传输数据");
}
@Override
public void reject() {
System.out.println("Usb 2.0 弹出设备");
}
}
Usb3.0
public class Usb3 implements Usb{
@Override
public void init() {
System.out.println("Usb 3.0 初始化");
}
@Override
public void send() {
System.out.println("Usb 3.0 传输数据");
}
@Override
public void reject() {
System.out.println("Usb 3.0 弹出设备");
}
}
测试类
public class UsbTest {
public static void main(String[] args) {
Usb usb = new Usb3();
usb.init();
usb.send();
usb.reject();
}
}
接口特点
- 接口定义的关键字是interface,接口实现的关键字是implement
- 接口中的所有方法都只定义,不实现
- 接口的方法不写访问修饰符,默认是public
- 接口的属性默认是public static final,相当于常量
- 接口不能被实例化
- 接口没有构造方法
public interface Usb {
//接口的属性默认是public static final,接口中的属性就是常量
//等效于public static final String name = "Usb01";
String name = "Usb01";