匿名内部类: 匿名类没有类名,所以匿名类不能有构造器 匿名内部类的创建格式为: new 父类构造器(参数列表)|实现接口(){ //匿名内部类的类体实现 } 使用匿名内部类时,必须继承一个类或实现一个接口 匿名内部类由于没有名字,因此不能定义构造函数 匿名内部类中不能含有静态成员变量和静态方法 匿名内部类,匿名了,没名字,构造器去哪找名字,即不能有构造函数
StringBuffer和StringBuilder 效率:StringString(大姐,出生于JDK1.0时代) 不可变字符序列 StringBuffer(二姐,出生于JDK1.0时代) 线程安全的可变字符序列 StringBuilder(小妹,出生于JDK1.5时代) 非线程安全的可变字符序列
Java中的String是一个类,而并非基本数据类型。string是值传入,不是引用传入。 String 不可变类 StringBuffer 可变类 线程安全
1.”is”说明后面的内容都会被强制转换为string,所以是最后结果是拼接起来的 2.100+5先得到105,然后与is拼接 3.先算括号内的
继承具有传递性,子类可以无条件向上转型!
A.java用来运行一个.class文件 B.javadoc用来生成api文档 C.jar用来生成jar包 D.javac用来把.java文件编译为.class文件
两个最基本的java回收算法:复制算法和标记清理算法 复制算法:两个区域A和B,初始对象在A,继续存活的对象被转移到B。此为新生代最常用的算法 标记清理:一块区域,标记要回收的对象,然后回收,一定会出现碎片,那么引出 标记-整理算法:多了碎片整理,整理出更大的内存放更大的对象 两个概念:新生代和年老代 新生代:初始对象,生命周期短的 永久代:长时间存在的对象 整个java的垃圾回收是新生代和年老代的协作,这种叫做分代回收。 P.S:Serial New收集器是针对新生代的收集器,采用的是复制算法 Parallel New(并行)收集器,新生代采用复制算法,老年代采用标记整理 Parallel Scavenge(并行)收集器,针对新生代,采用复制收集算法 Serial Old(串行)收集器,新生代采用复制,老年代采用标记整理 Parallel Old(并行)收集器,针对老年代,标记整理 CMS收集器,基于标记清理 G1收集器:整体上是基于标记 整理 ,局部采用复制
综上:新生代基本采用复制算法,老年代采用标记整理算法。cms采用标记清理。
数组的定义: 数组命名时名称与[]可以随意排列,但声明的二维数组中第一个中括号中必须要有值,它代表的是在该二维数组中有多少个一维数组。
内部类和外部类: 对于外部类来说,只有两种修饰,public和默认(default),因为外部类放在包中,只有两种可能,包可见和包不可见。 对于内部类来说,可以有所有的修饰,因为内部类放在外部类中,与成员变量的地位一致,所以有四种可能。
Static 被static修饰的会默认初始化,int就是0咯 this不能在static的方法中使用~
Super和this this 和 super 必须写在第一行,两者不能同时出现!
面向对象的五大基本原则
单一职责原则(SRP) 开放封闭原则(OCP) 里氏替换原则(LSP) 依赖倒置原则(DIP) 接口隔离原则(ISP)
try-catch-finally 如果try语句里有return,那么代码的行为如下: 1.如果有返回值,就把返回值保存到局部变量中 2.执行jsr指令跳到finally语句里执行 3.执行完finally语句后,返回之前保存在局部变量表里的值 如果try,finally语句里均有return,忽略try的return,而使用finally的return.
public Method[] getDeclaredMethods()返回类或接口声明的所有方法,包括public, protected, default (package) 访问和private方法的Method对象,但不包括继承的方法。当然也包括它所实现接口的方法。 public Method[] getMethods()返回类的所有public方法,包括其继承类的公用方法,当然也包括它所实现接口的方法。
super和this super()和this()均需放在构造方法内第一行。 this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。 this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块
重载和重写 参数不同 方法重载的返回值的类型可以不同,因为判断方法重载的方法主要是根据方法的参数不同来判定;
继承下来的 方法重写的返回值类型需要相同,重写就是子类继承了父类的方法,并在此方法上重写属于自己的特征,既然是继承过来的,那么它的返回值类型就必须要相同
声明
` default String s public final static native int w( ) abstract double d abstract final double hyperbolicCosine( ) A:java的访问权限有public、protected、private和default的,default不能修饰变量 C:普通变量不能用abstract修饰,abstract一般修饰方法和类 D:被定义为abstract的类需要被子类继承,但是被修饰为final的类是不能被继承和改写的`
路径是c:\my\1.txt,但是’\’需要转意,故前面加\,故最终是”c:\my\1.txt”
中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或OS环境。 (简单来说,中间件并不能提高内核的效率,一般只是负责网络信息的分发处理)
封装: 封装就是将属性私有化,提供公有的方法访问私有属性。 为什么需要封装? 通过封装,可以实现对属性的数据访问限制,同时增加了程序的可维护性。 由于取值方法和赋值方法隐藏了实现的变更,因此并不会影响读取或修改该属性的类,避免了大规模的修改,程序的可维护性增强
Socket 客户端通过new Socket()方法创建通信的Socket对象 服务器端通过new ServerSocket()创建TCP连接对象 accept接纳客户端请求
由Socket s=ss.accept();服务器端通过TCP连接对象调用accept()方法创建通信的Socket对象
基本数据类型和引用数据类型: 基本类型只能保存一些常量数据,引用类型除了可以保存数据,还能提供操作这些数据的功能; 为了操作基本类型的数据,java也对它们进行了封装, 得到八个类,就是java中的基本类型的封装类;他们分别是: 八种基本类型: byte short int long float double char boolean 对应的包装类 : Byte Short Integer Long Float Double Character Boolean
标识符: 标识符是以字母开头的字母数字序列,不能以数字开头。 数字是指0~9,字母指大小写英文字母、下划线(_)和美元符号($),也可以是Unicode字符集中的字符,如汉字; 字母、数字等字符的任意组合,不能包含+、- *等字符; 不能使用关键字; 大小写敏感
Servlet 基本功能:service方法是在servlet生命周期中的服务期,根据HTTP请求方法(GET、POST等),将请求分发到doGet、doPost等方法 实现:默认在HttpServlet类中实现。
servlet在多线程下其本身并不是线程安全的。 如果在类中定义成员变量,而在service中根据不同的线程对该成员变量进行更改,那么在并发的时候就会引起错误。最好是在方法中,定义局部变量,而不是类变量或者对象的成员变量。由于方法中的局部变量是在栈中,彼此各自都拥有独立的运行空间而不会互相干扰,因此才做到线程安全。
Math.cos为计算弧度的余弦值,Math.toRadians函数讲角度转换为弧度
异常: 异常分为运行时异常,非运行时异常和error,其中error是系统异常,只能重启系统解决。非运行时异常需要我们自己补获,而运行异常是程序运行时由虚拟机帮助我们补获,运行时异常包括数组的溢出,内存的溢出空指针,分母为0等!
JSP中include指令和include动作 include指令<%@ include file=”test.jsp”%> include动作 include指令与include动作之间的根本性差异在于二者被调用的时间。include指令是在编译阶段的指令,即在编译时,编译器会把指令所指向目标文件的内容复制到指令所在的位置。适合于静态页面 include动作是运行时的语法,在主界面被请求时,才将用到的页面包含进来,更适合用于包含动态页面的情况。
静态include的结果是把其他jsp引入当前jsp,两者合为一体;动态include的结构是两者独立,直到输出时才合并
forward和redirect forward是服务器内部的重定向,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,而客户端并不知道,因此在客户端浏览器的地址栏中不会显示转向后的地址,还是原来的地址。
redirect是客户端的重定向,是完全的跳转,即客户端浏览器会获取到跳转后的地址,然后重新发送请求,因此浏览器中会显示跳转后的地址。由于这种这种方式比forward方式多了一次网络请求,因此其效率要低于forward方式。 客户端的重定向可以通过设置特定的http头或写javascript脚本实现。
volatile 所谓 volatile的措施,就是 1. 每次从内存中取值,不从缓存中什么的拿值。这就保证了用 volatile修饰的共享变量,每次的更新对于其他线程都是可见的。可以理解成:对volatile变量所有的写操作都能立刻被其他线程得知。 2. volatile保证了其他线程的立即可见性,就没有保证原子性。 3.由于有些时候对 volatile的操作,不会被保存,说明不会造成阻塞。不可用与多线程环境下的计数器。
由于及时更新,很可能导致另一线程访问最新变量值,无法跳出循环的情况 多线程下计数器必须使用锁保护。