文章目录

  • 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文件编译呢?

java 多个模块 打成一个部署包 多个java文件怎么编译_mysql