• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
langQ
博客园    首页    新随笔    联系   管理    订阅  订阅
06 面向对象编程 (续)

Static关键字

静态代码块:只执行一次。


Person.java
package com.mysoft.oop.demo08;

public class Person {
    //2:赋初值
    {
        System.out.println("匿名代码块");
    }

    //1:只执行一次
    static {
        System.out.println("静态代码块");
    }

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

    public static void main(String[] args) {
        new Person();

        System.out.println("==============");
        new Person();

    }
}
出力结果:

静态代码块
匿名代码块
构造方法
==============
匿名代码块
构造方法

静态导入包:
import static java.lang.Math.random;

Test.java
package com.mysoft.oop.demo08;

public class Test {
    public static void main(String[] args) {
        System.out.println(Math.random());
    }
}
package com.mysoft.oop.demo08;

//静态导入包
import static java.lang.Math.random;
public class Test {
    public static void main(String[] args) {
        //System.out.println(Math.random());
        System.out.println(random());
    }
}

一个类如果被final修饰了,这个类就不能再被继承了。

抽象类

abstract修饰的类,就是抽象类;修饰的方法就是抽象方法。

抽象类不是重点! 接口才是重点

//多继承~ 利用接口实现多继承~
//实现了接口的类,都需要重写接口中的方法~

约束

Action.java
package com.mysoft.oop.demo09;

//abstract 抽象类:类  extends 单继承~   (接口可以多继承 )
public abstract class Action {


    //约束~有人帮我们实现
    //abstract,抽象方法,只有方法名字,没有方法的实现!
    public abstract void dosomething();

    //1.不能new这个抽象类,只能靠子类去实现它; 约束!
    //2.抽象类中可以写普通方法
    //3.抽象方法必须在抽象类中
    // 抽象的抽象:约束!
    public void hello() {
        System.out.println("hello");
    }

    //思考题? new,存在构造器么? (经过查看抽象类的class文件,抽象类也有构造方法)
    //存在的意义? 抽象出来  提高开发效率,节省代码。

}
A.java
package com.mysoft.oop.demo09;

//抽象类的所有方法,继承了它的子类,都必须要实现它的方法!除非~
public class A extends Action {
    @Override
    public void dosomething() {
        System.out.println("A=>dosomething");
    }
}
package com.mysoft.oop.demo09;

public class Application {
    public static void main(String[] args) {
        //new Action();  //error 抽象类不能被new
        A a = new A();
        a.dosomething();
        a.hello();
    }
}

接口

接口可以多继承

UserService.java
package com.mysoft.oop.demo10;

//抽象的思维 Java
//interface 定义的关键字,接口都需要有实现类
public interface UserService {

    //常量 public static final(一般都是定义方法,定义常量的少)
    int AGE = 99;

    //接口中所有的定义其实都是抽象的 public abstract
    //public abstract void add() ;
    void add();
    void delete();
    void update();
    void query();

}
TimeService.java
package com.mysoft.oop.demo10;

public interface TimeService {
    void timer();
}
package com.mysoft.oop.demo10;

//抽象类: extends~
//类 可以实现接口 implements 接口
//实现了接口的类,就需要重写接口中的方法~

//多继承~ 利用接口实现多继承~
public class UserServiceImpl implements UserService, TimeService {

    @Override
    public void add() {

    }

    @Override
    public void delete() {

    }

    @Override
    public void update() {

    }

    @Override
    public void query() {

    }

    @Override
    public void timer() {

    }
}

接口的作用:

作用:
  1.约束
  2.定义一些方法,让不同的人实现~  10 --> 1
  3.public abstract
  4.public static final
  5.接口不能被实例化~,接口中没有构造方法~
  6.implements可以实现多个接口
  7.必须要重写接口中的方法

内部类

了解就行

1.成员内部类

package com.mysoft.oop.demo11.sub01;

public class Outer {

    private int id = 10;

    public void out() {
        System.out.println("这是外部类的方法");
    }

    class Inner{
        public void in() {
            System.out.println("这是内部类的方法");
        }

        //获得外部类的私有属性~
        public void getID() {
            System.out.println(id);
        }
    }
}

使用:

package com.mysoft.oop.demo11.sub01;

public class Application {
    public static void main(String[] args) {
        Outer outer = new Outer();
        //通过这个外部类来实例化内部类
        Outer.Inner inner = outer.new Inner();
        inner.in();
        inner.getID();

    }
}

2.静态内部类 内部类定义时 使用了static


package com.mysoft.oop.demo11.sub01;

public class Outer2 {

    private static int id = 10;

    public void out() {
        System.out.println("这是外部类的方法");
    }

    public static class Inner{
        public void in() {
            System.out.println("这是内部类的方法");
        }

        //获得外部类的私有属性~
        public void getID() {
            System.out.println(id);
        }
    }
}

3.局部内部类 在方法内部定义的类,属于局部

package com.mysoft.oop.demo11.sub04;

public class Outer {
    //局部内部类
    public void method() {

        class Inner() {
            public void in() {

            }
        }
    }
}

4.匿名内部类

package com.mysoft.oop.demo11.sub03;

import com.mysoft.oop.demo09.A;

public class Test {

    public static void main(String[] args) {
        Apple apple = new Apple();
        apple.eat();

        //没有名字初始化类,不用将实例保存到变量中
        new Apple().eat();

        UserService userService = new UserService() {
            @Override
            public void hello() {

            }
        };

    }
}

class Apple {
    public void eat() {
        System.out.println("1");
    }
}
interface UserService {
    void hello();
}

不是内部类,一个java文件里可以定义多个类,但只能有一个是public的

package com.mysoft.oop.demo11.sub02;

public class Outer {

}

//一个java文件中可以有多个class,但只能有一个是public的
class A {
    public static void main(String[] args) {

    }
}

经常用A这个类来写测试Outer类的测试类。

异常机制

什么是异常? Exception
实际工作中遇到的情况不可能是非常完美的。
比如:你写的某个模块,用户输入不符合要求,你的程序要打开某个文件,这个文件不存在或者文件格式不对,
你要读取数据库的数据,数据可能为空等等。
跑程序时内存或硬盘满了,等等。

例如:StackOverflowError

Demo01.java
package com.exception.demo01;

public class Demo01 {
    public static void main(String[] args) {
        new Demo01().a();
    }

    public void a() {
        b();
    }

    private void b() {
        a();
    }
}

ArithmeticException异常

package com.exception.demo01;

public class Demo02 {
    public static void main(String[] args) {
        int a = 2;
        int b = 0;

        System.out.println(a / b);
    }
}

异常体系结构:
超类:java.lang.Thowable 作为所有异常类的超类
异常分为两类:错误Error 和 异常Exception

Error和Exception的区别:

异常处理机制

  • 抛出异常

  • 捕获异常

  • 异常处理的五个关键字:try,catch,finally,throw, throws

package com.exception.demo01;

public class Test {
    public static void main(String[] args) {
        int a = 1;
        int b = 0;

        //假设要捕获多个异常:从小到大!
        try {//try监控区域
            //System.out.println(a / b);

            new Test().a();

        } catch (ArithmeticException e) {//catch(想要捕获的异常类型!) 捕获异常
            System.out.println("程序出现异常,变量b不能为零");
        } catch (Throwable t) {
            System.out.println("throwable");

        } finally {//处理善后工作
            System.out.println("finally");
        }

        //finally 可以不要finally  假设IO,资源,关闭!
    }

    public void a() {
        b();
    }

    private void b() {
        a();
    }
}

一个快捷键:
选中代码,然后 ctrl + alt + T

主动的抛出异常:
throw

Test2.java
package com.exception.demo01;

public class Test2 {
    public static void main(String[] args) {
        int a = 1;
        int b = 0;
        try {

            if (b == 0) {//throw   throws
                throw new ArithmeticException();//主动的抛出异常
            }

            System.out.println(a / b);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        }
    }
}

更完全一点儿的例子,方法里抛出异常,然后在调用方法的地方可以捕获,进行处理。

Test3.java
package com.exception.demo01;

public class Test3 {
    public static void main(String[] args) {
        try {
            new Test3().test(1, 0 );
        } catch (ArithmeticException e) {
            throw new RuntimeException(e);
        }


    }

    //假设这个方法中,处理不了这个异常。方法上抛出异常
    public void test(int a, int b) throws ArithmeticException {
        if (b == 0) {
            throw new ArithmeticException(); //主动的抛出异常,一般在方法中使用
        }
        System.out.println(a / b);
    }
}

自定义异常

使用java内置的异常类可以描述编程时出现的大部分异常情况。
还可以自定义异常类,只需要继承Exception类即可。

自定义异常,大体一下几个步骤:
1.创建自定义异常类
2.在方法中通过throw关键字抛出异常对象。
3.如果在当前抛出异常的方法中处理异常,可以使用try-catch捕获并处理;
否则要在方法的声明处通过关键字throws指明要抛出给方法的调用者。
4.在出现异常方法的调用者中捕获并处理异常。

MyException.java
package com.exception.demo02;

//自定义的异常类
public class MyException extends Exception {

    //传递数字 > 10
    private int detail;

    public MyException(int a) {
        this.detail = a;
    }

    //toString:异常的打印信息
    @Override
    public String toString() {
        return "MyException{" + "detail=" + detail + '}';
    }
}
Test.java
package com.exception.demo02;

public class Test {
    //可能会存在异常的方法
    static void test(int a) throws MyException {
        System.out.println("传递的参数为:" + a);
        if (a > 10) {
            throw new MyException(a);//抛出
        }
        System.out.println("OK");
    }

    public static void main(String[] args) {
        try {
            test(11);
        } catch (MyException e) {
            //throw new RuntimeException(e);
            //e.printStackTrace();
            System.out.println("MyException=>"+e );
        }

    }
}

输出结果为:
传递的参数为:11
MyException=>MyException{detail=11}

自定义异常,用的并没有那么多。
只需要了解一下就行,出现的时候能看懂就可以。

代码里有红色的波浪线,可以按住 Alt + Enter键,自动给你提示一些该怎么处理。
非常好用的万能键。

posted on 2024-03-31 20:25  嚯嚯go  阅读(11)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3