Java进阶

本文详细探讨了Java的高级特性,包括抽象类、接口、Object类的方法、内部类、数组、字符串、异常处理、集合框架、多线程以及IO流等。通过对比抽象类和接口的区别,展示了它们在开发中的作用。同时,介绍了类与类之间的关系以及如何使用多态。此外,还深入讲解了线程安全问题和同步机制,如synchronized关键字的使用。文章最后提到了反射机制和类加载器的工作原理。
摘要由CSDN通过智能技术生成

1 抽象类

类和类之间有共有特征,将这些具有共同特征的类再进一步抽象形成了抽象类。抽象类无法创建对象
抽象类也属于引用数据类型
抽象类定义:

[修饰符列表] abstract class 类名
{
   
}

final无法与abstract同时使用

抽象类 的子类也可以是抽象类
抽象类虽然无法实例化,但是抽象类有构造方法,这个 构造方法供子类使用
抽象方法表示没有实现的方法,没有方法体的方法

  • 抽象方法的特点:
  • 没有方法体,以分号结尾
  • 前面的修饰符列表中有abstract关键字

抽象方法一定出现在抽象类中,抽象类中不一定有抽象方法

2 接口

2.1 接口的基本语法

接口也是一种引用数据类型。编译之后生成class字节码文件
接口是完全抽象的(抽象类是半抽象的)

//接口定义
[修饰符列表] interface 接口名{
   }

接口中只包含两部分内容,一是常量,二是抽象方法,接口中没有其他内容
一个接口可以继承多个接口(支持多继承)

interface A{
   }
interface B{
   }
interface C exyends A,B{
   
int sum(int a,int b);
}

接口中所有元素都是public修饰
定义时 方法的public abstract 可以省略
常量的public static final 也可以省略
接口中的抽象方法都是抽象方法,不能有方法体
接口是特殊的抽象类,完全抽象
类和类之间是继承,类和接口之间是实现
可以将实现看作继承,使用extends关键字完成
实现使用implements关键字实现

当一个非抽象类实现接口的话,必须将接口中所有的抽象方法全部实现(覆盖、重写)

面向接口编程

一个类可以实现多个接口

接口与接口之间的强制转换不需要继承关系,可以强制转换,但是运行时可能出现ClassCastException异常
向下转型前加上instanceof判断,可避免此类异常

extends和implements可以同时使用,继承在前,实现在后
使用接口写代码时候,可以使用多态(父类型引用指向子类型对象)

2.2 接口在开发中的作用

接口的作用类似于多态在开发中的作用

面向接口编程,可以降低程序的耦合度,提高程序的扩展力,符合OCP开发原则
接口的使用离不开多态机制

2.3 类与类之间的关系

继承关系
关联关系:通常以“属性”的形式存在
实现关系:类实现接口

2.4 抽象类和接口的区别

抽象类是半抽象的
接口是完全抽象的

抽象类中有构造方法
接口中没有构造方法

接口和接口之间支持多继承
类和类之间只能单继承

一个类可以同时实现多个接口
一个抽象类只能继承一个类

接口中只允许出现常量和抽象方法

3 Object

任何一个类默认继承object类

API 应用程序编程接口

3.1 toString方法

Object类默认的toString方法返回引用的地址,引用.toString
每次使用时重写

3.2 equals方法

判断两个基本数据类型相等,直接使用==
引用数据类型不能使用“ == ” 判断,引用数据类型保存的是内存地址,不能直接判断
equals方法使用的是“ == ”方法,判断使用的是引用的内存地址,使用时需要重写

3.3 finalize方法

finalize在java对象即将被垃圾回收器回收的时候,垃圾回收器负责调用finalize()方法
如果希望在对象销毁时执行一段代码时,这段代码要写写到finalize()方法里面

3.4 hashCode方法

获取对象哈希值

4 内部类

内部类是在类的内部定义了一个新类,称为内部类
内部类分类:

  • 静态内部类:类似于静态变量
  • 实例内部类:类似于实例变量
  • 局部内部类:类似于局部变量

使用内部类编写的代码可读性差,能不用尽量不用

4.1 匿名内部类

匿名内部类是局部内部类的一种

5 数组

Java中数组是引用数据类型,不属于基本数据类型
数组对象都有length属性(java自带),用来获取 数组中元素的个数
优点:查询效率最高的的数据结构
缺点:数组中每个元素的内存地址连续,所以在增加或是删除数据元素时效率较低;数组不能存储大数据量,
因为很难在内存空间上找到一块特别大的内存空间

5.1 一维数组

int[] array1;
double []array2;
String [] array2;
// 静态初始化
int [] array={
   1,2,3,4,5};
//动态初始化
int [] =new int [5];

5.1.1 main函数参数

String[] 静态初始化数组,长度为0

5.1.2 数组扩容

先新建一个大容量的数组,然后将小容量数组中的数据一个一个拷贝到大数组中
数组扩容效率较低,创建对象时,先准确预估数组大小,尽量减少拷贝次数
System.arraycopy(源数组,起点,目标数组,起点,长度);

5.2 二维数组

int[][] a={
   {
   1,2,3},{
   4,5,6}};

5.3 Array工具类

二分法查找是建立在排序的基础上的,没有排序无法查找
java.util.arrays

6 String类

java.lang.String
java规定,双引号括起来的字符串是不可变的,都是直接存储在“方法区”的“字符串常量池”中

String s="123456";
s.charAt(1);//访问字符串特定位置的元素
String s1 =String.valueof(1234);//将其他数据类型转换为字符串

int a=s1.compareTo(s2);//比较s1和s2的大小,结果为0,两字符串相等,逐个比较每个字符,直到出现不一样的字符

//StringBuffer  拼接字符串 线程安全
//StringBuffer底层是byte[]  
 SStringBuffer stringBuffer=new StringBuffer();
 stringBuffer.append("a");
 stringBuffer.append("b");
//StringBuilder 非线程安全

6.1 日期

//Date转String
  Date date=new Date();
  System.out.println(date); //输出系统当前时间
  //转换时间输出格式 y代表年 M-月 d-日 H-小时 m-分 s-秒 S-毫秒
  SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS"); 
  String s=sdf.format(date);
  System.out.println(s);
 
//String转DAte
 String time="2020-08-20 13:36:44 365";
 SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
 Date t=sd.parse(time);
 System.out.println(t);

7 异常

程序过程中发生了不正常的情况,这种不正常的情况就是异常
异常处理机制在程序出现异常时吧异常信息打印输出到控制台,供程序员参考,帮助程序员对程序进行修改

Java中异常以异常类和对象的形式存在
Object 下有Throwable(可抛出的)
Throwable有两个分支:Error(不可处理,直接退出JVM)和Exception(可处理的)
Exception下游两个分支:
Exception的直接子类:编译时异常
RuntimeException:运行时异常

7.1编译时异常和运行时异常的区别

两种异常都是发生在运行阶段。因为异常的发生就是new异常对象
编译时异常发生概率较高,程序员在编译时就可以预处理的异常,如果不处理,就会发生编译时异常
运行时异常发生概率较低

7.2 异常处理

1.方法声明位置使用throws关键字

class ExcetionTest
{
   
  public void dosome throws ClassNotFoundException
  {
   
  System.out.println("aaaaaaa");
  }
  
}
//处理方法
public class test01 {
   
    public static void main(String[] args)throws ClassNotFoundException {
   
        ExcetionTest t=new ExcetionTest();
        t.dosome();
    }
}

2.使用try.catch语句进行异常的捕捉

class Trytest
{
   
    void dosome() throws ClassNotFoundException {
   
        System.out.println("aaaaaaaaaaaaa");
    }
}
public class test01 {
   
    public static void main(String[] args) {
   
        try{
   
            Trytest t=new Trytest();
            t.dosome();
        }catch (ClassNotFoundException e){
   
            e.printStackTrace();
        }
    }
}

3.throws是上抛异常,将异常抛给上一级,并没有解决异常
catchs是捕捉异常,

如果希望调用者处理异常,使用throws,其他情况使用catch捕捉异常

7.3 异常的常用信息

获取异常的简单的描述信息
String msg=exception.getMessage();
打印异常追踪的堆栈信息:
exception.printStackTrace();

8 集合

集合是一个容器,可以容纳其他类型的数据,可以容纳多个对象
集合不能直接存储基本数据类型,也不能直接存储java对象
集合中存储的都是java对象的内存地址
在java中每一个不同的集合,底层会对应不同的数据结构
new ArrayList ();底层是数组
new LinkedList();底层是链表
new TreeSet();底层是二叉树

Java中集合分为两大类:

  • 一是单个方式存储元素,这一类集合中的超级父接口:java.util.Collection;
  • 二是以键值对的方式存储元素,这一类集合中超级父接口:Java.util.Map

List集合存储元素特点:有序可重复,存储的元素有下标
Set集合存储元素特点:无序不可重复,没有下标

8.1 List

List集合存储元素特点:有序可重复,存储的元素有下标
ArrayList:数组,非线程安全的
LinkedList:双向链表
Vector:数组,线程安全的,Vector方法都有synchronized关键字修饰,线程安全,但是保证线程安全有别的方案,Vector使用较少

8.2 Set

HashSet:底层是HashMap结构,非线程安全
TreeSet底层是TreeMap

8.2.1 HashSet

无序不可重复

8.2.2 TreeSet

无序不可重复,但是存储的元素可以自动按照大小顺序排序,但是会从小到大自动排序
无序指的是存进的顺序和取出的顺序不同,没有下标

8.3 Map

8.3.1 HashMap

Map和Collection没有继承关系
以键值对的方式存储,key和value,存储的都是对象的内存地址,
所有Map集合的key特点:无序不可重复
HashMap底层是哈希表数据结构,是非线程安全
Hashtable底层是哈希表数据结构,线程安全,所有方法都带有synchronized关键字,效率较低,
TreeMap底层是二叉树,实现了SortMap接口,是无序不可重复的,集合key部分的元素会自动排序,称为可排序集合
Map集合的key就是一个Set集合,
放在HashMap集合key部分的,以及放在HashSet集合的元素,需要同时重写hashcode和equals方法

HashMap集合的默认初始化容量是16,默认加载因子是0.75

8.3.2 Hashtable

Hashtable集合的初始化容量是11,扩容是:原容量*2+1

8.3.3 Properties类

Properties是一个Map集合,继承Hashtable,Properties的key和value都是String类型
properties被称为属性类对象

8.4 foreach

foreach循环没有下标

int num[]={
   1,2,3,4};
foreach(int x:num)
{
   
   System.out.println(x);
}

ArrayList<Integer> nums=new ArrayList<>();
   for(int i=0;</
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值