Q1面向对象

类、对象特征?

类:对事物逻辑算法或概念的抽象,描述一类对象的行为和状态。

OOP三大特征,封装,继承,多态

封装:隐藏属性实现细节,只公开接口。将抽象的数据和行为结合,形成类。目的是简化编程,提高安全性。

继承:关键字extends, is-a关系,子类拥有父类的属性和方法,子类可重写override父类同名方法, 实现子类特性,单继承。构造方法,静态方法,没有访问权限不能继承。

优点:抽取共同为基类,提高复用率。缺点:增加了耦合性,改变父类影响子类。

Java多态的理解?实现的必要条件?实现方式?

多态:对同一个消息根据发送对象不同产生不同的行为。

三个条件:继承,重写,向上转型(父类引用指向子类对象)

实现方式:编译时多态:重载overload(同一个类):通过参数列表不同区分不同方法

运行时多态:1.子类继承父类进行方法重写 2. 通过实现接口并覆盖接口同一方法(面向接口编程)

优点:降低耦合,可替换,可扩展

什么是内部类?为什么要使用内部类?成员内部类,静态内部类,局部内部类和匿名内部类的理解和作用,以及应用场景?

内部类:将一个类的定义放在另一个类的定义内部。

为什么要用:能独立继承接口实现,解决多重继承问题,实现回调(适用于事件驱动架构)

特性:创建内部类不依赖外部类的创建;成员内部类可以无条件访问外部类的所有属性和方法  (一个外部类this指针);

除了外部类,其他类不能直接访问内部类;

内部类可以private修饰,修饰后外部类之外不可见。

成员内部类:只能通过外部类对象创建内部类对象:   Outer.Inner inner = new Outer().new Inner();

其他类不能直接使用该内部类,不能有static变量和方法

经典场景: 排序比较器 new Comparator<Person>(){ … }

局部内部类:创建一个类辅助解决方案,但不希望公开,仅仅为外部类某个方法中使用。

不能有public、protected、private及static修饰符。

局部内部类只能访问方法中声明的final类型的变量。

场景很少。。

匿名内部类:没有构造器的类。匿名内部类是直接使用new来生成一个对象的引用。

场景:大部分匿名内部类用于接口回调。

特性:没有访问修饰符;当所在方法的形参需要被匿名内部类使用,那么这个形参就必须为final;

场景:用于集成其他类或者实现接口,并不需要增加额外的方法,只是对集成方法的实现或是重写。

静态内部类:使用Static修饰的内部类,也叫嵌套内部类。

可以直接创建实例不需要依赖外部类,只能访问外部类静态成员变量和方法

静态内部类使用的形参为何要为final?

拷贝引用,为了避免引用值发生改变,例如被外部类的方法修改等,而导致内部类得到的值不一致,于是用final来让该引用不可改变。

如果定义了一个匿名内部类,并且希望它使用一个其外部定义的参数,那么编译器会要求该参数引用是final的。

闭包和内部类的区别?

闭包的概念产生于函数式编程中,在函数式编程中,函数是第一等公民,这也就意味着,你可以将函数当做参数或是返回结果。

闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)

闭包从底层理解,就是函数本身和其所需外部变量的引用,创建过程是capture by reference。

Java不能显示的支持闭包,通过“接口+内部类”来实现。

Java在实现匿名内部类对外部局部变量访问时,是对局部变量创建值拷贝,然后供匿名内部类来使用。不像Go编译器将局部变量提升到堆中,然后传递引用。

Java中匿名内部类是一个不完整的闭包,是capture by value, 而不是 capture by reference。

重载Overload和重写Override的区别?

重载overload(同一个类):通过参数列表不同区分不同方法

重写(override)(子类继承父类):子类中对父类同名方法进行重新定义

静态属性和静态方法是否可以被继承,重写?为什么?

java 静态方法,静态属性属于静态绑定,声明为父类就访问父类的父类的静态方法,静态属性,声明为子类,就访问子类,如果子类不存在该静态方法,静态属性,就访问相应父类的。

重写的功能是:"重写"后子类的优先级要高于父类的优先级,针对多态的概念。

抽象类和接口的定义,区别,作用,应用场景?

抽象类:包含抽象方法的类。is-a, abstract关键字 ,类继承抽象类extends, 抽象方法:abstract修饰方法,只有声明没有实现。含有抽象方法就是抽象类。

子类继续抽象类则必须实现抽象类的抽象方法。

作用是为了将来对该类进行扩展。

接口:对行为的抽象。has-a, interface关键字,类实现接口implement, 方法会被隐式地指定为public abstract方法。

区别:1. 成员变量类型。接口中的成员变量只能是public static final类型的。

2. 抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法。

3. 接口中不能含有静态代码块以及静态方法(Java8中允许我们在接口中定义默认方法和静态方法),而抽象类可以有静态代码块和静态方法。

4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

5. 抽象类继承是一个 "是不是"的关系,而 接口实现则是 "有没有"的关系。

对象克隆的方式几种?

1. 将A对象的值分别通过set方法加入B对象中

2. 通过重写java.lang.Object类中的方法clone()

3. 通过org.apache.commons中的工具类BeanUtils和PropertyUtils进行对象复制。BeanUtils.copyProperties(stu2, stu1);

4. 通过序列化实现对象的复制:

把源对象写入到一个字节流中,再从字节流中将其读出来,这样就可以创建一个新的对象了,并且该新对象与母对象之间并不存在引用共享的问题,真正实现对象的深拷贝

浅拷贝和深拷贝区别?

浅拷贝:基本数据类型,对值进行新的拷贝;引用数据类型(类,接口,数组)只复制引用。引用的另一处修改,当前对象也会被修改。

对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象

深拷贝:把要复制的对象所引用的对象都复制了一遍。

Q2基本数据类型

基本数据类型各占多少字节?

byte 1字节(8位) short 2字节(16位) char 2字节(16位) int 4字符(32位) long 8字节(64位) float 4字符(32位) double 8字节(64位) Boolean 1字节(8位)

Q3关键字

Java中==和equals的区别?

==是内存地址的比较

Equals是Object的方法,比较对象是否相等。默认equals是等价于==。通常重写equals,判断两个对象内容是否相等。

equals, hashCode的作用,联系?

Equals,不重写,判断两个对象内存地址是否相等。重写,判断两个对象的值是否相等。

HashCode()是Object里方法,获取哈希码(散列码),返回一个int整数。进而确定该对象在散列表中的位置。仅适用于集合中本质是散列表的类,如HashMap, HashSet, Hashtable.

关系:1. 不是散列表类,没关系。

2.散列表类:equals()相等,hashCode()一定相等。

如果两个对象hashCode()相等,它们并不一定相等。“两个不同的键值对,哈希值相等”,这就是哈希冲突。

Final关键字有哪些用法?

修饰的类不能被继承,修饰的方法不能被继承类重写。

常与Static一起,作为常量。

好处:1. 提高性能,JVM缓存final变量。2. 多线程下进行共享,不需要额外同步开销。

Final, finally, finalize的区别?

Final同上,finally是异常处理关键字,finalize是Object中定义的方法,在垃圾回收之前被JVM调用的方法。

Q4常用类

String, StringBuffer, StringBuilder区别? 底层原理?

1)String字符串常量,声明为final class,一旦创建不可变, Java对String操作是创建新对象,回收旧对象的过程。除了hash属性,其他属性都声明为final。如果拼接字符串会产生很多无用中间对象,影响性能。

2)StringBuffer字符串变量,对象是变量,可以改变。为解决大量拼接字符串产生中间对象问题而提供的类。Append方法追加字符串。

线程安全,所有修改数据方法都加synchronized。保证线程安全付出性能代价。

3)StringBuilder. JDK1.5发布,不需要线程安全的拼接字符串操作类,与StringBuffer没有区别,去掉了保证线程安全部分,减少了开销。

实现字符串反转有哪些方法?哪种效率最高?

1. 调用String的reverse()方法

2. 放入字符数组2分法+交换字符(冒泡对调) – 效率最高

3. 2分法+异或算法

4. 逆循环,用+拼接字符

5.使用堆栈,先进后出

6. Collections.reverse() 反转Character List.

7. Byte[]数组

思维导图Github:

https://github.com/channingy/JavaSummary/

[Java复习] Java基础 Basic的更多相关文章

  1. java复习之基础环境

    环境基本介绍: JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK).在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,在这里可以认为b ...

  2. 第二十六节:复习Java语言基础-Java的概述,匿名对象,封装,构造函数

    Java基础 Java语言概述 Java语言 语言 描述 javaee 企业版 javase 标准版 javame 小型版 JDK JDK(Java开发工具包) Java语言 语言 Java语言 Ja ...

  3. 1.JAVA基础复习——计算机基础与环境变量配置

    软件开发的了解 软件开发: 软件:一系列按照特定组织的计算机数据和指令的集合. 开发:制作软件. 程序:一系列有序指令的集合. 人机交互 人机交互的方式有两种:图形化界面和命令行方式. 图形化界面:简 ...

  4. 2.4JAVA基础复习——JAVA语言的基础组成数组

    JAVA语言的基础组成有: 1.关键字:被赋予特殊含义的单词. 2.标识符:用来标识的符号. 3.注释:用来注释说明程序的文字. 4.常量和变量:内存存储区域的表示. 5.运算符:程序中用来运算的符号 ...

  5. 2.3JAVA基础复习——JAVA语言的基础组成函数

    JAVA语言的基础组成有: 1.关键字:被赋予特殊含义的单词. 2.标识符:用来标识的符号. 3.注释:用来注释说明程序的文字. 4.常量和变量:内存存储区域的表示. 5.运算符:程序中用来运算的符号 ...

  6. 2.2JAVA基础复习——JAVA语言的基础组成运算符和语句

    JAVA语言的基础组成有: 1.关键字:被赋予特殊含义的单词. 2.标识符:用来标识的符号. 3.注释:用来注释说明程序的文字. 4.常量和变量:内存存储区域的表示. 5.运算符:程序中用来运算的符号 ...

  7. 2.1JAVA基础复习——JAVA语言的基础组成注释和常量变量

    JAVA语言的基础组成有: 1.关键字:被赋予特殊含义的单词. 2.标识符:用来标识的符号. 3.注释:用来注释说明程序的文字. 4.常量和变量:内存存储区域的表示. 5.运算符:程序中用来运算的符号 ...

  8. 2.0JAVA基础复习——JAVA语言的基础组成关键字和标识符

    JAVA语言的基础组成有: 1.关键字:被赋予特殊含义的单词. 2.标识符:用来标识的符号. 3.注释:用来注释说明程序的文字. 4.常量和变量:内存存储区域的表示. 5.运算符:程序中用来运算的符号 ...

  9. java 复习整理(一 java简介和基础语法)

    现在公司用的是封装太多东西的平台开发,觉着之前学的东西很多都忘了,所以想好好总结回顾一下.之前总是想学很多编程语言像python.s6.node.react,但现在越来越体会到编程语言只是一个开发的工 ...

随机推荐

  1. docker-compose 编排文件小疑点

    在学习docker-compose的时候,查看了下st2中的docker-compose.yml文件,有个地方没搞明白 env_file 制定的文件路径,一开始以为是在对应的容器中的conf目录中,但 ...

  2. 04_Hive的基本命令

    1.Hive基本操作: 1.1.Hive的建表语句: CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [ ...

  3. 记一次引用maven插件报错解决方法

    1.报错信息如图: plugin org.springframework.boot:spring-boot-maven-plugin not found 2.解决方案: maven的配置文件[sett ...

  4. 【转载】@Component, @Repository, @Service的区别

    @Component, @Repository, @Service的区别 官网引用 引用spring的官方文档中的一段描述: 在Spring2.0之前的版本中,@Repository注解可以标记在任何 ...

  5. mybayis项目使用的Mapping文件使用总结参考(二)

    针对in字句中的数组使用方法 <select id="getCpProfileNamesByIds" resultType="string"> se ...

  6. C# 父类代码动态转换子类

    百度上搜索C# 如何父类运行时转换成子类,没有得到相应答案,突然想起C# 有dynamic类型试试看结果成功了... 以后编写代码类似这样的代码 就可以删减掉了 if (en.type == EMap ...

  7. vue-cli 本地代理 造成session丢失 而登录不上去 解决办法

    本地代理造成session丢失,登录不成功,是由于代理配置造成的 devServer: { port: 8000, proxy:{ '/qiantai':{ target:'线上地址/qiantai' ...

  8. Python数据挖掘-文本挖掘

    文本挖掘概要 搞什么的? 从大量文本数据中,抽取出有价值的知识,并且利用这些知识更好的组织信息的过程. 目的是什么? 把文本信息转化为人们可利用的知识. 举例来说,下面的图表利用文本挖掘技术对库克ip ...

  9. 通过python的urllib.request库来爬取一只猫

    我们实验的网站很简单,就是一个关于猫的图片的网站:http://placekitten.com 代码如下: import urllib.request respond = urllib.request ...

  10. 二、编译安装LAMP之httpd-2.4.4

    回顾 PHP:脚本编程语言,php解释器 Webapp:面向对象的特性 Zend: 第一段:词法分析.句法分析.编译为Opcode: opcode放置于内存中 第二段:执行opcode: opcode ...