栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

基础回顾6

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基础回顾6

1、抽象类和接口

抽象类是用来捕捉子类的通用特性的。接口是抽象方法的集合。
从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
相同点:

  1. 接口和抽象类都不能实例化;
  2. 都位于继承的顶端,用于被其他实现或继承;
  3. 都包含抽象方法,其子类都必须覆写这些抽象方法
参数抽象类接口
声明抽象类使用abstract关键字声明接口使用interface关键字声明
实现子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现子类使用implements关键字来实现接口。它需要提供接口中所有声明的方法的实现
构造器抽象类可以有构造器接口不能有构造器
访问修饰符抽象类中的方法可以是任意访问修饰符接口方法默认修饰符是public。并且不允许定义为 private 或者protected
多继承一个类最多只能继承一个抽象类一个类可以实现多个接口
字段声明抽象类的字段声明可以是任意的接口的字段默认都是 static 和 final的

我们可以为接口提供默认实现的方法,并且不用强制子类来实现它。 接口和抽象类各有优缺点,在接口和抽象类的选择上,必须遵守以下原则:

  1. 行为模型应该总是通过接口而不是抽象类定义,所以通常是优先选用接口,尽量少用抽象类;
  2. 选择抽象类的时候通常是如下情况:需要定义子类的行为,又要为子类提供通用的功能。
2、抽象类和普通类
  1. 普通类不能包含抽象方法,抽象类可以包含抽象方法;
  2. 抽象类不能直接实例化,普通类可以直接实例化
3、静态变量和实例变量区别
  1. 静态变量: 静态变量不属于任何实例对象,属于类,所以在内存中只会有一份,在类的加载过程中,JVM只为静态变量分配一次内存空间;
  2. 实例变量: 每次创建对象都会为每个对象分配成员变量内存空间,实例变量是属于实例对象的,在内存中,创建几次对象,就有几份成员变量。
4、静态变量与普通变量区别
  1. 静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化;
  2. 非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不响。
5、静态方法和成员方法区别
  1. 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使 用"对象名.方法名"的方式。而成员方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象;
  2. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量 和静态方法),而不允许访问成员变量和成员方法;成员方法则无此限制。
6、静态方法内不能调用一个非静态成员

因为静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。

7、内部类

将一个类的定义放在另外一个类的定义内部,这就是内部类。内部类本质就是类的一个属性,与其他属性定义方式一致。
分为:

  1. 静态内部类:定义在类内部的静态类。静态内部类可以访问外部类所有的静态变量,而不可访问外部类的非静态变量;
  2. 成员内部类:定义在类内部,成员位置上的非静态类。成员内部类可以访问外部类所有的变量和方法,包括静态和非静态,私有和公有。成员内部类依赖于外部类的实例;
  3. 局部内部类:定义在方法中的内部类。定义在实例方法中的局部类可以访问外部类的所有变量和方法,定义在静态方法 中的局部类只能访问外部类的静态变量和方法;
  4. 匿名内部类:匿名内部类就是没有名字的内部类,日常开发中使用的比较多。具有以下特点
    1. 匿名内部类必须继承一个抽象类或者实现一个接口;
    2. 匿名内部类不能定义任何静态成员和静态方法;
    3. 当所在的方法的形参需要被匿名内部类使用时,必须声明为final;
    4. 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
8、内部类的优点
  1. 一个内部类对象可以访问创建它的外部类对象的内容,包括私有数据;
  2. 内部类不为同一包的其他类所见,具有很好的封装性;
  3. 内部类有效实现了“多重继承”,优化 java 单继承的缺陷;
  4. 匿名内部类可以很方便的定义回调。

常见应用场景:

  1. 一些多算法场合;
  2. 解决一些非面向对象的语句块;
  3. 适当使用内部类,使得代码更加灵活和富有扩展性;
  4. 当某个类除了它的外部类,不再被其他的类使用时。
9、字符串常量池

字符串常量池位于堆内存中,专门用来存储字符串常量。可以提高内存的使用率,避免开辟多块空间存储相同的字符串,在创建字符串时 JVM 会首先检查字符串常量池,如果该字符串已经存在池中,则返回它的引用,如果不存在,则实例化一个字符串放到池中,并返回其引用。

10、String类常用方法
  1. indexOf():返回指定字符的索引;
  2. charAt():返回指定索引处的字符;
  3. replace():字符串替换;
  4. trim():去除字符串两端空白;
  5. split():分割字符串,返回一个分割后的字符串数组;
  6. getBytes():返回字符串的 byte 类型数组;
  7. length():返回字符串长度;
  8. toLowerCase():将字符串转成小写字母;
  9. toUpperCase():将字符串转成大写字符;
  10. substring():截取字符串;
  11. equals():字符串比较
11、集合和数组的区别
  1. 数组是固定长度的,集合可变长度的;
  2. 数组可以存储基本数据类型,也可以存储引用数据类型,集合只能存储引用数据类型;
  3. 数组存储的元素必须是同一个数据类型,集合存储的对象可以是不同数据类型。
12、遍历一个 List 有哪些不同的方式
  1. for 循环遍历;
  2. 迭代器遍历,terator 是面向对象的一个设计模式,目的是屏 蔽不同数据集合的特点,统一遍历集合的接口;
  3. foreach 循环遍历,foreach 内部也是采用了 Iterator 的方式实现,使 用时不需要显式声明Iterator 或计数器。优点是代码简洁,不易出错;缺 点是只能做简单的遍历,不能在遍历过程中操作数据集合。
13、IO流的概念

Java的IO流是实现输入/输出的基础,它可以方便地实现数据的输入/输出操作,在Java中把不同的输入/输出源抽象表述为"流"。

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

流分为输入和输出流,输入时是流从数据源流向程序。输出时是流从程序传向数据源,而数据源可以是内存,文件,网络或程序等。

14、IO流的分类

根据流的流向以及操作的数据单元不同,将流分为了四种类型,每种类型对应一种抽象基类。这四种抽象基类分别为InputStream、Reader、OutputStream、Writer。四种基类下,对应不同的实现类,具有不同的特性。在这些实现类中,又可以分为节点流和处理流。
InputStream 和OutputStream,两个是为字节流设计的,主要用来处理字节或二进制对象;
Reader和 Writer两个是为字符流(一个字符占两个字节)设计的,主要用来处理字符或字符串。

  1. InputStream 是所有的输入字节流的父类,它是一个抽象类,主要包含三个方法:
//读取一个字节并以整数的形式返回(0~255),如果返回-1已到输入流的末尾。
int read() ;
//读取一系列字节并存储到一个数组buffer,返回实际读取的字节数,如果读取前已到输入流的末尾返回-1。
int read(byte[] buffer) ;
//读取length个字节并存储到一个字节数组buffer,从off位置开始存,最多len, 返回实际读取的字节数,如果读取前以到输入流的末尾返回-1。
int read(byte[] buffer, int off, int len) ;
  1. Reader是所有的输入字符流的父类,它是一个抽象类,主要包含三个方法:
//读取一个字符并以整数的形式返回(0~255),如果返回-1已到输入流的末尾。
int read() ;
//读取一系列字符并存储到一个数组buffer,返回实际读取的字符数,如果读取前已到输入流的末尾返回-1。
int read(char[] cbuf) ;
//读取length个字符,并存储到一个数组buffer,从off位置开始存,最多读取len,返回实际读取的字符数,如果读取前以到输入流的末尾返回-1。
int read(char[] cbuf, int off, int len)
  1. OutputStream 是所有的输出字节流的父类,它是一个抽象类,主要包含如下四个方法:
//向输出流中写入一个字节数据,该字节数据为参数b的低8位。
void write(int b) ;
//将一个字节类型的数组中的数据写入输出流。
void write(byte[] b);
//将一个字节类型的数组中的从指定位置(off)开始的,len个字节写入到输出流。
void write(byte[] b, int off, int len);
//将输出流中缓冲的数据全部写出到目的地。
void flush();
  1. Writer 是所有的输出字符流的父类,它是一个抽象类,主要包含如下六个方法:
//向输出流中写入一个字符数据,该字节数据为参数b的低16位。
void write(int c);
//将一个字符类型的数组中的数据写入输出流,
void write(char[] cbuf)
//将一个字符类型的数组中的从指定位置(offset)开始的,length个字符写入到输出流。
void write(char[] cbuf, int offset, int length);
//将一个字符串中的字符写入到输出流。
void write(String string);
//将一个字符串从offset开始的length个字符写入到输出流。
void write(String string, int offset, int length);
//将输出流中缓冲的数据全部写出到目的地。
void flush()

Writer比OutputStream多出两个方法,主要是支持写入字符和字符串类型的数据。
Java的IO流执行输出时,不要忘记关闭输出流,关闭输出流除了可以保证流的物理资源被回收之外,还能将输出流缓冲区的数flush到物理节点里,因为在执行close()方法之前,自动执行输出流的flush()方法。

补充:

  1. 字节流在操作时不会用到缓冲区(内存),是直接对文件本身进行操作的。而字符流在操作时使用了缓冲区,通过缓冲区再操作文件;
  2. 在硬盘上的所有文件都是以字节形式存在的(图片,声音,视频),而字符值在内存中才会形成;
  3. 真正存储和传输数据时都是以字节为单位的,字符只是存在与内存当中的,所以,字节流适用范围更为宽广
15、面向对象和面向过程的区别

面向过程
优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;
缺点:没有面向对象易维护、易复用、易扩展。

面向对象
优点: 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护;
缺点:性能比面向过程低。

16、重载和重写的区别

重载: 发生在同一个类中,方法名必须相同,参数类型、个数、顺序都不同,方法返回值和访问修饰符可以不同,发生在编译时。
重写: 发生在继承关系中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。

17、JAVA 复制

将一个对象的引用复制给另外一个对象,一共有三种方式:

  1. 直接赋值复制;
  2. 浅复制(复制引用但不复制引用的对象);
  3. 深复制(不仅复制对象本身,而且复制对象包含的引用指向的所有对象)。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1006555.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号