Day6.10 final ,静态代码块,多态,异常

代码块
1.静态代码块
  位置:类里方法外,格式:static{ }
  执行时机:随着类的加载而加载,优先与对象加载,并且只加载一次
  作用:用于加载一些需要第一时间就加载并且只加载一次的资源
2.构造代码块
  位置:类里方法外,格式:{ }
  执行时机:创建对象时触发,优先于构造方法执行
  作用:用于提取所有构造方法的共性功能
3.局部代码块
  位置:方法里,格式:{ }
  执行时机:调用当前所处方法时才触发
  作用:用来控制变量的作用范围,变量的作用范围越小越好
4.执行顺序:
静态代码块->构造代码块->构造方法【创建好对象】->调用局部代码块所处的普通方法
5.为什么是这样的顺序呢?
静态代码块它也是静态资源,静态资源随着类的加载而加载,优先于对象的创建
静态资源只加载一次,并且一直存在,直到类消失,它才会消失
================================================
final
final是一个关键字,表示最终
1.被final修饰的类是最终类,不可以被继承
2.被final修饰的方法是方法的最终实现,不可以被重写
3.被final修饰的变量其实是一个常量,值不可以被修改
TIPS:声明常量时必须给常量赋值,不赋值会报错
================================================
多态--OOP三大特征之一
多态的前提:继承+重写
口诀1:父类引用指向子类对象
口诀2:编译看左边,运行看右边
解释:如果想要使用多态的效果,方法的声明看的是父类,而具体实现使用的是子类
我们目前学习的多态对象都是把自己当作是一个父类类型,所以:
1)多态对象不可以使用子类特有的功能
2)多态对象使用的成员变量是父类的
3)多态对象使用时,如果父子类中出现同名静态方法,使用的还是父类的
4)多态对象在使用方法时,如果子类重写了,使用的是子类的方法体
TIPS:静态资源属于优先加载的类资源,静态方法不存在重写的现象
==============================================
异常
异常类型 提示信息 报错的行号提示
异常的继承结构
Throwable--异常的顶级父类
    Error--系统异常,不可解决
    Exception--可编程解决的异常
         编译时异常--括号写错了,压根就通不过编译
         运行时异常--RunTimeException--InputMismatchException
异常的处理方案:
1.捕获处理
try{
       可能会出现异常的代码
}catch(异常的类型 异常的名字){
       捕获到异常的处理方案
}
TIPS:Catch可以嵌套,一般写一个Exception做通用解决方案就可以
2.向上抛出
格式:在方法定义的两个括号之间加一个throws 异常类型
          如果有多个异常,可以使用都好隔开
注意:如果方法抛出异常,谁调用这个方法,谁就得处理【捕获/抛出】
          不能把异常抛给main(),需要在main()调用之前解决掉

package cn.tedu.block;

import org.junit.jupiter.api.Test;

/*本类用来测试代码块之间的消息*/
public class TestBlock {
    @Test
    public void test() {
        /*1在创建对象之前,会先自动执行静态代码块,而且此静态代码块只执行一次
         * 2.每一次创建对象时都会调用构造代码块与构造方法,构造代码块先执行*/
        Person p = new Person();
        Person p2 = new Person();
        /*当对象调用方法时,如果方法有局部代码块局部代码块才会触发*/
        p.sleep();
        p.eat();

    }
}

class Person {
    /*静态代码块
     * 位置  类里方法外
     * 触发时机:静态代码块也是静态资源,随着类的加载而加载,优先于对象加载
     * 作用 :用于专门完成一些需要第一时间加载的资源*/
    static {
        System.out.println("我是静态代码块");

    }

    /*构造代码块
     * 位置           类里方法外
     * 触发时机    创建对象时触发,优先与构造方法执行
     * 作用            提取构造方法中的共性内容*/ {

    }
    /*构造方法与类同名。且没有返回值类型,用于创建对象,在创建对象时触发*/

    public Person() {
        System.out.println("我是构造方法");
    }

    public void eat() {
        System.out.println("哈雷路亚");
    }

    /*局部代码块
     * 调用本方法时触发
     * 用来控制变量的控制范围变量的范围越来越好*/ {
        System.out.println("我是局部代码块");
    }

    public void sleep() {
        System.out.println("acc");
    }
}
package cn.tedu.demo;

import org.junit.jupiter.api.Test;
//重写快捷键 ctrl+o
/*本类用于多态的入门案例
 * 口诀对象;父类引用,指向子类对象
 * 编译看左边运行看右边
 * 多态使用的是父类的声明,子类的具体实现
 * 子类不可以调用子类的特有的功能
 * 多态的出现为了统一调用标准,向父类看齐
 * 父类声明的功能才可以用,子类特有的功能用不了
 * 如果想用子类的功能就调用子类的对象*/
public class TestDemo {
    @Test
    public void test() {
        Animal animal = new Animal();
        Cat cat = new Cat();
        /*声明父类new子类对象*/
        Animal animal1 = new Cat();
        animal1.eat();
        System.out.println(animal1.name);
    /*声明子类new父类对象需要进行类型强转
    * java.lang.ClassCastException: cn.tedu.demo.Animal cannot be cast to cn.tedu.demo.Cat
     类型强制转换异常*/
 /*  Cat cat1= (Cat) new Animal();
   Cat cat2=cat1;
   cat2.sleep1();
    cat1.sleep1();
    System.out.println(cat1.name);*/


        /*向下转型*/
        Cat cat1 = (Cat) animal1;
        cat1.sleep1();
    }
}

class Animal {
    String name = "Animal";

    public void eat() {
        System.out.println("填鸭");
    }
}

class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("Dog");
    }
}

class Cat extends Animal {
    String name = "cat";

    @Override
    public void eat() {
        System.out.println("Cat");
    }

    public void sleep1() {
        System.out.println("老子要睡觉");
    }
}
package cn.tedu.demo;

import org.junit.jupiter.api.Test;

/*本类用于多态中元素的测试*/
public class TestDemo2 {
    @Test
    public void test(){
        Cat2 cat2 = new Cat2();
        System.out.println(cat2.sum);
        cat2.eat();
        cat2.play();
        /*创建多态对象
        父类引用 指向子类对象
        编译看左边运行看右边
        多态中成员变量的引用都是父类的
        多态中方法的声明看的是父类的,实现的是子类的
        静态资源属于类不存在重写的现象,只是恰好两个类中有两个同名的静态方法
        如果多态中存在静态资源 调用的是父类资源
        */

        Anamal2 animal2 = new Cat2();
        System.out.println(animal2.sum);//父类的
        animal2.eat();
        animal2.play();           
    }
}

class Anamal2 {
    int sum=10;
    public void eat(){
        System.out.println("吃啥都行");
    }
    public static void play(){
        System.out.println("玩啥都行");
    }
}
/*多态的前提 继承+重写*/
class Cat2 extends Anamal2 {
    int sum=100;

    @Override/*重写注解@Override*/
    public void eat() {
        System.out.println("小猫爱吃小鱼干");
    }
    public static void play(){
        System.out.println("汤姆 And 杰瑞");
    }

}
package cn.tedu.design;

import org.junit.jupiter.api.Test;

/*
 * 本类用于OOP汽车设计综合案例*/
public class DisgnCar {
    @Test
    public void test() {
        Car car = new Car();
        car.start();
        car.stop();
        HongQi hongQi = new HongQi();
        System.out.println(hongQi.color);//奶糖白
        hongQi.start();
        hongQi.stop();
        BSJ bsj = new BSJ();
        System.out.println(bsj.color);
    }
}

//定义汽车类
class Car {
    private String brand;//品牌
    private String color;//颜色
    private double price;//价格
    private double size;//尺寸

    public void start() {
        System.out.println("Fly");
    }

    public void stop() {
        System.out.println("FBI Warning ,STOP!");
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public double getSize() {
        return size;
    }

    public void setSize(double size) {
        this.size = size;
    }
}

class HongQi extends Car {
    String color = "奶糖白";


    @Override
    public void stop() {
        System.out.println("红旗********Stop");
    }
}

class BSJ extends Car {
    String color = "雅虎黑";


    public void fly() {
        System.out.println("速度是七十迈");
    }
}
package cn.tedu.exception;

import java.util.InputMismatchException;
import java.util.Scanner;

/*本类用来测试异常的入门案例*/
/*异常捕获处类的格式
 *
 *       try{
 *                   可能会出现异常的代码
 *    }catch(异常类型  异常的名字){
 *           捕获到了异常,进行处理的解决方案
 *   }
 *异常时典型的多态应用
 *
 * */
public class ExceptionDemo {
    public static void main(String[] args) {
        //  method1();  //人为暴露异常
       // method2();//异常解决方式一
        /*异常的抛出格式:再小括号与大括号之间写:throws 异常类型
        * 如果一个方法抛出了异常,那么谁调用这个方法,谁就需要处理这个异常
        * 两种解决方法  继续向上抛 或者解决掉
        * 一般在main方法调用之前解决而不是把问题抛给main方法,因为没人解决了*/
      f();//在main调用之前对异常进行解决
           // method3();//向上抛出--交给调用者来处理

    }

    private static void f() {
        try {
            method3();
        } catch (Exception e) {
            System.out.println("输入数据非法");
        }
    }

    private static void method3()throws Exception {

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入第一个整数");//.InputMismatchException 输入的值与接收的类型不一样

        int i = scanner.nextInt();
        System.out.println("请输入第二个整数");
        int j = scanner.nextInt();
        System.out.println(i / j);//ArithmeticException: / by zero 算术异常 除数不能为0

    }

    private static void method2() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入第一个整数");//.InputMismatchException 输入的值与接收的类型不一样
        /*try中存放着的时可能会出现异常的代码
        * 如果发生了异常,会被catch捕获,执行之前catch中提供的解决方案
        * try -catch可以嵌套,若果有多种异常类型需要特殊处理的话
        * 这就是多态最为经典的一种用法,我们并不关心子类的具体类型,而是将所有子类统一当做父类类型来处理,提供通用的解决方案*/
        try {

            int i = scanner.nextInt();
            System.out.println("请输入第二个整数");
            int j = scanner.nextInt();
            System.out.println(i / j);//ArithmeticException: / by zero 算术异常 除数不能为0
        } catch (InputMismatchException i) {
            System.out.println("输入数据非法");
        }catch (ArithmeticException a){
            System.out.println("0不能作为被除数");
        }catch (Exception e){
            System.out.println("您输入的数据不对");
        }finally {
            System.out.println("瞎巴巴");
        }


    }

    /*1.不要害怕bug,真正的勇士敢于直面自己写的bug
     * 2.学会看报错的信息提示,确定自己的错误方向
     * 3.学会看报错的行号信息确定自己的报错位置,哪里不对点哪里
     * 注意 源码不会错,要看自己写的代码*/
    private static void method1() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入第一个整数");//.InputMismatchException 输入的值与接收的类型不一样

        int i = scanner.nextInt();
        System.out.println("请输入第二个整数");
        int j = scanner.nextInt();
        System.out.println(i / j);//ArithmeticException: / by zero 算术异常 除数不能为0


    }
}
package cn.tedu.oopfianl;

import org.junit.jupiter.api.Test;

/*本类用来final的入门案例*/

public class TestFinal {
    @Test
    public void test(){
        //6.创建子类对象进行测试
        Son son = new Son();
        son.eat();
        System.out.println(son.name);
    }
}
//1.创建Father类
/*使用final修饰父类,子类不能继承
* final表示最终不能用来修饰类
* 也就是没有子类,他自己就是最终类*/
class Father {
    //3.创建成员变量
    /*final可以用来修饰成员变量,被final修饰的变量值不可以被更改------------常量
    * 主语:常量在定义的时候就需要赋值,否则报错*/
    final String name="干饭人";
    //4.创建普通方法
    /*final修饰方法此方法不能被重写
    * final可以用来修饰方法,被final修饰的方法是最终实现,不能被重写*/
    public  void eat(){
        System.out.println("Father*********");
    }
}
//2.创建Son类 继承Father类
class Son extends Father{
    // name="打过人";
    //重写父类eat方法
    @Override
    public void eat() {
        System.out.println("Son**********");
    }
}
package cn.tedu.work;

import org.junit.jupiter.api.Test;

public class DemoTest {
@Test
    public void test(){
    Father father=new Son();
    father.eat("你是谁");
    System.out.println(father.name);
    System.out.println(father.age);

}

}

class Father {
    String name="我是爹";
    int age=99;
    public void test(){
        this.eat("");
    }
    protected  void  eat( String name){
        System.out.println("我是爹,我要吃饭");
    }
}

class Son extends Father {
    @Override
    public void eat(String name) {
        System.out.println("我是儿子我先吃饭");
    }
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ᥬ᭄?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值