Java求职学习第一弹 Java基础

异常、反射、注解、内部类、泛型、序列化、复制详解

一、异常

概念:某个方法不能按照正常途径完成任务,就会抛出一个封装错误信息的对象。此时,这个方法马上退出并不返回任何值。同时,这个方法内的其它代码也无法执行。异常处理机制将代码交给异常处理器。

分类

Throwable是Java中所有错误或异常的超类,下一层为Exception和Error

Error:java运行时系统的内部错误和资源耗尽错误,又称内存异常,无法抛出该类对象,只能尽力使程序安全终止

Exception分为RuntimeException和CheckedException

RuntimeException:java虚拟机正常运行期间抛出的异常的超类,一定是程序员的错误,运行时报错

CheckedException:外部错误,发生在编译期间,编译器强制程序捕获,要求把异常程序try catch,最顶级JVM

异常处理方式

1.try-catch-finally

2.遇到问题抛给调用者(throw,throws)

抛出异常的形式:throw,throws,系统自动抛出异常

默认为throws处理方式

throw和throws的区别

1.throws用在函数上,后跟异常类,可以跟多个;throw 用在函数内,后面跟异常对象

2.throws用来声明异常,让调用者只知道该功能可能出现问题;throw抛出异常具体的问题对象,执行到throw,功能就结束了

3.throws表示出现异常的一种可能性,不一定发生;throw抛出了异常,执行后一定抛出异常对象

4.两者都是消极处理,只是抛出或者可能抛出,真正处理由函数上层调用处理

案例

//如果用户输入的不是一个整数,就提示他反复输入,直到输入一个整数为止
        Scanner scanner=new Scanner(System.in);
        int num=0;
        String inputStr="";
        while (true){
            try {
                System.out.println("请输入一个整数:");
                inputStr= scanner.next();
                num=Integer.parseInt(inputStr);
                break;
            } catch (NumberFormatException e) {
                System.out.println("你输入的不是一个整数");
            }
        }
        System.out.println("输入的整数为:"+num);

二、反射

概念

反射机制:运行状态中,对于任意一个类都能够知道这个类的所有的属性和方法;对于任意一个对象,都能调用它的任意一个方法

从反射角度说,Java属于半动态语言。

动态语言:程序在运行时可以改变其结构。

需求

通过外部文件配置,在不修改源码情况下,来控制程序,符合设计模式的opc原则

应用场景

Java程序中许多对象都出现两种类型。

Person p=new Student();

编译类型为Person,运行时类型为Studen                                                                                          编译时类型无法获取具体方法。程序在运行时还可能收到外部传入的对象,该对象编译时类型为Object,但程序有需要调用该对象的运行时类型的方法。为了解决这个问题,程序需要在运行时发现对象和类的真实信息。若编译时无法预知该对象和方法属于哪些类,程序只能依靠运行时信息发现该对象和类的真实信息,这时必须使用反射。

反射使用步骤 

1.获取Class对象(反射的核心)
使用Class类中forName()静态方法(最安全/性能最好)

2.调用对象方法(反射的使用阶段)

//获取Person类的Class对象
Class clazz=Class.forName("reflection.Person");

//获取Person类的所有方法信息
Method[] method =clazz.getDeclaredMethods();
for(Method m:method){
    输出(m.toString());
}

//获取Person类的所有成员属性信息
Field[] field=clazz.getDeclaredFields();
for(Field f:field){
    输出(f.toString());
}

//获取Person类所有构造方法信息
Constructor[] constructor=clazz.getDeclaredConstructors();
for(Constructor c:constructor){
    输出(c.toString());
}

创建对象的方法

1.Class对象的newInstance()

2.调用Constructor对象的newInstance()方法

先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法创建Class对象对应类的实例,通过这种方法可以选定方法创建实例

  Class clazz=Class.forName("reflection.Person");
        //使用newInstance方法创建对象
        Person p=(Person) clazz.newInstance();

        //使用构造器方法创建对象  
Constructor c =clazz.getDeclaredConstructors(String.class,String.class,int.class);

                                                                                                                                                  

  • 30
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值