java中的各种类型的类

本文介绍了Java编程中的关键概念,如JavaBean、工具类、继承与多态、抽象类、接口、异常处理(包括异常体系结构、处理方式和自定义异常)、集合操作(如List和Set区别、并发修改异常)以及Lambda表达式和泛型。
摘要由CSDN通过智能技术生成

目录

1,  javaBean

2,工具类。

3,父类和子类(继承)

4,抽象类

5,接口(要掌握)

6,代码块

7,内部类 

   匿名内部类(要掌握):

     Lambda表达式       

8,异常

        java中默认异常的处理流程(总结:向上抛出):

        java中异常的两种处理方式

        throw和throws的区别

        自定义异常类:

        异常常用的两个方法

9,集合相关


类中的静态只能调用静态

1,  javaBean

        javaBean,主要目的是用来存储数据。private 属性,通过get,set来获取设置属性。 与之对应的是javaDeanDao,是javaBean的操作类

2,工具类。

         主要目的是给别的类提供服务的,一般是private构造器,并且方法都是static的,使用时直接类名.方法名,所以不需要构造器。 工具人,比如DaoUnits这种Dao的工具类;

3,父类和子类(继承)

        使用目的减少代码量,比如学生有name,age属性,老师也有name,age属性,那么可以抽离出人类有name,age属性,让学生,老师extends人类。 有个前提条件就是逻辑上必须是is a 的关系,所以不能是老师类继承学生类,因为老师不是学生。

        注意点:private 私有变量属性能被继承但是不能直接访问。比如javaBean的情况下,虽然私有变量不能直接被访问,但是有对应的set,get方法是public方法,所以可以通过调用子类的get,set方法来达到操作父类private属性的效果。 另外,只支持单继承不支持多继承,但是可以多层继承;

        子类重写父类方法时,不能抛出比父类方法异常大的或者父类方法没有异常;如果遇到子类重写父类需要抛异常的情况,通常会使用try..catch处理掉。 或者(不推荐)在父类方法中也加上同样的异常

4,抽象类

        是一种特殊的父类。允许提供抽象方法,并且抽象方法只能存在于抽象类中,抽象方法写法 public abstract void eat(); eat()后面没有{}。 关键字为abstract。 抽象类的注意事项: 不允许建立实例,继承他的子类必须重写抽象方法。因为如果抽象类能实例,那么就可以通过实例使用抽象方法,抽象方法没有任何意义。 子类如果不重写,那么子类也继承了抽象方法,所以子类也必须是抽象类。 abstract关键字和final,static,private 有关键字冲突。 要避免。

5,接口(要掌握)

        用来定义一种规则。创建方法 public interface 接口名{} ,接口中的所有方法都是abstract抽象方法。  实现接口关键字implements,接口的实现类必须重写接口中的所有方法。接口的特点 : 接口中没有构造方法,接口的实现类可以同时继承extends其他类。接口的所有成员变量只能是public static final 的,系统会自动加上。 接口的所有的成员方法都是抽象方法,系统会自动加上public abstract。

        类和类的关系:继承关系,只能单继承,但可以多层继承

        类和接口的关系:可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口;

        接口和接口的关系:继承关系,可以单继承,也可以多继承

抽象类和接口的区别:

        抽象类:对事物做抽象(描述事物)

        接口:对行为抽象(制定规则,是我们的代码更加规范)

在JDK8中,接口可以实现非抽象方法。在接口中定义默认方法使用default关键字, 语法为public default void show(){}; 。是为了解决升级接口的问题。 理由:当你产品上线之后,你需要添加一些功能,需要对接口添加新的方法,如果都是抽象方法的话,那么你接口的实现类都会报错。所以这时候就采用jDk8之后的新特性。补充一个细节,如果想在子类中使用接口中的默认方法的话,语法为 Inter.super.method(); 因为接口类似于干爹,如果你直接super.method();那么就是找父类,如果要找接口,就需要  接口名.super.method()。如果实现了多个接口,多个接口中存在相同的默认方法,实现类必须重写默认方法。不过你可以在重写中使用 Inter.super.method();来调用想用的接口的方法。

在JDK8中,还允许定义静态方法,只不过只能接口名调用,不能使用实现类调用

在JDK9中,接口允许定义私有方法,把一些重复的逻辑不希望别人调用,可以整合为私有方法来通过接口中的默认方法调用。 写法为 private void method(){}; 和其他的一样

6,代码块

        使用{}括起来的代码被称为代码块。分为(局部代码块,构造代码块,静态代码块) 

        局部代码块:方法中定义,用于限定变量的生命周期,及早释放,提高内存效率。

        构造代码块:类中方法外定义,特点,每次构造方法执行时,都会执行,并且会在构造方法执行前执行,用来抽取构造方法中的相同代码,提高代码复用性,一般用的不多;

        静态代码块:类中方法外定义,被static关键字声明。只在类加载时执行,只执行一次。作为为一些数据初始化工作,一般用于一些需要初始化的变量初始化过程比较复杂,一般这种情况就用静态代码块来完成。

7,内部类 

         类中创建一个类,除了匿名内部类,其他的静态内部类,局部内部类基本不用。创建内部类对象的格式:

        外部类名.内部类名 对象名 = new 外部类对象().new 内部类对象();

        细节补充:内部类访问外部类成员变量直接访问,外部访问内部 需要创建内部类对象再访问。内部类和想要调用外部类中重名的成员变量的方法,内部类使用内部类的成员变量直接使用this.方法名就可,内部类中想调用外部类中重名的变量需要 外部类名.this.变量名;

   匿名内部类(要掌握):

        概述:匿名内部类本质上是一个特殊的局部内部类(定义在方法内部)

        前提:需要存在一个接口或类

        格式:new 类名 / 接口(){}      当new 类名(){} 时,匿名内部类继承该类,当new 接口(){} 时,内部类实现该接口;

        使用场景:当我们需要使用一个方法,这个方法要的参数为一个接口类型的情况下,如果这个接口只有一个或两个少数的抽象方法时,那么再重新创建一个实现类比较麻烦,我们可以使用匿名内部类来达到传参的操作。当然如果抽象方法比较多,还是老老实实的创建实现类吧.

     Lambda表达式       

        Lambda表达式简化内部类的代码写法,时JDK8之后的新语法格式;格式为 () -> {} ,() : 为匿名内部类被重写方法的形参列表,{}中时语法形式。 有个前提是只能简化函数式接口的匿名内部类。  函数式接口:首先必须是接口,其次接口中有且仅有一个抽象方法的形式,通常会再接口上加一个@FunctionalInterface注解,标记和校验是否是函数式接口。Lambda也可以省略缩写,格式就不写了,最简单的方法是在IDEA中,先写一个匿名内部类,然后选择方法名,按住alt+回车,点击reqlace with Lambda就可以自动整理为Lambda表达式格式

8,异常

        概念:异常时代码在编译或运行的过程中可能出现的错误;异常也都是类,可以在API中查到

        异常的体系结构 :全都继承Throwable类

                分为两种:Exception:异常类,程序常见错误,比如空指针,越界等

                                  Erroy:严重级别的问题,通常跟系统有关,比如栈内存溢出(StackOverflowError),堆内存益处(OutOfMemoryError)

        Exception异常也分为两种:继承RuntimeException的运行时异常和没继承RuntimeException的编译时异常;一个是编辑阶段可能不报错,运行时可能出错,另一个是编译时就会报错,需要有解决方法才行;

        java中默认异常的处理流程(总结:向上抛出):
  1. 虚拟机会在出现异常的代码那里自动创建一个异常对象:比如new ArithmeticException;
  2. 异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机
  3. 虚拟机接收到异常对象后,现在控制台直接输出异常信息数据
  4. 终止java程序运行
  5. 后续代码没有机会执行,因为已经被终止了
        java中异常的两种处理方式
  • try....catch 捕获异常:出现问题,程序可以继续执行
  • throws 抛出异常:出现问题,程序会在错误点停止,不会继续执行

        两种处理方式选择思路:看这个问题是否需要暴露出来,需要:抛出,不需要:try..catch

        throw和throws的区别
  • throw:用在方法中,后面跟的是异常对象,其作用是抛出异常,比如 throw new Exception("您输入的数据有误")
  • throws:用在方法名后面,起到声明作用,声明此方法中存在异常,调用者需要进行处理

              细节:抛出的异常对象如果是编译时异常,必须使用throws进行声明,如果抛的是运行时异常,就不要写throws了。(运行时异常例子 throw new RunTimeException("您输入的数据有误");)

        自定义异常类:

当我们需要用异常来管理某个业务时,java并没有提供想要的异常的话,就可以通过自定义异常来做。方法: 创建一个类,继承Exception或者RunTimeException。一般命名为异常描述加Exception结尾比如StudentAgeException,这是个学生年龄相关的异常; 继承完之后,就重写一下父类的构造方法就完成了。

        异常常用的两个方法
  • public String getMessage() 获取异常的错误信息;
  • public void printStackTrace() 展示完整的异常错误信息;
     

        细节注意点:

        子类重写父类方法时,不能抛出比父类方法异常大的或者父类方法没有异常;如果遇到子类重写父类需要抛异常的情况,通常会使用try..catch处理掉。 或者(不推荐)在父类方法中也加上同样的异常

9,集合相关

       集合整体的体系结构分为两种,一种是Collection 单列集合,一种是Map 双列集合

        单列集合Collection中有两个派系,一个List 有序集合,一个Set 无须集合。

集合的通用遍历方法

  • 普通迭代器 调用集合的 .iterator()方法获取迭代器,调用迭代器的.hasnext()方法判断是否还有下一个值,有的话调用.next()方法获取值即可
  • 增强for循环 // 本质也是迭代器实现的
  • forEach方法 //也是迭代器

        List可以存重复值,有索引,有序, Set 无序,无索引,不能存重复的

        List有ArrayList,LinkedList类(LinkedList了解一下就好他是链式数据结构,一般都用array list类)

        ConcurrentModificationException 并发修改异常;

出现原因:对于List集合,使用迭代器遍历的话,通过list.iterator()获取的迭代器,在遍历集合的过程中,调用了集合对象的添加,删除方法就会出现此异常;此异常的目的是为了防止数据错乱,所以不让使用集合随便更改里面的数据;解决方法:删除使用迭代器自带的 迭代器实例.remove() 方法即可,添加则可以再最初获取迭代器时,通过使用List自己的List中list.listIterator()方法获取的ListIterator<>迭代器进行遍历,然后调用迭代器的add()方法即可。

  public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("老六");
        //当要在迭代器遍历中使用集合的增删操作时,List的情况可以使用list提供的迭代器来操作
       // Iterator<String> iterator = list.iterator();// 普通的迭代器只能删除,不能增加
        ListIterator<String> it = list.listIterator();
        //手写的迭代器遍历
       while (it.hasNext()){
           //通过调用it.next()来获取当前的值
           String next = it.next();
           //判断是否为李四,是的话,在李四后面插入haha
           if ("李四".equals(next)){
               //插入haha
               it.add("haha");
           }
       }
       //打印list : [张三, 李四, haha, 王五, 老六]
        System.out.println(list);
    }

        ArrayList的扩容机制,源码解析

  1. 使用空参构造器创建的集合,在底层创建一个默认长度为0的数组
  2. 添加第一个元素时,底层会创建一个新的长度为10的数组
  3. 存满时,会扩容1.5倍,计算方法旧的长度/2+旧的长度

10,泛型介绍

        概念:JDK5引入的,可以在编译阶段约束操作的数据类型,并进行检查

        好处:统一数据类型,将运行期的错误提升到了编译期间

        注意事项:泛型中只能编写引用数据类型,基本数据类型需要装箱处理;

        泛型常用的标识符:E , V , K , T

  • E:Element
  • T:Type
  • K:Key
  • V:Value  

泛型类

泛型方法

泛型接口,

泛型通配符

泛型总结

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值