文章目录
1、类的三大特性
封装:隐藏对象的内部特性和行为
封装的作用:
1、隐藏代码细节
2、提高代码重用
3、隔离变化
4、保护数据
继承(extends):从基类(父类)获取字段和方法的能力
多态:对象的多种形态,继承是多态的实现基础
多态的三要素:
A.必须有子类和父类,具有继承或实现(继承)B.子类必须重写父类的方法(重写)
C.父类的引用变量指向子类的对象(向上转型)
2、代码块
2.1、构造代码块
使用{}包裹的代码区域,这里的代码区域特指位于class{}下面的而不是存在于其他type method(){}这类函数下面的代码区域
public class HelloA {
{
System.out.println("这是一个构造代码块");
}
}
2.2、构造函数代码块
构造函数代码块指的是构造函数中所包含的代码,类似className(){}中的代码块
public class HelloA {
public HelloA(){
System.out.println("构造函数代码块");
}
}
2.3、静态代码块
static代码块指的是static{}包裹的代码块,且静态代码只执行一次,可以通过Class.forName(“classPath”)的方式唤醒代码的static代码块,但是也执行一次。
public class HelloA {
static{
System.out.println("静态代码块");
}
}
2.4、比较
谁先执行
public class HelloA {
public HelloA(){
System.out.println("构造函数代码块");
}
{
System.out.println("构造代码块");
}
static {
System.out.println("静态代码块");
}
public static void main(String[] args) {
new HelloA();
new HelloA();
}
}
输出:
可以看到显示static代码初始化,然后是构造方法初始化,然后是构造函数初始化,并且静态代码只会初始化一次。
上面的代码编译后是这样的:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
public class HelloA {
/*构造代码块直接被内联到了构造函数代码块中*/
public HelloA() {
System.out.println("构造代码块");
System.out.println("构造函数代码块");
}
public static void main(String[] args) {
new HelloA();
new HelloA();
}
static {
System.out.println("静态代码块");
}
}
初始化的整体顺序可以渐进的表示为
3、c3p0连接池
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。
c3p0工具包下载地址:https://sourceforge.net/projects/c3p0/files/latest/download?source=files
解压找到lib目录下的文件
复制到项目下
在项目文件src下新建配置文件c3p0-config.xml
配置文件详解:https://www.cnblogs.com/tanhao/p/7053102.html
java代码
测试连接数据库
运行debug模式,使代码运行停在数据库关闭之前
登录数据库,查看连接池数量
4、javabean
例
5、jndi
JNDI是 Java 命名与目录接口(根据名字找资源)
步骤:
1、造一个javabean
新建usr.java
2、在tomcat_home/conf/server.xml中,进行配置
也可以像下图操作
把项目从左边添加到右边后,server.xml就自动修改了
3、在tomcat_home/conf/server.xml中,最后几排的Context标签中配置
新建一个servlet
通过jndi获取资源
注意:更改代码并重启tomcat时,tomcat_home/conf/server.xml会自动更新,刚刚写的东西就没在里面了,需要重写
重启tomcat,访问,输出了对应的值
5.1、jndi挂数据库连接池(dbcp)
第一步配置
写servlet
重启tamcat(重启tamcat后配置文件新添加的内容可能消失,记得重新复制进去)
重启成功访问
6、finally覆盖
例1:
如上例子中,finally的return会覆盖try或catch的返回值。还有一种情况,在finally里面有throw时,try或catch也会没有执行return。
例2:
如上例子,会先输出"hahaha",再返回1
例3:
这个最后返回的是1,原理:执行finally之前,try里的return后面已经确定值为1了,后面finally只是把a的值变成了3。