文章目录
- Java 数组
- 声明数组变量
- 创建数组
- Java class.forname
- 实例
- Class.forName 传入 com.mysql.jdbc.Driver后,就知道我连接的数据库是 mysql,为啥,看源码:
- 试试看:
- Class.forName 作用,初始化给定的类。
- Java 包(package)
- 包作用
- 包语句的语法格式为
- 一个Something.java 文件它的内容
- 以下是一些 Java 中的包
- 总结
- 创建包
- 例子
- import 关键字
- Java 异常处理
- 多重捕获块
- throws/throw 关键字
- finally关键字
- 咋给多个java文件编译呢?
Java 数组
声明数组变量
- dataType[] arrayRefVar;
- double[] myList;
创建数组
- dataType[] arrayRefVar = new dataType[arraySize];
Java class.forname
- 大部分人第一次见class.forName(String className) 是在用 JDBC 方式连数据库。
实例
import com.mysql.jdbc.Driver;
import java.sql.*;
public class JdbcDemo {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
String url = "jdbc:mysql://127.0.0.1:3306/mydb";
String username = "root";
String password = "redhat";
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(url, username, password);
String sql = "SELECT * FROM msg";
PreparedStatement prepareStatement = connection.prepareStatement(sql);
ResultSet resultSet = prepareStatement.executeQuery();
resultSet.next();
String address = resultSet.getString("address");
System.out.println(address);
}
}
Class.forName 传入 com.mysql.jdbc.Driver后,就知道我连接的数据库是 mysql,为啥,看源码:
@CallerSensitive
public static Class<?> forName(String className) throws ClassNotFoundException {
Class<?> caller = Reflection.getCallerClass();
return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
}
- 它调用forName0 ,继续跟踪:
private static native Class<?> forName0(String name, boolean initialize,
ClassLoader loader,
Class<?> caller)
throws ClassNotFoundException;
- native 方法,源码只能到此结束。
- 官方文档:https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#forName(java.lang.String)
- 翻译:返回一个给定类或者接口的一个 Class 对象,
- 若没给定 classloader, 就用根类加载器。
- 若initalize为true,那么给定的类如果之前没有被初始化过,那么会被初始化。
- 传入的参数是com.mysql.jdbc.Driver。
- 也就是说这个类会被初始化,看这个类里内容
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
public Driver() throws SQLException {
// Required for Class.forName().newInstance()
}
}
- 一个构造函数和一个静态代码块。
- 类在初始化时,静态代码块的内容会被执行。
- 也就是说Class.forName 和DriverManager.registerDriver(new Driver) 功能等同。
试试看:
public class JdbcDemo {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
String url = "jdbc:mysql://127.0.0.1:3306/mydb";
String username = "root";
String password = "redhat";
//Class.forName("com.mysql.jdbc.Driver");
DriverManager.registerDriver(new Driver());
Connection connection = DriverManager.getConnection(url, username, password);
String sql = "SELECT * FROM msg";
PreparedStatement prepareStatement = connection.prepareStatement(sql);
ResultSet resultSet = prepareStatement.executeQuery();
resultSet.next();
String address = resultSet.getString("address");
System.out.println(address);
}
}
- 代码正常执行。
Class.forName 作用,初始化给定的类。
- 而给定的MySQL 的 Driver 类中,它在静态代码块中通过 JDBC 的 DriverManager 注册了一下驱动。
- 也可以直接用 JDBC 的驱动管理器注册 mysql 驱动,从而代替使用 Class.forName。
Java 包(package)
- 为更好组织类,Java 提供包机制,来区别类名的命名空间。
包作用
- 把功能相关的类或接口放在同个包中,方便类的查和用。
- 同文件夹一样,包用树形目录的存储方式。
- 一包中的类名不同,不同的包中的类的名可相同的,
- 同时调用两不同包中同名类时,应加包名以区别。
- so 包可避免名字冲突
- 包也限定了访问权限,拥有包访问权限的类才能访问包中的类。
Java 用包机制是防止命名冲突,访问控制,提供搜索和定位类(class)、接口、枚举(enumerations)和注释(annotation)等。
包语句的语法格式为
package pkg1[.pkg2[.pkg3…]];
一个Something.java 文件它的内容
package net.java.util;
public class Something{
...
}
- 它路径是 net/java/util/Something.java 这样保存的。
- package把不同java 程序分类保存,方便被其他 java 程序调用。
以下是一些 Java 中的包
- java.lang-打包基础的类
- java.io-包含输入输出功能的函数
总结
- 开发者可把一组类和接口等打包,并定义自己的包。
- 实际开发中这样做是值得提倡的,当你自己完成类的实现之后,将相关的类分组,可以让其他的编程者更容易地确定哪些类、接口、枚举和注释等是相关的。
- 包创建了新的命名空间(namespace),so不会跟其他包中的任何名字产生命名冲突。使用包这种机制,更容易实现访问控制,并且让定位相关类更加简单。
创建包
- 创包时,你要为包取一个合适的名字。
- 之后,如其他的一个源文件包含了这个包提供的类、接口、枚举或者注释类型的时候,都必须将这个包的声明放在这个源文件的开头。
- 包声明应该在源文件的第一行,每个源文件只能有一个包声明,这个文件中的每个类型都应用于它。
- 如果一个源文件中没有使用包声明,那么其中的类,函数,枚举,注释等将被放在一个无名的包(unnamed package)中。
例子
- 这个例子创建了animals的包。
- 通常使用小写的字母来命名避免与类、接口名字的冲突。
- 在 animals 包中加入一个接口(interface):
/* 文件名: Animal.java */
package animals;
interface Animal {
public void eat();
public void travel();
}
- 接下来,在同一个包中加入该接口的实现:
package animals;
/* 文件名 : MammalInt.java */
public class MammalInt implements Animal{
public void eat(){
System.out.println("Mammal eats");
}
public void travel(){
System.out.println("Mammal travels");
}
public int noOfLegs(){
return 0;
}
public static void main(String args[]){
MammalInt m = new MammalInt();
m.eat();
m.travel();
}
}
- 然后,编译这两个文件,并把他们放在一个叫做animals的子目录中。 用下面的命令来运行:
$ mkdir animals
$ cp Animal.class MammalInt.class animals
$ java animals/MammalInt
Mammal eats
Mammal travel
import 关键字
Java 异常处理
try
{
// 程序代码
}catch(ExceptionName e1)
{
//Catch 块
}
多重捕获块
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}
throws/throw 关键字
- 如果一个方法没有捕获到一个检查性异常,则该方法必须使用 throws 关键字来声明。
- throws 关键字放在方法签名的尾部。
- 也可用 throw 关键字抛出一个异常,
- 无论它是新实例化的还是刚捕获到的。
import java.io.*;
public class className
{
public void deposit(double amount) throws RemoteException
{
// Method implementation
throw new RemoteException();
}
//Remainder of class definition
}
- 一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。
import java.io.*;
public class className
{
public void withdraw(double amount) throws RemoteException,
InsufficientFundsException
{
// Method implementation
}
//Remainder of class definition
}
finally关键字
- 用来创建在 try 代码块后面执行的代码块。
- 无论是否发生异常,finally 代码块中的代码总执行。
- 在 finally 代码块中,可运行清理类型等收尾善后性质的语句。
- finally 代码块出现在 catch 代码块最后,语法如下:
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}finally{
// 程序代码
}
咋给多个java文件编译呢?