Java基础(三)面向对象(下)

接口

接口中成员修饰符是固定的:

成员常量:public static final 成员函数:public abstract

通过接口间接实现了多重继承

接口的特点

接口是对外暴露的规则 接口是程序的工功能扩展 接口的出现降低耦合性 接口可以用来多实现 类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口 接口与接口之间可以有继承关系

接口与抽象类

抽象类体现继承关系,一个类只能单继承 接口体现实现关系,一个类可以多实现

抽象类中可以定义非抽象方法,供子类直接使用 接口的方法都是抽象,接口中的成员都有固定修饰符

一个简单的实现例子:

package study_java.ex7;

public class InterfaceDemo1 {
    public static void main(String[] args){
        PC pc = new PC();
        Mouse m = new Mouse();
        Iphone ip = new Iphone();
        pc.insertUSB(m);
        pc.insertUSB(ip);
    }
}

// 定义接口
interface USB{
    void connect();
}

// 类实现了接口
class Mouse implements USB{
    public void connect(){
        System.out.println("我是鼠标");
    }
}

class Iphone implements USB{
    public void connect(){
        System.out.println("我是Iphone");
    }
}

class PC {
    public void insertUSB(USB usb){
        System.out.println("插入了usb设备");
        usb.connect();
    }
}

如果有多个接口,并且接口存在继承的时候,代码例子如下:

package study_java.ex7;

public class InterfaceDemo2 {
    public static void main(String[] args){
        TuHao th = new TuHao();
        WomanStar ws = new WomanStar();
        th.marry(ws);
    }
}

interface White{
    public void white();
}

interface Rich{
    public void rich();
}

interface  Beautiful{
    public void beautiful();
}

interface BFM extends White,Rich,Beautiful{

}

class WomanStar implements BFM{
    public void white(){
        System.out.println("我很白");
    }
    public void rich(){
        System.out.println("我很有钱");
    }
    public void beautiful(){
        System.out.println("我很有漂亮");
    }
}


class TuHao{
    public void marry(BFM bfm){
        bfm.white();
        bfm.rich();
        bfm.beautiful();
    }
}

多态

定义:某一类事物的多种存在形态

多态的特点:

成员函数 编译时:要查看引用变量所属类中是否有所调用的成员

在运行时:要查看对象所属类是否有所调用的成员 成员变量 只看引用变量所属的类

关于多态的一个代码例子:

package study_java.ex7;

public class MutilstateDemo1 {
    public static void main(String[] args){
        Jing8 jing8 = new Jing8();
        jing8.meng();
        jing8.cry();

        Dog dog = new Jing8();
        dog.cry();
        dog.watch();



        Animal a = dog;
        a.cry();

        Pet pet = (Pet) a;
        pet.meng();


    }
}


abstract class Animal{
    public void cry(){
        System.out.println("crying...");
    }
}

class Dog extends Animal{
    public void watch(){
        System.out.println("来人了");
    }
}

class Jing8 extends Dog implements Pet{
    public void meng(){
        System.out.println("么么哒");
    }
}

interface Pet{
    void meng();
}

继承中方法可以被覆盖,但是成员变量不能被覆盖

代码例子:

package study_java.ex7;

public class MultiStatDemo2 {
    public static void main(String[] args){
        Jing8 j = new Jing8();
        j.cry();

        Dog dog = j;
        dog.cry();
        System.out.println(j.name);
        System.out.println(dog.name);
    }
}

abstract class Animal{
    abstract public void cry();
}

class Dog extends Animal{
    public String name = "大黄";
    public void cry(){
        System.out.println("旺旺");
    }
}

class Jing8 extends Dog{
    public String name = "小黄";
    public void cry(){
        System.out.println("嘿嘿");
    }
}

异常

异常的体系: Throwable: Error:通常出现重大问题如:运行的类不存在或者内存溢出,不编写代码针对处理 Exception:运行时出现的一些情况,可以通过try catch finally

Exception 和Error的子类名都是以父类名作为后缀的

Trowable中的方法

getMessage():获取异常信息,返回字符串

toString():获取异常信息和异常类名,返回字符串

printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置,返回值void

printStackTrace(printStram s):通常用该方法将异常内容保存在日志文件中

throws和throw

throws用于标识函数暴露出的异常 throw用于抛出异常对象 throws和throw的区别: throws用在函数上,后面跟异常类名,声明抛出异常时使用的关键字 throw用在函数内,后面跟异常对象,抛出异常的语句

异常处理

try { 需要检测的代码 } catch { 异常处理代码 } finally { 一定会执行的代码 }

Finally代码只有一种情况不会被执行,就是在之前执行了System.exit(0)

package study_java.ex8;

public class ThrowableDemo1 {
    public static void main(String[] args){
        float r = divide(4,0);
        System.out.println(r);
        int[] arr = null;
        int[] arr2 = new int[4];
//        System.out.println(getLength(arr2));
        System.out.println(getLength(arr));
    }

    public static float divide(int a, int b){
        return (float) a / b;
    }

    public static int getLength(int[] arr){
        int len = -1;
        try {
            len =  arr.length;
        }
        catch (Exception e){
            System.out.println("出错了"+ e.getMessage());
            // return -2; 这里一般也不会加return
        }
        finally {
            len += 1;
            System.out.println("程序执行完了");
            // return len; 这里一般不会加return
        }
       return len;
    }
}

自定义异常

自定义类继承Exception或者其子类

通过构造函数定义异常信息

通过throw将自定义异常抛出

一个简单的例子:

package study_java.ex7;

public class ExceptionDemo1 {
    public static void main(String[] args){
        Person p = new Person();
        try{
            p.setAge(1000);
        }
        catch (Exception e){
            ((AgeTooBigException)e).printlnError();
        }

    }
}

class Person{
    private int age;
    public int getAge(){
        return age;
    }

    public void setAge(int age) throws  AgeTooBigException {
        if (age > 200) {
            throw new AgeTooBigException();
        }
        this.age = age;
    }
}


class AgeTooBigException extends Exception{
   private String info;
   public AgeTooBigException(String info){
       this.info=info;
   }
   public AgeTooBigException(){
       this("年龄太大了");
   }
   public void printlnError(){
       System.out.println(info);
   }
}

一个稍微复杂的例子:

package study_java.ex7;

public class ExceptionDemo1 {
    public static void main(String[] args){
        Person p = new Person();
        try{
            p.setAge(-10);
        }
        catch (AgeTooBigException e){
            e.printlnError();
        }
        catch (AgeTooSmallException e){
            e.printlnError();
        }
        catch (AgeInvalidException e){
            e.printlnError();
        }

    }
}

class Person{
    private int age;
    public int getAge(){
        return age;
    }

    public void setAge(int age) throws AgeTooBigException,
                                       AgeTooSmallException,
                                       AgeInvalidException {
        if (age > 200) {
            throw new AgeTooBigException();
        }
        else if (age <10 &amp;&amp; age > 0){
            throw new AgeTooSmallException();
        }
        else if (age < 0){
            throw new AgeInvalidException("年龄非法");
        }
        else{
            this.age = age;
        }

    }
}

// 年龄非法异常
class AgeInvalidException extends Exception{
    private String info;
    public AgeInvalidException(String info){
        this.info = info;
    }
    public void printlnError(){
        System.out.println(info);
    }
}

// 年龄太大异常
class AgeTooBigException extends AgeInvalidException{
   public AgeTooBigException(String info){
       super(info);
   }
   public AgeTooBigException(){
       this("年龄太大了");
   }
}

// 年龄太小异常
class AgeTooSmallException extends AgeInvalidException{
    public AgeTooSmallException(String info){
        super(info);
    }
    public AgeTooSmallException(){
        this("年龄太小了");
    }
}

如果我们不处理异常而是直接抛出可以直接在man函数里抛出异常,这样就将异常抛给了java虚拟机

package study_java.ex8;

public class ExceptionDemo1 {
    public static void main(String[] args) throws Exception {
        Person p = new Person();
        p.setAge(-10);
        // 处理异常
        /*
        try{
            p.setAge(2);
        }
        catch (AgeTooSmallException e){
            e.printlnError();
        }
        catch (AgeTooBigException e){
            e.printlnError();
        }
        catch (AgeInvalidException e){
            e.printlnError();
        }
        */
    }
}

class Person{
    private int age;
    public int getAge(){
        return age;
    }

    public void setAge(int age) throws AgeTooBigException,
                                       AgeTooSmallException,
                                       AgeInvalidException{
        if (age> 200){
            throw new AgeTooBigException();
        }
        else if (age < 10 &amp;&amp; age > 0){
            throw new AgeTooSmallException();
        }
        else if (age < 0){
            throw new AgeInvalidException("年龄不合法");
        }
        else {
            this.age = age;
        }

    }
}

class AgeInvalidException extends Exception{
    private String info;

    public AgeInvalidException(String info){
        this.info = info;
    }

    public void printlnError(){
        System.out.println(info);
    }
}

class AgeTooBigException extends AgeInvalidException{
    public AgeTooBigException(String info){
        super(info);
    }
    public AgeTooBigException(){
        this("年龄太大了");
    }
}

class AgeTooSmallException extends AgeInvalidException{
    public AgeTooSmallException(String info){
        super(info);
    }
    public AgeTooSmallException(){
        this("年龄太小了");
    }
}

关于异常处理的细节:

RuntimeException 以及其子类如果在函数中被throw抛出,可以不用再函数上声明抛出语句,也不是必须用try catch语句处理 一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或者异常的子类 如果父类抛出多个异常,那么重写(覆盖)方法必须抛出那些异常的一个子集,不能抛出新的异常

CheckedException 待检异常,也就是非运行时异常,必须使用try catch语句处理

包的概念

对类文件进行分类管理 给类提供多层命名空间 卸载程序文件的第一行 类名的全称的是包名.类名 包也是一种封装方式

如: javac -d classes PackageDemo1.java 编译java源文件,制定存放目录 java -cp classes com.zhaofan.java.PackageDemo1 运行程序,类全限定名

包之间的访问: 被访问的包中的类权限必须是public 类中的成员权限:public 或者protected protected是为其他包中的子类提供的一种权限

如果一个类是public 文件名必须是类名

这里顺便整理一下常见的几种权限在java中:

图片描述

import导入

一个程序文件中只有一个package,可以有多个import 用来导包的类,不导入包中的包

小结:

private 私有的不能继承

public

protected 受保护的,针对其他包中的子类

default 默认,不写,不同包不能继承