1.Java中的 类是单继承,多实现,接口可以 多继承
2. 不同访问修饰符
说明 | public | protected | default | private |
---|---|---|---|---|
同包同类 | √ | √ | √ | √ |
同包不同类 | √ | √ | √ | |
同包不同类继承 | √ | √ | √ | |
不同包继承 | √ | √ | ||
访问不同包无任何关系的类 | √ |
public class Parent {
private void m1(){}
void m2(){}
protected void m3(){}
public static void m4(){}
}
子类中一定能够继承和覆盖Parent类的m3方法
D.static修饰的成员属于类成员,父类字段或方法只能被子类同名字段或方法遮蔽,不能被继承覆盖,
3.程序题
public class TestThread {
public static void main(String[] args) {
Runnable runner = new Runnable() {
public void run() {
System.out.print("foo");
}
};
Thread t = new Thread(runner);
t.run();
System.out.print("bar");
}
线程的启动方式只能通过start在这种方式才能真正的实现多线程的效果,手动调用run()方法和普通方法没什么区别,调用start()后, 线程会被放到等待队列 ,等待CPU调度,并不一定要马上开始执行,只是将这个线程置于可动行状态。然后通过JVM,线程Thread会调用run()方法,执行本线程的线程体。 这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码
4.Java运行时数据区划分 .
-
程序计数器:①较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器
②每条线程都需要有一个 独立的程序计数器(线程私有) ,各线程PCR互不影响,独立存储
③唯一一个在JVM规范中没有规定任何OutOfMemoryError的区域 -
虚拟机栈:① 线程私有 ,生命周期与线程相同
②描述的是Java方法执行的内存模型,每个方法执行时,都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息
③栈帧中的局部变量表包括基本数据类型(boolean,byte,short,int,float,long,double),对象引用和ReturnAddress类型(指向一条字节码指令的地址) -
本地方法栈(线程私有):①与VM Stack相似,只不过VM Stack为虚拟机执行Java方法服务,而本地方法栈为虚拟机使用到的Native方法服务
②有的虚拟机具体实现时,将VM Stack和Native Method Stack合二为一 -
Java堆:①JVM管理的内存中最大的一块,为 线程所共享 ,JVM启动时创建
②所有的对象实例和数组都在堆上heap分配
③Java堆是垃圾收集器管理的主要区域,也成为“GC堆”,按分代收集算法,Java堆还可以细分为新生代和老年代 -
方法区:① 各线程共享 的内存区域,用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译后的代码等数据
②逻辑上为堆的一部分,所以HotSpot也把其实现放在堆的老年代上
5.类的初始化过程也就是方法执行的过程
父类的静态变量——》父类的静态代码块——》子类的静态变量——》子类的静态代码块 ——》父类的非静态变量——》父类的非静态代码块——》父类的构造函数 ——》子类的非静态变量——》子类的非静态代码块——》子类的构造函数
总结规律:
- 父类先于子类
- 静态的先于非静态的
- 变量先于代码块
package cn.htsb.test;
class Base {
Base() {
System.out.println("Base");
}
}
public class Alpha extends Base {
public static void main( String[] args ) {
System.out.println("即将创建实例Alpha");
new Alpha();
System.out.println("即将创建实例base");
//调用父类无参的构造方法
new Base();
}
运行结果
即将创建实例Alpha
Base
即将创建实例base
Base
由于Alpha类是继承了Base类,所以在进行new Alpha()的时候,首先要加载父类的构造方法,然后再执行子类的构造方法.
6.重载与重写的区别
重载 | 重写 |
---|---|
重载是在编译器通过方法中形参的静态类型确定调用方法版本的过程。 | 重写在方法运行时,通过调用者的实际类型来确定调用的方法版本。(具体细说,就是子父类中的重写方法在对应的class文件常量池的位置相同,一旦子类没有重写,那么子类的实例就会沿着这个位置往上找,直到找到父类的同名方法) |
重载是多态在编译期的表现形式 | 重写只发生在可见的实例方法中:1、静态方法不存在重写,形式上的重写只能说是隐藏。2、私有方法也不存在重写,父类中private的方法,子类中就算定义了,就是相当于一个新的方法。3、静态方法和实例方法不存在相互重写。 |
重载的判定 只有两个条件(其他的条件都不能作为判定): 1、 方法名一致 2、形参列表不同 | 重写满足一个规则:两同两小一大 1、两同:方法名和形参列表一致 2、两小:重写方法的返回值(引用类型)和抛出异常,要和被重写方法的返回值(引用类型)和抛出异常相同或者是其子类。注意,一旦返回值是基本数据类型,那么重写方法和被重写方法必须相同,且不存在自动拆装箱的问题。 3、一大:重写方法的访问修饰符大于等于被重写方法的访问修饰符。 |
7.算法的特征
- 有穷性 :算法必须能在执行有限个步骤之后终止
- 确切性
- 输入项
- 输出项
- 可行性: 每个计算步都可以在有限时间内完成(也称之为有效性)
8.JSP的生命周期
- 创建Servlet实例(客户第一次请求某个Servlet时,系统创建该Servlet实例;或者当WEB应用启动时立即创建Servlet实例,即load-on-startup Servlet)
- WEB容器调用Servlet的init方法,对Servlet进行初始化(只执行一次初始化)
- Servlet初始化后,将一直存在容器中用于响应客户端请求。 客户端发送GET请求–》调用Servlet的DoGet方法响应;客户端发送POST请求–》调用Servlet的DoPost方法响应;或者统一使用service()方法处理、响应客户请求(每当用户端运行JSP时,jsp service()方法都会运行一次)
- WEB容器决定销毁Servlet时,调用destroy方法,通常在关闭WEB应用之前调用 (只执行一次destory方法)
9.线程
- run() 方法用来执行线程体中具体的内容
- start() 方法用来启动线程对象,使其进入就绪状态
- sleep() 方法用来使线程进入睡眠状态
- suspend() 方法用来使线程挂起,要通过resume()方法使其重新启动
10.Java的异常处理
- throws用于在方法上声明该方法不需要处理的异常类型,用在方法上后面跟异常类名 可以是多个异常类
- throw用于抛出具体异常类的对象,用在方法内 后面跟异常对象只能是一个异常类型实体.
- try块必须和catch块或和finally同在,不能单独存在,二者必须出现一个. finally块总会执行,不论是否有错误出现.但是若try语句块或会执行的catch语句块使用了JVM系统退出语句,finally块就不会被执行了. 一般我们把关闭资源的代码放在finally里面 保证资源总是能关闭
- final用于声明属性、方法、类。分别表示属性不可更改 、方法不能被覆盖 、类不能被继承。