11异常
1.1抛出
在代码可能出现异常的地方进行抛出异常
使用关键字:
throw:在方法中抛出异常对象,自己造一个异常!!!shrows:在方法的声明位置去书写,告知调用者,当前抛出的异常有哪些。
编译时异常需要在方法名“后”加 throws,如果只是执行时异常,在方法“中”加throw
1.2自定义异常
自己建一个类,去继承Exception
package com.qfedu.test1;//自定义异常public class Demo4 {public static void main(String[] args) throws SingleDogException {buy(false);buy(true);}public static void buy(boolean isSingle) throws SingleDogException {if (isSingle) {throw new SingleDogException("单身狗不能进店");}System.out.println("情侣买一送一");}}//自己定义一个异常继承父类class SingleDogException extends Exception{public SingleDogException() {}public SingleDogException(String message) {super(message);//调用父类的有参构造}}
throws是抛出,不管异常,运行报红。try catch还管管你
2.String 类
想要学习一个类:用api搜String,看类的关系和类下面的构造方法和方法
String(String original)初始化新创建的String对象,使其表示与参数相同的字符序列; 换句话说,新创建的字符串是参数字符串的副本。
2.1判断两个字符串是否相同
Demo1
==: 比较的是内存地址和内容(严格)
- boolean
equals(Object anObject)将此字符串与指定对象进行比较。
- boolean
equals:a.equlas(“b”) 只比较内容(不严格)
以后开发中比较字符串,必须使用equlas
package com.qfedu.test2;public class Demo1 {public static void main(String[] args) {//在栈区String str1 = "abc";String str2 = "abc";//在堆区 new一个对象,就会产生不同的内存地址String str3 = new String("abc");String str4 = new String("abc");//== 比较的是内存地址和内容 只要有一个不一样就为falseSystem.out.println(str1 == str2);//TSystem.out.println(str1 == str3);//FSystem.out.println(str3 == str4);//T//a.equlas("b") 只比较内容System.out.println(str1.equals(str3));//TSystem.out.println(str3.equals(str4));//T}}输出:truefalsefalsetruetrue
2.2获取字符串长度和特定位置字符
Demo2
获取字符串长度:int string.length();
获取特定位置字符:char string.charAt(a);//a索引位置的字符
获取特定字符的位置:int string.indexOf(“c”);//c字符的下标索引位置
获取最后一个字符的位置 :int lastIndexOF(int char);
package com.qfedu.test2StringClass;//返回字符串长度的方法、具体位置的字符、特定字符的位置public class Demo2 {public static void main(String[] args) {String string = "abcdefcg";//字符串的长度System.out.println(string.length());//8//获取字符串中索引为2的字符System.out.println(string.charAt(2));//c//返回指定自字符串第一次出现的字符串内的索引。System.out.println(string.indexOf("g"));//7//indexOf(int i) 括号里可以填字符 ascall码System.out.println(string.indexOf('g'));//7//返回指定自字符串最后一次出现的字符串内的索引。System.out.println(string.lastIndexOf('c'));//6//没有ac相连,输出-1System.out.println(string.indexOf("ac"));//-1//0,有ab相连的,看第一个字符System.out.println(string.indexOf("ab"));//0}}输出:8c776-10
Demo3
以特定字符结尾:string.endsWith(“.java”); //是否以.java结尾,返回值布尔
判断字符串是否为空:string.isEmpty() //空为T 不空为F,返回值布尔
判断字符串是否包含:string.contains(“mo3”)//包含为T,返回值布尔
判断字符串是否相同:equals(String string)//返回值布尔
忽略大小写,判断两个字符串是否相等:”abc”.equalsIgnoreCase(“ABC”)
package com.qfedu.test2;//以上方法public class Demo3 {public static void main(String[] args) {String string = "demo3.java";//是否以.java结束System.out.println(string.endsWith(".java"));//TSystem.out.println("-------------");//字符串是否为空System.out.println(string.isEmpty());//fSystem.out.println("".isEmpty());//TSystem.out.println(" ".isEmpty());//F 空格也是字符串,System.out.println("-------------");//字符串是否包含 必须相连的System.out.println(string.contains("mo3"));//T 包含System.out.println("-------------");//忽略大小写,判断两个字符相对System.out.println("abc".equals("ABC"));//F equals 不忽略大小写System.out.println("abc".equalsIgnoreCase("ABC"));// T 不区分大小写}}输出:true-------------falsetruefalse-------------true-------------falsetrue
2.3将字符数组转为字符串
Demo4
String的构造方法
new String(char[] char);//将字符数组转为字符串
new String(char[] char, int offset, int count); offset偏移量 count数量
static valueOf(char[] char); 静态方法 直接String.valueOf(ch2)
将字符串转为字符数组
char[] toCharArray();//把字符串变成字符数组 用for依次遍历方便看出效果
package com.qfedu.test2StringClass;import java.util.Arrays;public class Demo4 {public static void main(String[] args) {//将字符数组转为字符串char[] ch1 = {'朱','志','伟'};String string = new String(ch1);System.out.println(string);//将字节数组转为字符串 会乱码byte[] by1 = {1,2,3};String string2 = new String(by1);System.out.println(string2);//会乱码//偏移量char[] ch2 = {'朱','志','伟','z','z','w'};//2:offset 偏移量 在左边开始,偏移过去2个数(从下标为2开始)//3:count 数量 取3个数据String string3 = new String(ch2, 2, 3);System.out.println(string3);//伟zz//valueOf是静态方法,可以直接类名调用,返回值是StringSystem.out.println(String.valueOf(ch2));//把字符串变成字符数组char[] ch3 = "天气忽冷忽热".toCharArray();// System.out.println(Arrays.toString(ch3));for (int i = 0; i < ch3.length; i++) {System.out.print(ch3[i] + "\t");}}}输出:朱志伟???(乱码)伟zz朱志伟zzw天 气 忽 冷 忽 热
Demo5zhongdian
以下相对重要,,开发中要用!!!!!!
字符串替换:
String replace(char oldchar,char newchar)//把字符串中某个地方替换
切割:
String[] split(String regex); 以某字符串开始切割,切割成字符串数组
截取:
String subString(int beginIndex)
String subString(int beginIndex ,int endIndex)
大小写转化:
String toUpperCase(); 小转大
String toLowerCase(); 大转小
去除首位空格(只能去除首位的)
trim();
package com.qfedu.test2StringClass;import java.util.Arrays;public class Demo5zhongdian {public static void main(String[] args) {//字符串替换 所有的都换System.out.println("abecdefg".replace("e", "换"));System.out.println("abcdefgcd".replace("cde", "换三个"));//切割String string1 = "哈哈1,呵呵1,嘿嘿1";//要求以逗号","开始切割 ==》{"哈哈"},{"呵呵"},{"嘿嘿"}String[] str1 = string1.split("1");System.out.println(Arrays.toString(str1));for (int i = 0; i < str1.length; i++) {System.out.print(str1[i] + "\t");}System.out.println();//截取String string2 = "abcdefg".substring(2);System.out.println(string2);//cdefg 下标为2以前的东西不要//第一个参数是开始截取的索引 、第二个参数是结束截取的索引//截取是“要头不要尾”,“左开右闭”String string3 = "ABCDEFGH".substring(2, 5);System.out.println(string3);//CDE//大小写字母转换//小转大System.out.println("abcAA".toUpperCase());//大转小System.out.println("QWEaa".toLowerCase());//去除空格(只能去除首位的)System.out.println(" QWE asd ");System.out.println(" QWE asd ".trim());}}输出:ab换cd换fgab换三个fgcd[哈哈, ,呵呵, ,嘿嘿]哈哈 ,呵呵 ,嘿嘿cdefgCDEABCAAqweaaQWE asdQWE asd
3.泛型【重点】
3.1为什么要使用泛型
java1.5之后新的知识点,用来约束当前集合中的数据类型的
泛型:广泛的类型
在实际的开发中对数据一致性的要求是很重要的
例如:集合就是往里面存数据的
package com.qfedu.test3fanxing;import java.util.ArrayList;//泛型 -- 用来约束当前集合中的数据类型的public class Demo1 {public static void main(String[] args) {//在真是的开发中对数据一致性的要求是很重要的//比如数组,往数组里面存数据的时候,数据类型都是一致的int[] arr = {15,94,-22};//存的数据都是int 一致的//开发中很少使用数组!为啥?需要初始化容量,有局限性//开发中使用集合来代替数组,集合也是用来存数据的//空的集合,里面可以存数据ArrayList list = new ArrayList();list.add("伍兹");list.add(24);list.add(true);list.add('人');System.out.println(list);//发现集合中的数据类型不一样!!不好//从集合中往外取数据Object object = (String)list.get(0);System.out.println(object);//涉及到强转,效率低还可能出错//java从1.5版本加上泛型,用来约束当前集合中的数据类型的ArrayList<String> list1 = new ArrayList<String>();//加上泛型以后,这个集合只能存String类型的数据,保持数据一致性list1.add("嗯");list1.add("昂");}}
3.2自定义泛型,在方法中如何书写
语法格式:
无意义的占位符:可以是T,可以是E,也可以是?。只是一个占位,没有实际的意义
权限修饰符 <无意义的占位符> 返回值 方法名字(){}public <?> void 方法名字(){}
无参数无返回值的方法:可以不加泛型,体现不到泛型的用处
有参数无返回值的方法:有必要使用泛型的
无参数有返回值的方法:没有参数没有意义,
有参数有返回值的方法
特点:
泛型方法只有带参数才能使用泛型,泛型才具有真正的意义
而且带有参数和返回值的方法,具有很大的局限性(只能传一个参数)!!!
package com.qfedu.test3fanxing;public class Demo2 {public static void main(String[] args) {test("abc");test(123);//泛型test1(98.7);test1("泛型");test1(true);//无参无返回值test2();//有参无返回值test3(1, 3);test3("朱", 1);test3(true, 'z');// //无参有返回值// System.out.println(test4());//有参有返回值System.out.println(test5("狗蛋"));System.out.println(test5(30));}public static void test(String string) {System.out.println(string);}public static void test(int int1) {System.out.println(int1);}//泛型的写法 <T> T可以随便改变 告知编译器当前方法带有泛型//这个参数(T t) T 会根据你传入的实参的数据类型而随时变化public static <T> void test1(T t) {System.out.println(t);}//无参无返回值,没有体现泛型的用处public static <T> void test2() {for (int i = 0; i < 2; i++) {System.out.print("zzw");}System.out.println();}//有参无返回值,有必要使用泛型public static <T> void test3(T t,T a) {// System.out.println(t + a);//不确定什么类型不能直接相加System.out.println(t + ":" + a);}// //无参有返回值// // T代表返回值类型 T不能具体代表那一个类型,没有参数没有意义// public static <T> T test4() {// return (T) "返回谁呢";// }//有参有返回值,public static <T> T test5(T t) {return t;}}
3.3泛型类如何书写【重点】
语法格式:无意义占位符T用的偏多
class 类名<无意义的占位符>{//泛型类的方法不用加<T>//在main方法中 new的时候加具体的<数据类型>//Person<String> person = new Person<String>();}
以后开发中很少用泛型类,架构师要写泛型类!!!!
package com.qfedu.test4fanxingClass;//泛型类class Person<T>{//泛型类下面的方法//可以写正常的方法public void eat() {System.out.println("泛型类下可以写正常的方法,正常用正常调用");}//带泛型的方法//在泛型类上面已经定义好T,在方法中就不用在写<T>了//如果写了<T> 这个方法就是使用了自己的T的泛型,不是当前类的那个泛型// public <T> void printArgs(T t) {//打印参数// System.out.println(t);// }//方法的T 随着类的T的改变而改变public void printArgs(T t) {//打印参数System.out.println(t);}//写一个静态方法//静态的方法 类是没有办法约束的 (T t) 这个T和类的T没关系了//只能在创建对象的时候才能对对象进行约束//静态方法早于对象的创建的,对象约束不了静态方法public static <T> void staticTest(T t) {System.out.println();}}public class Demo1 {public static void main(String[] args) {// Person<String> person = new Person<String>();Person person = new Person();person.eat();//声明的时候确定数据类型,调用时只能用这个数据类型Person<String> person2 = new Person<String>();person2.printArgs("a");// person2.printArgs(45);//只能是StringPerson<Integer> person3 = new Person<Integer>();//只能是integerperson3.printArgs(15);}}
注意【静态方法】:
//在泛型类中//静态的方法 类是没有办法约束的 (T t) 这个T和类的T没关系了//只能在创建对象的时候才能对对象进行约束//静态方法早于对象的创建的,对象约束不了静态方法public static <T> void staticTest(T t) {System.out.println();}
3.4接口泛型如何书写
语法格式:
interface 接口名字<无意义占位符>{}
package com.qfedu.test5fanxingjiekou;//泛型接口interface A<T>{//成员方法public void test(T t);}//接口带有泛型,那么实现类也必须带有泛型class TestA<T> implements A<T>{@Overridepublic void test(T t) {// TODO Auto-generated method stubSystem.out.println(t);}}public class Demo1 {public static void main(String[] args) {TestA<String> testA = new TestA<String>();testA.test("只能传String");// testA.test(18);//只能传String数据类型的TestA<Integer> testA1 = new TestA<Integer>();testA1.test(18);}}
3.4泛型抽象类如何书写
语法格式
abstract class 类名<无意义占位符>{//抽象方法}继承抽象类class 类A <T> extends 抽象类<T>{//重写方法}
package com.qfedu.test6fanxingchouxiangClass;//泛型抽象类abstract class A<T>{//成员方法public abstract void test(T t);}class TestA<T> extends A<T>{@Overridepublic void test(T t) {// TODO Auto-generated method stubSystem.out.println(t);}}public class Demo1 {public static void main(String[] args) {TestA<String> testA = new TestA<String>();testA.test("抽象类");}}
