反射:能够分析类能力的程序称为反射(reflective)
接口:描述类有什么功能,而不是给出每个类的具体功能的实现
接口中的所有方法自动属于public
接口绝不能含有实例域,在JAVASE8之前,也不能在接口中实现方法
使用关键字“interface”声明一个接口;使用关键字“implements”声明一个类实现一个接口。
与类的权限的限制相同,接口的也能被设置为public,static,final,也就是说在接口声明的变量都会被隐式的提升为“公有的静态常量”
接口不可以实例化,但是可以引用实现了接口的类的对象;
接口中声明的方法都是抽象的,并且被自动的设置为public。
接口自身不能够被构造实例化,但可以通过实现该接口的类的方法进行实现。
实现接口的类若不是抽象类,那么该类必须实现接口的所有方法。
接口与接口之间也可以实现继承关系,子接口除拥有父接口的所有方法声明外,还可以定义新的方法声明。
如同使用instanceof检查一个对象是否属于某个特定类一样,也可以使用instance检查一个对象是否实现了某个特定的接口
与建立类的继承关系一样,接口也可以被扩展,这里允许多条从具有较高通用性的接口到较高专用性的接口的链
尽管每个类只能拥有一个超类,但却可以实现多个接口。
回调:指出某个特定事件发生时应该采取的动作的模式。
简单的理解(浅拷贝):如果想要为对象创造一个副本,且它们的状态互不影响,那么应使用clone(克隆,一个新的对象,但是数据是克隆而来的)而不是引用
浅拷贝:不会克隆对象引用的其他对象,克隆对象后可能还会存在与原对象共享信息的情况。(如果共享的对象是不可变的,或者是属于一个不可变的类,对象的生命周期中,子对象一直包含不变的常量,那么这种共享是安全的)
一般的子对象是可变的,所以应该应设置一个深拷贝的clone以便于完全的复制出独立的副本
深拷贝:应对实例域的可变类进行另外的克隆。
lambda表达式:是一个可传递的代码块,可以在以后执行一次或者多次。(parameters)-> expression(表现形式:参数,→,一个表达式,如果代码要完成的计算无法放在一个表达式中,则可以像写方法一样,把这些代码放在{})
即使lambda表达式没有参数,依然需要提供空括号,就像无参数一样。
如果可以推导出一个lambda表达式的类型,则可以忽略其类型。
如果方法只有一个参数,而这个参数的类型可以推导得出,那么甚至可以省略小括号。无需指定返回类型,会依据上下文推导出来。
对于Lambda表达式中的多个参数,如果需要显示声明一个参数的类型,那么必须为所有的参数都声明类型。
注意:如果一个lambda表达式只在某些分支返回一个值,而在另外一些分支不返回值,这是不合法的。如 (int x) -> {if(x >= 0)return 1;}
函数式接口:对于只有一个抽象方法的接口,需要这种接口的对象时,就可以提供一个lambda表达式。
注意:不能把lambda表达式赋值给类型为Object的变量,Object不是一个函数接口。
lambda表达式由三部分组成:
1.在一个单独的线程中运行代码 2.多次运行代码 3.在算法的适当位置运行代码(排序中的比较操作) 4.发生某种情况时执行代码(点击了一个按钮,数据到达) 5.只有在必要的时候才运行代码 6.要接受这个lambda表达式,需要选择(偶尔可能需要提供)一个函数式接口
内部类的对象总有一个隐式的引用,指向了创建它的外部类对象。(它是不可见的)
外围类的引用在构造器中设置(该引用类似于c++的this指针)
外围类引用的正规语法: OuterClass.this
编写内部对象的构造器: outerObject.new InnerClass(construction parameters)
外部类之外的引用内部类:OuterClass.InnerClass 注意:内部类中声明的所有静态域都必须是final;不能有static方法
不用public或private访问说明符进行声明; 作用域:声明它的这个块 优势:对外部可以完全隐藏起来,外部类中其他的代码也无法访问,可以访问局部变量(事实上是final)
语法格式: new SuperType(construction parameters) { inner class methods and data } 静态内部类没有对生成它的外围类对象的引用特权。
应该抛出异常的情况:
不管是否有异常被捕获,finally子句中的代码都被执行; 堆栈轨迹是一个方法调用过程的列表,它包含了程序执行过程中方法调用的特定位置,如:printStackTrace(访问堆栈轨迹的文本信息描述) getStackTrace方法:得到StackTraceElement对象的一个数组,可以在你的程序中分析这个对象数组。StackTraceElement类含有能够获得文件名和当前执行的代码行号的方法,还含有获得类名和方法名的方法。
断言机制: 允许在测试期间向代码插入一些检查语句,当代码发布时,插入的检测会自动移除
2.自己定义定义日志记录器: private static final Logger myLogger = Logger.getLogger("com.mycpmpany.myapp")
(未被任何变量引用的日志记录器可能被垃圾回收,所以要使用一个静态变量存储日志记录器)
3.日志记录器级别:
logger.setLevel(Level.FINE)
,可以使用 Level.ALL
or Level.OFF
开启或者关闭所有级别的记录) java -Djava.util.logging.config.file=configFile MainClass
.level = INFO
可以通过添加一下内容指定自己的日志级别: com.mycompany.myapp.level = FINE
java.util.logging.ConsoleHandler.level=FINE
Logger logger = Logger.getLogger(LoggerName,''com.mycompany.logmessages'')
调试技巧:1)在每个类中放置一个单独的main方法。只需在main中调用所有方法,看是否能正常运行。2)日志代理是一个子类的对象,可以截获方法的调用,并进行日志记录,然后调用超类中的方法;3)利用Throwable类提供的printStackTrace方法,可以从任何一个异常对象中获得堆栈情况。(不必要通过捕获来生成堆栈轨迹,任何位置都可以插入 Thread.dumpStack()
来获取堆栈轨迹)