10.30java课堂笔记
instanceof新特性
检查对象是不是指定的类型,通常在将父类引用强制转换为子类引用的时候使用
抽象类
封装、继承、多态、抽象是JAVA四大特性,不能明确描述的要进行抽象
在某一层次,没有具体的状态,不能具体地进行描述,所以要进行初始化
为了系统的可拓展性,就要进行抽象
语法 abstract 修饰类、方法叫做抽象类,抽象方法
抽象方法的好处是多态。
抽象类除了被继承之外,没有别的用途
如果一个非抽象类是某一个抽象类的子类,他必须重写父类中所有抽象方法!!!
抽象方法只需声明,无需实现
子类对抽象方法的重写,不能降低访问权限
如何实现多态
抽象可以屏蔽一切变化
重要概念:接口
一个类可以有多个接口。接口克服了单继承的缺点。
接口不是类层次结构的一部分,接口可以看作是一种规则和约束。
一个类在继承另一个类的同时,还可以实现多个接口
声明接口 :
具体使用interface
page 113
public interface interfaceName
抽象方法当然定义格式 : returnType
接口中方法默认使用public & abstract(可以省略)
java中的implement
接口回调(接口类型的使用)
两种方法: 接口做上转型,接口做参数
接口不是类,不能进行实例化一个接口,只能实例化它的实现类
接口的默认方法(拓展方法)
主要是提供一种拓展方法
默认重写加上public,去掉default
多级继承
默认方法支持行为的多级继承
类实现的优先级别高于接口的默认实现
接口和抽象类的区别
1.抽象层次
2.建模关系
3.设计层次
尽量以interface取代abstract class
interface 可以用来构建非层次类型框架,减少因继承带来的束缚
继承与组合
优先考虑继承,然后才是组合,因为继承破坏了封装性
提倡在一个package中进行继承,跨越package的是不建议的
面型对象的程序设计原则
page 123
11.13课堂笔记
java中的异常问题:
异常的的分类:
RuntimeException以及Error 是非受查异常,CheckException 是受查异常
java异常处理机制
1.捕获异常
try-catch-finally
2.声明异常
throws
3.抛出异常
throw
抛出的异常必须是Throwable或者是其子类的实例才可以抛出异常
Throwable中API的用法
getMessage() && toString() 方法
异常栈轨迹
Final语句的问题
final语句中抛出的异常以及跳转语句会覆盖try中抛出的异常
避免使用final
链式异常
通过链式异常可以为异常关联另一个异常,第二个异常描述第一个异常的原因,称为引发异常或者是背后异常
带有资源的try语句(io读取文件等)
try with resources;
更加精确的抛出异常
隐匿异常对象的栈轨迹
filllnStackTrace() 方法
反射与注解
反射:
能够在运行时了解对象的一切信息,比如:父类型,方法,字段,构造方法等,还可以动态生成对象,改变权限
这种结果就是通过反射得到的
.class字节码文件
java.lang.Class;
字节码对象的创建:共三种方法
Role.calss;
对象.getClass();
Class.forName("")
class获取构造函数四个方法分两组
在使用反射的时候,常用到的几个方法老是傻傻的分不清楚是干吗的,功能差不多的啊,
比如:
Class.getFields(); Class.getField(String); Class.getDeclaredFields(); Class.getDeclaredField(String); 和 Class.getMethods(); Class.getMethod(String, Class[]); Class.getDeclaredMethods(); Class.getDeclaredMethod(String, Class[]);
主要的就是有没有Declared单词的区别,
经过仔细研究有Declared单词的是获取的是某个类自己定义的成员,包括公开的,私有的,保护的等等的字段或方法,
如果没有Declared单词的一般都是获取某个类所拥有的所有公开的成员,包括自己定义的和继承下来的公开成员,如公开的字段和继承的公开的方法.
主要的就是有没有Declared单词的区别,
经过仔细研究有Declared单词的是获取的是某个类自己定义的成员,包括公开的,私有的,保护的等等的字段或方法,
如果没有Declared单词的一般都是获取某个类所拥有的所有公开的成员,包括自己定义的和继承下来的公开成员,如公开的字段和继承的公开的方法.
先获取构造函数类型,在通过构造函数获取新的对象newInstance
class…///泛型
…表示不定长
获取成员变量field
获取任意指定名字的成员
public Field getDeclaerFields();
field封装的方法
get();
getInt();
getShort();
获取数组:
数组容量动态调整
11.19 java课堂笔记
OCP原则
抽象意味着一切皆有可能
用对象组合代替继承
内部类
课本第118页
面向对象的基石:抽象 abstraction
静态内部类,非静态内部类,局部内部类,匿名内部类
内部类可以定义为:abstract public private default protected,可以加入任意的访问权限
内部类都是一个独立的类
静态内部类只能访问内部类的静态变量或者是静态方法,非静态的不能访问
可以实现顶层类的内部接口
局部内部类
在一个方法中实现,因此也叫方法内部类,不能用访问修饰符修饰
局部内部类不能从方法外访问
匿名内部类
匿名类没有名字,只能用一次,出现在表达式的一条语句中
new[类A OR 接口A()]{
}
得到的匿名类是类A的子类(可以继承A的成员或者是重写继承的方法),或者是实现接口A的类(在匿名类中实现接口的抽象方法)
内部类可以很好地实现隐藏,降低外部耦合性,更好地实现封装性
内部类拥有外围类的所有元素的访问权限
实现多重继承,单继承之后的类再继承一个内部类,就可以实现多继承的效果
避免修改接口而实现同一个类中两种同名方法的调用,用内部类去实现一个接口
函数式编程
lambda表达式
8.0提出
把函数作为参数进行传递
©PushyTao