封装:隐藏对象的内部特性和行为
封装的作用: 1、隐藏代码细节 2、提高代码重用 3、隔离变化 4、保护数据
继承(extends):从基类(父类)获取字段和方法的能力 多态:对象的多种形态,继承是多态的实现基础
多态的三要素: A.必须有子类和父类,具有继承或实现(继承)
B.子类必须重写父类的方法(重写)
C.父类的引用变量指向子类的对象(向上转型)
使用{}包裹的代码区域,这里的代码区域特指位于class{}下面的而不是存在于其他type method(){}这类函数下面的代码区域
public class HelloA { { System.out.println("这是一个构造代码块"); } }构造函数代码块指的是构造函数中所包含的代码,类似className(){}中的代码块
public class HelloA { public HelloA(){ System.out.println("构造函数代码块"); } }static代码块指的是static{}包裹的代码块,且静态代码只执行一次,可以通过Class.forName(“classPath”)的方式唤醒代码的static代码块,但是也执行一次。
public class HelloA { static{ System.out.println("静态代码块"); } }谁先执行
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("静态代码块"); } }初始化的整体顺序可以渐进的表示为
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模式,使代码运行停在数据库关闭之前 登录数据库,查看连接池数量
例
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,访问,输出了对应的值
第一步配置 写servlet 重启tamcat(重启tamcat后配置文件新添加的内容可能消失,记得重新复制进去) 重启成功访问
例1: 如上例子中,finally的return会覆盖try或catch的返回值。还有一种情况,在finally里面有throw时,try或catch也会没有执行return。
例2: 如上例子,会先输出"hahaha",再返回1
例3: 这个最后返回的是1,原理:执行finally之前,try里的return后面已经确定值为1了,后面finally只是把a的值变成了3。
