• 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 && 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 && 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 默认,不写,不同包不能继承

     

  • 相关阅读:
    maven学习(中)- 私服nexus搭建
    批量kill相关所有进程
    install kinect driver for ARM---38
    install usb serial
    用真实的机器人做人脸跟踪器---37
    PCL Nodelets 和 3D 点云---36
    在程序中访问骨架图---35
    openni和骨架追踪 rviz查看---34
    颜色追踪块CamShift---33
    动态的添加和丢弃关键点---32
  • 原文地址:https://www.cnblogs.com/zhaof/p/9267774.html
Copyright © 2020-2023  润新知