卷java、基础2
内部类
了解
1. 成员内部类(了解)
2. 静态内部类(了解)
实例化的写法
局部内部类(看看就好)
局部内部类是定义在在方法中、代码块中、构造器等执行体中。
匿名内部类(重要)
1.先认识
先看代码:
- 右边是老办法
- 左边是 匿名内部类(看编译后的文件,确实存在一个类,是动物的子类)
- 匿名内部类是 动物的子类
- 并立即创建了一个子类对象
2. 自我理解:
如1中,抽象类 - 动物类(原本不能实例化),创建匿名内部子类,就可以实例化了,实际上是写了一个动物子类,同时它又没有名字。
接口。 是抽象类的特殊情况, 即,也可以这样搞
3. 通常的用法
作为play方法的参数, 方法中又可以用这个参数(即对象),来调其方法 (swim)
并且,利用 【匿名内部类创建子类并直接得到一个对象】 的功能 。
简洁代码就可以实现, play(【匿名内部类创建子类并直接得到一个对象】),来实现不同的swim效果
自我理解:这样就可以快速重写接口方法
4. 匿名内部类拓展(真实场景)---是需要用,根据3知道就好。
关于匿名内部类,我的理解,知道用就行,有时候可以快捷实现,比如这里的给按钮添加点击事件,就去快速的定义 。 有点想pyqt5里。lamda。定义匿名方法。
5. 简化写法:
当参数是一个函数式接口对象,可用
(函数式接口,即此接口只有一个 抽象方法---如下的abstraction接口)
枚举(固定几个实例例)
总结: 枚举常用来做信息分类,信息标识的
- 第一行都是常量,并且都是此类的对象
- 构造器式私有的,即对外不能创建对象,就只有。1 中的对象
- 枚举类是最终类,不能被继承
- 有自带了一些方法,如values() , 和。valueOf()
枚举中只有一个,就是一个单粒
不能创建对象,并且只有一个对象
枚举的常见应用场景
常量方式: 还是有缺点,参数值没有被约束
用枚举的方式(枚举的好处)
信息标志的理想方式
switch这个方法也喜欢枚举,可以这样改。
泛型
补充: 泛型,不支持基本类型, 要用的话,用包装类。
a .泛类 (可操作来理解)
初识(先看比人的):
ArrayList定义时,就可以规定类型。 需要下面这种写法。 (前面用<> 写了类型,后面ArrayList后也加 <>)
ArrayList<String> list2 = new ArrayList<>();ArrayList<Integer> list3 = new ArrayList<>();ArrayList<Boolean> list4 = new ArrayList<>();ArrayList<Double> list5 = new ArrayList<>();
1.可以实现,限制某个方法传参类型
2. 可以实现,定义一个泛型属性 (实例化时,再明确类型,然后set值)
3. 套壳(里头还是用的 Arraylist)
b. 泛接口(内含经典操作)
需求:实现老师的增删改查、 学生的增删改查
如下图: 右边就是泛型接口。
-
implements Data<Student> 后,会报错,alt + 回车,就会自动修复,自动重写方法了。
- 同样可以快速实现 public class TeacherData implements Data<Teacher>
c. 泛型方法
- 和泛类的不同点,定义:在写类时; 使用:泛类是在实例化类时,去给E 类型。
- 泛形方法,定义:在写法方法时;
案例1(用T代表写类型的地方)
定义范型方法, 就都可以传了 ,提示词:// 定义一个方法,接收数组,采用泛型, 然后打印数组元素
案例2:?通配符 代替 某类
当参数是一个类对象时,好说。
两种泛型方法
- 当参数是一个 引用类型 如 arrylist 时, 可以用 通配符
- 当是数组,是可以用案例1 中的T (虽然数组是引用类型,但 Java 泛型不允许直接使用带有通配符的泛型数组类型)
API 一
Object类
----pyqt5中,所有的类也叫 Object类
toString
- sout(xx.toString())
- sout(xx) // 这个和上面的打印效果一样,可以简写,不写.toString()
如果类中,重写 public String toString() 就可以实现打印非地址信息。
equals(默认行为和== 一样)
另外:equals可以提供我们来重写,原来是比较地址,可以改成比其他(alt + insert 可生成)
重写equals案例, 其中因为 this.name 是字符串,它使用的.equals,是字符串类里面重写的。
推荐用 Objects.equals() -- 后面有讲,更安全
```// return this.name.equals(s.name);
return Objects.equals(this.name, s.name);``` 即使,某个没有name, 或者某个直接为null
以下是课上的代码
其中,第3点药强转,是因为用用o 拿age等。
Objects.equals() 这里用了这个来比较,看看后面的介绍
额外补充:
如下图,可以知道,"abc" 在常量池中就只有一份。(已 = "abc"方式定义的字符串在常量池中)
Objects 类
其实 t1.equals(t2) 和 Objects提供的 Objects.equals(t1,t2) 效果是一样的
但是用后者,可以避免 t1是null 的情况。
最后推荐:比较两个对象时,建议Objects.equals(t1,t2)
包装类
包装一下,满足那句话,万物皆对象
自动装箱机制:基本类型数据 可以直接 赋值给 包装类。
小补充: Integer中,-127到127 中对象是已有的,不会新new
自动拆箱:
也可以 int it4 = it2 (接上图,这样 it4又是基本数据类型了)
一些方法(没啥用)
包装类没啥用,但是sum公司就搞了点方法给你用
基本数据类型,转成字符串
方式1。
方式2:
方式3(不装逼推荐)
基本数据类型,转成字符串(有用)
推荐 或者 用 Integer.valueOf() 一样的效果 (自动拆箱)
用如下两个图是官网给的方法,作用不大,不管
API二 (不全)
Arrays类的方法、Arrays的排序、 Lambda表达式简化函数式接口、
方法引用
冒泡排序
选择排序
二分查找
正则表达式
异常(不全)
常见异常,他们共同的基类为 Exception类