Java编程思想 + 廖雪峰博客Java部分
基本概念
- 面向对象编程 CCP
- upcasting
- 动态绑定,不知道返回的类型是什么,void或者virtual
- 方法,构造方法,为了提高复用设置的多个构造方法
- 方法名字相同,但参数不同,方法重载,overload,功能类似的方法使用同一个名字更容易记住,调用更简单;重载方法返回值类型应该相同。
- 继承,extends.
7。private,子类无法访问父类的private,改成protected就可以了 - 如果父类没有默认的构造方法,子类就必须显式调用super()并给出参数以便让编译器定位到父类的一个合适的构造方法。
这里还顺带引出了另一个问题:即子类不会继承任何父类的构造方法。子类默认的构造方法是编译器自动生成的,不是继承的。
public sealed class Shape permits Rect, Circle, Triangle {
...
}
只允许Rect,Circle,Triangle继承它,这种sealed一般多用在一些框架里面
- 向上转型,upcasting; Person父类,Student子类,Person p = new Student(); 成立
- 向下转型,downcasting,失败,子类比父类功能多,无法凭空变出来功能。
- instance of,一般用在判断里面
构造方法,Consctructor,自动调用,和class同名,可以有多个,没有返回类型,主要用来初始化对象的状态
使用this可以在一个构造方法中调用另一个构造方法class Person {
String name; //实例变量 int age; public Person(String name,int age) { this.name = name; this.name是实例变量,name是参数 this.age = age; }
}
this.name当前对象的实例变量
不能再静态方法中使用this,静态方法是类级别的,和实例无关
this只在实例方法中有效- .....中间缺失大量笔记,网页未保存,包括面向对象编程(多态,包,内部类等),Java核心类,异常处理(断言,日志,单元测试),反射(各种调用,动态代理)等笔记
- 反射,访问字段,调用方法,调用构造方法,动态代理
动态代理部分还是不太明白,明天用A4纸自己画一遍好了静态代码:a.定义接口 b. 编写实现类 c. 创建实例,转型为接口,并调用
动态代码:a.定义接口 b. 直接在main里面用proxy.newProxyInstance()创建接口对象,传入classloader,传入要实现的接口,传入处理调用方法的invocationHandler,将返回的object强制转型为接口通过proxy创建代理对象,将接口方法代理给InvocationHandler完成的
不明白,还是不明白
- 注解,Annotation
@Override
@Target 定义Annotation能够被应用于源码的哪些位置
@Retention 定义生命周期
使用反射处理 - 泛型,一种模板,编写模板代码适应任意类型
泛型类型T不能用于静态方法
静态泛型方法应该和实例类型的泛型方法区分
多个泛型,比如Map<K,V>,key是一种类型,value是另一种类型
擦拭法 Type Erase,Java实现泛型的方法,虚拟机对泛型一无所知,所有工作都是编译器做的(这句话不明白),编译器里面有<T>,虚拟机眼里只有object
从<T> 到<? extends Number>,表示泛型类型限定为Number以及Number的子类,extends通配符
super通配符
Pair <Integer> => Pair<? super Integer>
接受所有泛型类型为Integer或其父类的Pair类型
entendts只允许读
super只允许写
这块有点半懂不懂 集合
List ArrayList LinkedList,链表,(每个元素都指向下一个元素)ArrayList各种操作的快,内存占用少 iterator比for循环遍历list更高效,因为太常用,所以改成了for each,常见的遍历list 代码
小技巧
对浮点数加上0.5,再强制转型,达到四舍五入的效果