学习第三周

目录

接口的使用

定义

接口与类的关系

如何定义接口,接口中的成员

在Java开发中,接口都通过让类去实现(implements)的方式来使用

Java类可以实现多个接口(多实现)

创建接口匿名实现类对象

注意

内部类

定义

内部类分类

成员内部类

   一方面:作为外部类的成员:

   另外一方面:作为类:

关注以下三个问题:

 1 、如何实例化成员内部类的对象

 2、  如何在成员内部类中区分调用外部类的结构

 3、开发中局部内部类的使用

异常:

定义

 Error

 Exception

常见的异常

1、运行时异常

 2、编译时异常

异常处理:抓抛模型

 方法一:try-catch-finally

    格式

    说明

    finally说明

 方法二:throws+异常类型

    使用

    体会

如何选择try--catch--finally还是throws?


接口的使用:

定义:

接口使用interface来定义

接口与类的关系:

在Java中,接口和类是并列的两个结构

如何定义接口,接口中的成员:

        1、  JDK7及以前,只能定义全局常量和抽象方法

              > 全局常量:public static final的,但是书写时可以省略不写

              > 抽象方法:public abstract 的,但是书写时可以省略不写

       

        2、  JDK8:除了定义全局变量和抽象方法之外,还可以定义静态方法、默认方法

在Java开发中,接口都通过让类去实现(implements)的方式来使用:

   如果实现类实现了接口中的所有抽象方法,则此实现类可以实例化,如果实现类没有重写完所有的抽象方法,则实现类不可以实例化。

Java类可以实现多个接口(多实现)

---->一定程度上弥补了Java单继承性的局限性

  格式:class AA extends BB implements CC,DD

创建接口匿名实现类对象:

1、  创建类接口的非匿名实现类的非匿名对象

 

2、  创建类接口的非匿名实现类的匿名对象

3、  创建类接口的匿名实现类的非匿名对象

4、  创建类接口的匿名实现类的匿名对象

 

注意:

接口中是不能定义构造器,意味着接口不可以实例化

接口与接口之间可以继承,而且还可以多继承

接口具体的使用,体现多态性

接口实际上看作是一种规范

内部类:

定义:

Java中允许将一个类A声明在另一个类中,则类A就是内部类,类B就为外部类

内部类分类:

成员内部类(静态、非静态)、局部内部类(方法内、代码块内、构造器内)

成员内部类:

   一方面:作为外部类的成员:

          >  可以调用外部类的结构

          >  可以用static修饰

          >  可以被四种不同的权限修饰

   另外一方面:作为类:

          >  类内可以定义属性、方法、构造器等

          >  可以被final修饰,表示此类不能被继承。言外之意,不适用final则就可以被继承

          >  可以用abstract修饰,表明类不能被实例化

class Person{
    String name;
    int age ;
    public void eat(){
        System.out.println("吃饭");
    }

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

       }
    }

    {
        //局部内部类
        class BB{

        }
    }
    public Person(){
        //局部内部类
       class CC{

       }
    }

    //成员内部类
    //静态成员内部类
   abstract static class Brian{
        String name;
        public Brian(){

        }
        public void think(){
            System.out.println("think");
        }
    }
    //非静态成员内部类
    class legs{
        String name;
        public legs(){

        }
        public void walk(){
            System.out.println("walk");
            Person.this.eat();//调用外部类的属性(非静态)
        }

    }
}

关注以下三个问题:

1 、如何实例化成员内部类的对象

   public class InnerClassTest {
    public static void main(String[] args) {
        //创建Brain实例(静态的成员内部类)
        Person.Brain brain = new Person.Brain() {
            @Override
            public void think() {
                super.think();
            }
        };
        //创建legs实例(非静态成员内部类)
        Person p = new Person();
        Person.legs leg = p.new legs();
        leg.walk();
    }
}
class Person{
    String name;
    int age ;
    public void eat(){
        System.out.println("吃饭");
    }

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

       }
    }

    {
        //局部内部类
        class BB{

        }
    }
    public Person(){
        //局部内部类
       class CC{

       }
    }

    //成员内部类
    //静态成员内部类
   abstract static class Brain{
        String name;
        public Brain(){

        }
        public void think(){
            System.out.println("think");
        }
    }
    //非静态成员内部类
    class legs{
        String name;
        public legs(){

        }
        public void walk(){
            System.out.println("walk");
            Person.this.eat();//调用外部类的属性(非静态)
        }

    }
}

2、  如何在成员内部类中区分调用外部类的结构

       

 3、开发中局部内部类的使用

 public Comparable getComparable(){

         //创建一个实现了Comparable接口的类
         //方式一:
//         class MyComparable implements Comparable{
//
//             @Override
//             public int compareTo(Object o) {
//                 return 0;
//             }
//
//         }
//         return new MyComparable();

//         //方式二:
//         return new Comparable() {
//             @Override
//             public int compareTo(Object o) {
//                 return 0;
//             }
//         };
//     }

}

异常:

定义:

Java语言中,将程序执行中发生的不正常的情况称为“异常”

 Error:

Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况,易班不编写针对性代码进行处理。

 Exception:

其他因编程错误或偶然的外在因素导致一般性问题,可以使用针对性的代码进行处理。例如:

           *空指针访问

           *试图读取不存在的文件

           *网络链接中断

           *数组角标越界

异常体系结构:

常见的异常:

1、运行时异常

import java.util.Scanner;
public class ExceptionTest {
    //NullpointerException  空指针
//    public void test1(){
//        int []arr = null;
//        System.out.println(arr[3]);
//    }
    //数组角标、字符串越界
   public void test2(){
       //数组越界
//        int [] arr = new int[10];
//        System.out.println(arr[10]);
       //字符串越界
//       String str = "abc";
//       System.out.println(str.charAt(3));
//
  }

    //类型转换异常


    //NumberFormatException
//    public void test4(){
//       String str = "123";
//       int num = Integer.parseInt(str);
//    }
    //InputMismatchException
//    public void test5(){
//       Scanner scanner = new Scanner(System.in);
//       int score  = scanner.nextInt();
//       System.out.println(score);
//    }
    //ArithmeticException
//    public void test6(){
//       int a = 10;
//       int b = 0;
//       System.out.println(a/b);

//    }

}

 2、编译时异常

异常处理:抓抛模型

 “抓”:

 方法一:try-catch-finally

格式:

   try{

     //可能出现异常的代码

}catch(异常类型1 变量名1){

   //处理异常的方式

}catch(异常类型2 变量名2){

   //处理异常的方式

}catch(异常类型3 变量名3){

   //处理异常的方式

}

......

finally{

//一定会执行的代码

}

说明:1、finally是可选的

          2、使用try将可能出现异常的代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象的类型,去catch中进行匹配

          3、一旦try中的异常对象匹配到某一个catch时,就进入catch中进行异常处理,一旦处理完成就跳出当前的try--catch结构(没有写finally的情况),继续执行其后的代码。

          4、catch中的异常类型如果没有子父类关系,则谁声明在下,谁声明在上无所谓,如果有子父类关系,则要求子类必须声明在父类上方。

          5、异常对象处理的方式:

              >  String getMessage( )

             >  printStackTrace( )

          6、在try结构中声明的变量在出了try结构之后不能再调用

          7、try--catch--finally结构可以嵌套

     在使用try--catch--finally处理编译时异常,是使程序在编译时就不再报错,但是运行时仍可能报错。相当于我们使用try--catch--finally将一个编译时可能出现的异常延迟到运行时出现

finally 说明:

  1. finally是可选的
  2. finally中声明的是一定会被执行的代码,即使catch中又出现了异常,try、catch中有return语句

方法二:throws+异常类型

1、使用

“throws+异常类型”写在方法的声明除,指明此方法执行是,可能会抛出的异常类型。一旦当方法体执行时,出现异常,仍会在一场的代码出生成一个异常类的对象,此对象满足throws后异常类型时就会被抛出

2、体会:

try--catch--finally:真正的把异常处理掉了

throws只是将异常抛给了方法的调用者,并没有真正的将异常处理掉

如何选择try--catch--finally还是throws?

    3.1 如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着子类重写的方法中又一场,必须使用try--catch--finally方式处理。

    3.2 在执行方法中,先后又调用了另外几个方法,这几个方法时递进关系执行的,我们建议这几个方法使用throws的方式进行处理,而执行的方法A可以考虑使用try--catch--finally进行处理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值