Java面向对象 ------------------抽象类,接口,异常

本文详细探讨了Java中的抽象类与抽象方法,接口的使用及其优势,以及异常处理的最佳实践。包括抽象类的定义、接口的多继承特性、异常种类和处理方式,以及重写方法时的异常规则。

一,抽象

关键字:abstract  

此关键字修饰方法为抽象方法,修饰类为抽象类。但不能修饰属性,构造器,私有方法,静态方法,final修饰的方法

抽象思维,是人类思维达到高级阶段产生的一种能力,例如,当小孩子思维尚未成熟时,他们只能掌握具体概念,他们在学习代词“你、我、他”时往往遇到困难,因为代词具有较高的抽象性。
抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。
对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。

1)抽象类

抽象类的定义语法:访问修饰符   abstract   class   A{   }

一旦A类被抽象了就不能造对象了,但一定还有构造器便于子类造对象用,开发中都会提供抽象类的子类来造对象。 

2)抽象方法

 抽象类的定义语法:访问修饰符   abstract   void   A( ) ;

注意:没有花括号,没有方法体

3)抽象类,抽象方法说明

>包含抽象方法的类一定是抽象类,单抽象类中可以没有抽象方法

>子类重写父类中所有的抽象方法后方可实例化,若没有重写或重写完则子类也是抽象类需要用abstract来修饰

二,接口

关键字:interface 接口, implements  实现

面向接口编程就是先把客户的业务逻辑线提取出来,作为接口,业务具体实现通过该接口的实现类来完成。当客户需求变化时,只需编写该业务逻辑的新的实现类,替换该接口的实现类就可以完成需求,不需要改写现有代码,减少对系统的影响。

优点:降低代码间的耦合性易于程序的扩展,提高了程序的可扩性性,提高了程序的可维护性

定义接口的语法:

[访问修饰符interface 接口名   extends 父接口1,父接口2,…{

                    //常量定义

                    //方法定义

}

类实现接口的语法:

[访问修饰符]  class  类名  extends  父类名 implements  接口1,接口2,…{

                    //类成员

}

1)接口特性

接口的命名规则与类相同。如果修饰符是public,则该接口在整个项目中可见;如果省略修     饰符,则该接口只在当前包可见。
接口中可以定义常量,不能定义变量。接口中的属性都会自动用public static final 修饰,即接口中的属性都是全局静态常量。
接口中方法自动用public  abstract修饰,接口中所有方法都是抽象方法。
接口不能实例化,接口中不能有构造方法。
接口直接可以通过extends实现继承关系,一个接口可以继承多个接口,但是接口不能继承类。
接口的实现类必须实现接口的全部方法,否则必须定义为抽象类。 

 

 2)类图展示

 

3)抽象类和接口的联系和区别? 

相同点:

1.代表系统的抽象层
2.都不能被实例化
3.都能包含抽象方法:用于描述系统提供的服务,不必提供具体实现

不同点:

1.在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法
2.抽象类便于复用,接口便于代码维护
3.一个类只能继承一个直接的父类,但可以实现多个接口

 

 4)接口在说明

>与类属于同一级别,可以实现多继承效果父类只能有一个,但接口可以有多个

>JDK7及以前接口只能定义(public  static  final)修饰的全局常量和(abstrack)修饰的抽象方法。

JDK8以后接口还可以定义静态方法,和默认方法 

>开发中接口通过让类去实现使用,如果实现类实现了接口中的所有抽象方法,则就可以实例化

 class A extend B implements C , D , E

A类继承B类实现C,D,E接口

>可以通过:接口 . super . 方法    在子类实现类中调用接口中的方法

5,案例

package com.bdqn.lianxi;

public class jiekou {//测试类
    public static void main(String[] args) {
        Computer computer = new Computer();
        //创建接口非匿名实现类的非匿名对象
        printer prin = new printer();
        computer.transferDate(prin);
        //创建接口非匿名实现类的非匿名对象
        Flash flash = new Flash();
        computer.transferDate(flash);
        System.out.println("**************************");
        flash.start();
        flash.stop();
        //创建接口非匿名实现类的匿名对象
        computer.transferDate(new printer());
        //创建接口的匿名实现类的非匿名对象
        USB phone = new USB() {
            @Override
            public void start() {

                System.out.println("手机开始工作");
            }

            @Override
            public void stop() {
                System.out.println("手机结束工作");
            }
        };
        computer.transferDate(phone);
        //创建接口的匿名实现类的匿名对象
        computer.transferDate(new USB() {
            @Override
            public void start() {
                System.out.println("mp3开始工作");
            }

            @Override
            public void stop() {
                System.out.println("mp3结束工作");
            }
        });


    }


//___________________________________________________________________________________________

    static class Computer{//电脑
        public void transferDate(USB usb){
            usb.start();

            System.out.println("具体的传输数据的细节");

            usb.stop();
        }
    }


//___________________________________________________________________________________________

    interface USB{//接口
        void start();

        void stop();
    }

    //___________________________________________________________________________________________
    static class Flash implements USB{//实现接口-----优盘

        @Override
        public void start() {
            System.out.println("优盘开启工作");
        }

        @Override
        public void stop() {
            System.out.println("优盘结束工作");
        }
    }

//___________________________________________________________________________________________

    static class printer implements USB{//打印机

        @Override
        public void start() {
            System.out.println("打印机开始工作");
        }

        @Override
        public void stop() {
            System.out.println("打印机结束工作");
        }
    }


}

 

三,异常 

1)异常种类,常见异常类型

Thowable-----------------------------------------------------------------------

              Error------------------------------------------------------------------

              Exception-----------------------------------------------------------

                              checked-------------------(编译时异常)--------

                              unchecked---------------(运行时异常)-------------

常见异常类型

 2)处理异常

抓抛模型

2.1  ;  try - cath - finally

关键字 , try - cath - finally

 /* try {
        可能出现异常的代码
    }catch(异常类型  变量名){
        处理异常方式
    }catch(异常类型  变量名){
        处理异常方式
    }catch(异常类型  变量名){
        处理异常方式
    }finally{
        一定会执行的代码
    }*/

 异常类型如果有父子类关系要求子类必须声明在父类上面

catch中处理异常常写       变量名 . printstackTrace()        变量名 . getMessage()

2.2 ;throws     throw

关键字:throws(抛出异常)   throw(制造异常)

格式

 public void num()throws (异常类型),(异常类型),...........,(异常类型){
        方法体
    }

 谁调这个方法就抛给谁

public void setSex(String sex) throws Exception {
		if ("男".equals(sex) || "女".equals(sex))
			this.sex = sex;
		else {
			throw new Exception(“性别必须是\"男\"或者\"女\"!");
		}
	}

throw 通常跟 throws一起用

2.3自定义异常类

/**
 * 自定义异常类
 */
public class AgeException extends Exception{//AgeException继承与一个异常类

    public AgeException() {
    }

    public AgeException(String message) {
        super(message);
    }
}

三,重写方法抛异常

>子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型

>如果父类中被重写的方法没有抛异常(throws)则子类中重写的方法也不能用(throws)抛异常如果出现异常就需要用try - catch来解决

>如果几个类是递进关系先都throws抛出来在try - catch

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值