内部类 Lambda 异常 常用类
一,匿名内部类
匿名对象:是对象,没有引用指向这个对象
匿名内部类:没有名字的一个内部类
作用:
简化,没有类本身的作用,只为了重写一些抽象方法,方便调用这个方法,匿名内部类就可以简化这种实类
简化符合需求的实现类,子类->接口|抽象父类
package class_nner;
public class NimingInner {
public static void main(String[] args) {
new Smoke() {
@Override
public void smokeing() {
System.out.println("吸烟吐烟圈");
}
}.smokeing();
Smoke s = new Smoke() {
@Override
public void smokeing() {
System.out.println("边吸烟边敲代码");
}
};
s.smokeing();
test(new Xu());
test(new Smoke() {
@Override
public void smokeing() {
System.out.println("抽烟哦");
}
});
}
static void test(Smoke smoke){
smoke.smokeing();
}
}
interface Smoke {
void smokeing();
}
class Xu implements Smoke{
@Override
public void smokeing() {
System.out.println("好好抽烟");
}
}
二,Lambad表达式
Lambda 表达式->jdk8新增
作用:就是为了简化匿名内部类结构
前提:函数式接口
函数式接口:只存在一个必须被重写的抽象方法的接口
检查一个接口是否为函数式接口:@FunctionalInterface
结构:
()->{}
() :重写抽象方法的方法体
--> : Lambda符号,箭头符号,具有上下文推导的作用
package class_nner;
public class Lambda01 {
public static void main(String[] args) {
Swim s = new Swim() {
@Override
public void swim() {
System.out.println("游泳");
}
};
s.swim();
Swim swim = () -> System.out.println("在游泳");//花括号可以省略
swim.swim();
Sum i = null;
i = (a, b) -> {
return a + b;
};
System.out.println(i.sum(8,9));
}
}
interface Swim {
void swim();
}
interface Sum {
int sum(int a, int b);
}
三,异常
异常
程序出现了问题
程序一旦遇到异常,后面代码无法正常执行,并且同时控制台中展示
异常的详细信息|细节问题,便于程序员的调试
异常体系:
Throwable
/ \
Error Exception
Error:一般指由虚拟机生成并脱出的,无需程序员解决处理
异常如果不处理,程序无法正常执行,需要程序猿在代码层面上处理异常
RuntimeException 运行时异常 : 运行期间才会发生的异常
CheckedException 编译时异常|检查时异常 : 编译期间发生的异常,不处理程序无法运行重点学习关注异常处理方案:
所有的异常都可以通过标准异常处理方案来处理
运行时异常一般通过增强程序健壮性的代码就可以解决 -> if判断
编译时异常只能通过异常处理方案来处理 NullPointerException 空指针异常
ArithmeticException 数学异常
ArrayIndexOutOfBoundsException 数组索引越界异常
NegativeArraySizeException 数组长度负数异常
ClassCastException 类型转换异常
NumberFormatException 转换格式异常
```java
public class Class001_Exception {
public static void main(String[] args) {
//NullPointerException 空指针异常
String s = “abc”;
s = null;
//判断 增强程序 健壮性的代码
if(s!=null){
System.out.println(s.length());
}else{
s = “”;
}
System.out.println("main方法结束");
//ArithmeticException 数学异常
//System.out.println(5/0);
//ArrayIndexOutOfBoundsException 数组索引越界异常
//NegativeArraySizeException 数组长度负数异常
//int[] arr = new int[-3];
//System.out.println(arr[3]);
//ClassCastException 类型转换异常
//Object obj = "张三";
//System.out.println((Class001_Exception)obj);
//NumberFormatException 转换格式异常
String str = "123abc";
System.out.println(Integer.valueOf(str));
//编译时期异常
//InputStream is = new FileInputStream("");
}
}
```
自定义异常
异常类也是类
需要直接或者间接的继承自Exception
如果是运行时期异常必须直接或者间接的继承RuntimeException 制造异常: throw
public class Class003_DefinedException {
public static void main(String[] args) {
//创建一个用户对想
User user = new User();
user.setName("zhangsan");
int age = 20;
//当AgeException为运行时异常
/*if(age>=18 && age<=60){
user.setAge(age);
}else{
user.setAge(18);
}*/
//当AgeException为编译时异常
try {
user.setAge(-19);
} catch (AgeException e) {
e.printStackTrace();
}
System.out.println("对象创建成功"+user);
}
}
//年龄不合法异常
class AgeException extends Exception{
public AgeException(){}
public AgeException(String message){
super(message);
}
}
//用户类 javabean
class User{
private String name;
private int age;
public User() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) throws AgeException {
//年龄不合法
if(age<18 || age>60){
throw new AgeException(age+"不合法");
}
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
四,常用类
常用类 : 经常使用的类
字符串String
不可变长字符序列
String类表示字符串。 Java程序中的所有字符串文字(例如"abc" )都实现为此类的实例。
“abc” 字符串常量 --> 字符串常量池中-> 方法区 new String() --> 堆中学习API类型:
了解类的作用与特点
学习构造器
学习方法
成员
非静态
静态的 底层分析:
jdk11 ->使用字节数组存储字符串数据 private final byte[] value;
jdk8 -> 使用字符数组存储字符串数据 private final char[] value;
public class Class001_String {
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "";
str = "abc";
String str1 = new String();
//构造器
//String() 初始化新创建的 String对象,使其表示空字符序列。
String str2 = new String();
System.out.println(str2);
//String(String original)
String str3 = new String("haha");
System.out.println(str3);
//String(char[] value)
char[] ch = {'c','y','d','z','m'};
String str4 = new String(ch);
System.out.println(str4);
//String(char[] value, int offset, int count)
String str5 = new String(ch,1,3);
System.out.println(str5);
//String(byte[] bytes) 通过使用平台的默认字符集解码指定的字节数组构造新的 String 。
//byte[] arr = "中国".getBytes(); //utf-8->一个汉字使用三个字节表示 gbk->一个汉字使用两个字节表示
byte[] arr = "中国".getBytes("GBK");
System.out.println(arr.length);
//转换的过程保证字符编码格式一致统一就不会出现乱码
//String str6 = new String(arr);
//String(byte[] bytes, String charsetName)
String str6 = new String(arr,"GBK");
System.out.println(str6);
//String(byte[] bytes, int offset, int length)
//String str7 = new String(arr,3,3);
//String(byte[] bytes, int offset, int length, String charsetName) 把 字节数组arr中从索引为2的位置开始,拿2个字节数据转为字符串,使用执行"GBK"字符编码格式
String str8 = new String(arr,2,2,"GBK");
System.out.println(str8);