静态
static static是静态的, 修饰的内容 不受对象控制的
1.静态(static)在Java中的使用
1.static 修饰成员变量
2.static修饰成员方法
3.static修饰代码块
1.1static 修饰成员变量
静态的成员变量
语法格式:
static 数据类型 变量名字;
static String name;
在main主函数中使用
类.静态变量 = 值;
注意事项:
1.使用static修饰的成员变量叫静态变量
2.代码中对象还没有创建的时候,类已加载的时候,静态的属性已经存在了。早于对象创建的。
3.内存分析: 当person类被编译成字节码文件的时候,可以将static修饰的变量存到静态变量存到额内存中。堆中 heap
1.2静态方法
静态成员方法:
语法格式
public static 返回值 方法的名字(参数列表){
}
import java.util.jar.Attributes.Name;
class Student {
String name;
//只能通过对象来调用
public void eat() {
System.out.println("吃水果");
}
//类名.方法的名字
//静态方法的方法的中能不能使用 非静态的成员变量和方法? 不可以
//Cannot make a static reference to the non-static field name
public static void drink () {
// name = "xixi";
// eat();
System.out.println(a);
System.out.println("喝白开水");
}
}
public class Demo2 {
public static void main(String[] args) {
Demo2.test();
//Student.eat();
Student.drink();
}
public static void test () {
System.out.println("测试");
}
}
1.3静态代码块
语法格式:
static {
语句体
}
只要类加载了,这个静态代码块就会被执行
执行顺序: 静态代码块 -》 构造代码块-》构造方法
class Teacher {
{
System.out.println("构造代码块");
}
public Teacher () {
System.out.println("无参构造方法");
}
//只要类被加载了 就执行了
static {
System.out.println("执行了静态代码块");
}
}
public class Demo3 {
public static void main(String[] args) throws ClassNotFoundException {
//Teacher teacher = new Teacher();
Class.forName("com.qf.a_static.Teacher");//没有实例化对象,但是加载了 Teacher这个类的
}
}
1.异常
1.1错误和异常
Java中的错误 Error:是代表JVM本身的错误,我们无法通过代码进行处理 Error很少出现,一旦出现就意味着大换血
Java中的异常 Exception:代表Java程序在运行过程中出现了不可预期的错误,然后影响了代码的正常运行,可以使用Java中的异常的处理机制来处理一下代码,让代码能够正常的执行下去。
1.2Throwable【开发不用】
Java是面向对象开发的,Java中封装好了一个类叫Throwable类,这个类是专门处理错误和异常的类。
学会官方的API手册:
1.先看这个类是否是接口 类 或者抽象类
2.要看继承关系
3.构造方法(目的是啥? 是否能实例化)
4.看方法
构造方法:
Throwable()
构造一个新的可抛出的null
作为其详细信息。
Throwable(String message)
构造一个具有指定的详细消息的新的throwable。方法:
String
getMessage()
返回此throwable的详细消息字符串。
void
printStackTrace()
将此throwable和其追溯打印到标准错误流。
package com.zkf.m;
public class Dome1 {
public static void main(String[] args) {
Throwable throwable = new Throwable();
System.out.println(throwable);
System.out.println(throwable.getMessage());//null
Throwable throwable2 = new Throwable("狗蛋");
System.out.println(throwable2.getMessage());//狗蛋
//throwable2.printStackTrace();
}
}
1.3异常【重点】
Java中封装好了处理异常的机制。
Java异常分为两大类:
编译时异常: 在写代码的编译器会报红
FileNotFoundException
SQLException
ClassNotFoundExcetion
InterruptException
运行时异常: 在运行的时候 出现的异常
ArrayIndexOutOfBoundsException 数组下标越界的异常
当Java代码出现了异常,然后就可以是使用Java的处理机制来处理,如果没有出现异常就正常执行即可
1.3.1异常的捕捉
在程序运行过程中,难免会出现异常,这个时候Java中捕捉异常的语法格式进行异常的处理
语法格式:
try {//尝试
可能出现异常代码
} catch(异常对象) {//抓
//针对于上面异常的处理方案
}
执行流程: 如果try里面的代码没有异常,跳过catch 然后接着往下执行。
如果trye里面有异常,就执行catch后面大括号的代码
public class Demo1 {
public static void main(String[] args) {
test(3, 0);
}
public static void test(int a, int b) {
// Exception in thread "main" java.lang.ArithmeticException: / by zero
// at com.qf.d_exception.Demo1.test(Demo1.java:8)
// at com.qf.d_exception.Demo1.main(Demo1.java:5)
int c = 0;
try {
c = a / b;
}catch (Exception e) {//catch 抓 捕捉
//Exception e = new ArithmeticException(); 多态
//jvm会抛出一个异常的实例(对象) 将对象赋值给ArithmeticException e = new ArithmeticException()
System.out.println("代码有异常,你自己看着办");
System.out.println("除数不能为0");
}
System.out.println(c);
System.out.println("嘻嘻");
}
}
语法格式:
多个异常
try {
可能出现的异常的代码
} catch(异常对象1) {
} catch (异常对象2) {}
或
try {
可能出现的异常的代码
} catch(异常对象1 | 异常对象2 e) {
}public class Demo2 { public static void main(String[] args) { int[] arr = new int[2]; test(3, 1, arr); } public static void test(int a, int b, int[] arr) { int c = 0; try { c = a / b;//除数为0 jvm抛出一个异常ArithmeticException arr[4] = 20;//jvm抛出一个异常ArrayIndexOutOfBoundsException } catch (ArithmeticException e) { System.out.println("除数不能为0"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("数组下标越了界"); } System.out.println("代码结束了"); } }
try {//尝试
可能出现异常代码
} catch(异常对象) {//抓
//针对于上面异常的处理方案
} finally {
最终执行的代码
}执行流程: 如果try里面的代码没有异常,跳过catch 然后接着往下执行。
如果trye里面有异常,就执行catch后面大括号的代码
finally代码无论有没有异常都要执行
最终版本
public class Demo4 {
public static void main(String[] args) {
int[] arr = new int[2];
test(3, 0, arr);
}
public static void test (int a, int b, int[] arr) {
int c = 0;
try {
c = a / b;//除数为0 jvm抛出一个异常ArithmeticException
arr[4] = 20;//jvm抛出一个异常ArrayIndexOutOfBoundsException
} catch (Exception e) {
System.out.println("除数不能为0或者数组下标越界");
System.out.println(e.getMessage());/// by zero
}
System.out.println("代码结束了");
}
}
1.3.2异常的抛出
代码出现异常的地方进行抛出异常,特别是关于编译时异常的时候,为了保证咱们代码编译通过
可以使用异常抛出的语法格式来进行抛出异常
throws : 关键字 名词 告知调用者 此处有异常 一定注意一下 别写错了
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;public class Demo5 {
public static void main(String[] args) throws Exception{
//在当前出现异常代码所在的方法的后面 书写关键字 throws 异常类
Thread.sleep(1000);
FileInputStream fis = new FileInputStream(new File("c:/aaa/1.txt"));
}
}
1.3.3throw
抛的动作, 可以抛出来一个异常对象。 自己可以造错!!!
import java.util.Scanner;
public class Demo6 {
public static void main(String[] args) throws Exception{
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = scanner.next();
if (!username.equals( "狗蛋")) {
//throw 是抛的动作 后面跟的是一个异常的对象
//new Exception("用户名不存在"); 编译时异常
throw new Exception("用户名不存在");//造错!!!
}
System.out.println("请输入密码:");
String password = scanner.next();
if (!password.equals("123")) {
throw new Exception("密码错误");
}
System.out.println("登陆成功!!!");
}
}
1.3.4自定义异常
开发中会遇到很多的异常,但是Java中给咱们提供的异常不足以描述了。
咱们可以自己造异常
//抄别人的异常类 单身人士的异常类
class SinglerException extends Exception{
public SinglerException () {
super();
}
public SinglerException (String message) {
super(message);
}
}
public class Demo7 {
public static void main(String[] args) throws Exception {
buy(false);
}
//true 是单身 false 不是单身
public static void buy (boolean isSingle) throws Exception{
if (isSingle) {
throw new SinglerException("单身不能进店购买");
}
System.out.println("情侣买一送一!!!");
}
}