每日一问

每日一问

day01

JavaSE重点知识点列表:

  1. 变量
  2. 数据类型
  3. 循环
  4. 数组
  5. 多态
  6. 集合

day02

写出Java语言的8个特性

  1. 健壮性 强类型机制(所有数据必须要有数据类型) 异常处理 GC(垃圾回收) 标记 引用:安全的指针
  2. 安全 类加载器(ClassLoader)
  3. 简单 去掉了C/C++的复杂部分
  4. 多线程 高效并最大化利用CPU
  5. 分布式 网络中多主机协作
  6. 面向对象 关注的是有功能的对象
  7. 高效 编译型语言比解释型语言高效
  8. 跨平台 JVM有不同的版本

语句,类,方法的关系

  1. 类可以包含多个方法
  2. 方法可以包含多个语句
  3. 类是Java程序的基本单位
  4. 方法是功能单位,必须隶属于类,表达的是类和对象的功能
  5. 语句是最小执行单位,语句必须隶属于方法

什么是主类,什么是公共类,公共类注意点

主类是包含了主方法的类

公共类是Java文件中的唯一一个类,且类名与文件名相同

变量是什么

在内存中的一块固定类型,一个位置的空间,此空间中可以保存一个数据,且此空间中的数据可以随意变化.

数据类型的作用是什么

  1. 决定空间大小
  2. 决定空间中可以保存什么数据
  3. 决定数据能做什么

day03

数据类型

变量按照数据类型来分, 分为基本数据类型变量和引用数据类型变量, 请写出基本数据类型变量和引用数据类型变量的区别.

  • 基本数据类型: 空间中保存数据本身
    • 整数型 byte short int long
    • 浮点型 float double
    • 字符型 char
    • 布尔型 Boolean
  • 引用数据类型: 空间中保存其他数据的地址
    • 类 class
    • 接口 interface
    • 枚举 enum
    • 注解 @interface
    • 数组 [ ]

基本数据类型有8种, 写出8种基本数据类型

整数型 byte short int long

浮点型 float double

字符型 char

布尔型 Boolean

列出变量使用注意事项(6点), 并简单阐述你的理解

  1. 必须先声明后使用
  2. 必须初始化再使用
  3. 必须要有数据类型和变量名,数据类型的作用是3个(day02).变量名的作用是定位空间.
  4. 同一作用域内变量不能重复声明
  5. 只能用本作用域中的变量,由其声明语句所在的’{}’决定.
  6. 变量有其数据范围

按照兼容性从大到小对所有基本数据类型排序

byte->short->int->long->float->double

​ char->

day04

变量分类有两种分法, 第一种是按数据类型来分,另外一种是按照声明位置来分, 每一种又各分为哪些种类型. 各有什么特点?

  • 按数据类型

    • 整型 byte short int long

    • 浮点型 float double

    • 字符型 char

    • 布尔型 Boolean

  • 按声明位置

    • 局部变量: 声明在方法中的变量 范围小,寿命短

    • 成员变量: 声明在类中方法外的变量,范围长,寿命长

基本数据类型有8种, 写出8种基本数据类型, 并用的16进制形式写出所有整数数据类型的最小值和最大值

数据类型 占用内存空间 取值范围
byte 1字节 0x70-0x8F
char 2字节 0x0000-0xFFFF
short 2字节 0x8000-0x7FFF
int 4字节 0x8000_0000-0x7FFF_FFFF
long 8字节 0x8000_0000_0000_0000-0x7FFF_FFFF_FFFF_FFFF
float 4字节 -2^128~2^128
double 8字节 -2^1024~2^1024
Boolean 1字节 True / False

运算符%的作用是什么? 有什么实际的应用?

求余 判断是否可以整除.

  1. M % N 结果一定是小于N的. 可以让一个未知的数落入一个已知的范围N之内.

  2. M % N 结果如果为0, 表明M可以被N整除

  3. M % 2 如果结果为0, 说明M是偶数, 结果如果为非0, 就是奇数.

day05

列出变量的使用注意事项(至少6点)

1.必须先声明后使用

2.必须初始化后再使用

3.变量有其数据类型和变量名

4.变量有其作用范围

5.同一作用域内不能重复声明

6.只能用本作用域内的变量.由其声明语句所在的{}决定.

变量分类有两种分法, 第一种是按数据类型来分,另外一种是按照声明位置来分, 每一种又各分为哪些种类型. 各有什么特点?

  • 按数据类型

    • 整型 byte short int long

    • 浮点型 float double

    • 字符型 char

    • 布尔型 Boolean

  • 按声明位置

    • 局部变量: 声明在方法中的变量 范围小,寿命短

    • 成员变量: 声明在类中方法外的变量,范围长,寿命长

判断

1) if else if else if else 语句中, 如果同时有多个条件都为true, 那么将会有多个语句块被执行

if (条件1) {

​ 语句1;

} else if (条件2) {

​ 语句2;

} else if (条件3) {

​ 语句3

} else {

​ 语句4;

}

答:错误,分支结构只有第一个符合的被执行.

2) switch case case default 语句中, 如果同时有多个case都能进入, 那么将会有多个语句块被执行

答:多个case不可能出现相同的常量.

在switch结构中, switch()括号中的要求具体是什么? case后面的要求又是什么?

switch (n) { // n必须有变化, 数据类型必须是非long整数. 字符串, 枚举

​ case 1: // case 后面必须是常量, 因为它的底层是一个表格.

}

for循环的结构是什么? 执行流程是如何? 三种循环的选择依据是什么?

for(初始化语句A;循环条件B;迭代语句C){

​ 循环体D;

}

有确定的循环次数时使用for

无确定的循环次数时用while或者do while.

day06

简述break语句和continue语句的作用.

break 大事故,终止当前循环.用于switch-case语句和循环语句,用于中断case或最近的循环。

continue 小事故,跳到下一次循环.只能用于循环语句,跳过最近的当次循环, 直接进入下一次循环的迭代语句。

声明定义一个方法的语法格式是什么? 解释每部分的作用. 什么时候需要在方法中声明参数?

修饰符 返回值类型 方法名(参数列表){

​ 方法体;

​ return 返回值;

}

如何调用一个带有形参的方法? 形参和实参的作用分别是什么?

形参是构造方式时代入的参数,包含参数类型和参数名。

实参是调用方法时实际输入的参数值。

方法的返回值在哪里? 如何使用这个返回值?

方法的返回值在方法体的最后.

调用方法本身,可以得到方法的返回值

day08 数组 面向对象

数组是什么?什么类型的数据可以创建数组?

  1. 数组是一组相同数据类型的元素的集合.
  2. 任意数据类型都可以创建数组,基本数据类型和引用数据类型.

声明数组的方式?

1.动态初始化

1
2
3
4
5
6
//动态初始化1
int[] arr;
arr = new int[5];

//动态初始化2
int[] arr = new int[5];

2.静态初始化

1
2
3
4
5
6
//静态初始化1
int[] arr = {1,2,3,4,5};
//静态初始化2
int[] arr = new int[]{1,2,3,4,5};
int[] arr;
arr = new int[]{1,2,3,4,5}

什么是类?什么是对象?什么是实例?类中有哪些成员?各自的作用是什么?

类: 某种事物的抽象描述,是一组相关属性行为的集合

对象: 是一类事物的具体个体.即对象是类的一个实例, 必然具备该类事物的属性和行为.

实例: 对象

类中有哪些成员: 方法(描述事物的行为动作) 属性(描述事物的特征数据) 构造器

day09

类中有哪些成员?各有什么作用?成员意味着什么?什么是封装?如何封装?

属性: 描述事物的特征数值

方法: 描述事物的行为动作

构造器: 在创建对象时,为对象的初始化工作.有几个特殊点:

  1. 方法名和类名相同
  2. 不能有返回值声明
  3. 不能被一些关键字修饰
  4. 不能像普通方法一样随意调用

成员意味着在同一个类内可以相互随意访问

将成员用private修饰,后面用public修饰的setXXX()方法和getXxx()方法来修改和访问数据

什么是垃圾对象?垃圾对象会被立刻清理吗?如何清理垃圾?

没有被引用变量指向的对象.但是GC还在引用,所以可以辨识到垃圾对象

不一定会被立刻清理.

把垃圾对象占用的所有内存空间标记为可用状态.

描述创建对象过程

1.看方法区内是否有类模板

2.没有的话,用类加载器加载类模板

3.有的话,不加载类模板,保证类模板只有一份

4.直接使用,依据类模板中所有属性的定义信息(修饰符,数据类型,属性名),开辟一个独立的空间

5.jvm对空间数据清零,保证属性有缺省值0.

6.对属性显示赋值

7.执行构造方法

tips:每次创建对象有3次初始化,第一次是jvm的刷0,第二次是对属性显式赋值,第三次是执行构造方法.

封装的两个含义

  1. 成员私有化,保护成员
  2. 功能性封装:1.该我做的义不容辞 2.不该做的绝不多管闲事. —–边界清晰

类模板

​ 包含了所有属性的定义信息\修改符\数据类型\属性名.

1
2
3
4
public String say(){
//这里的this是指当前方法的调用者对象.
return "x: " + this.x + ",y: " + this.y;
}

JavaBean

  • 类是公共的
  • 有一个无参的公共的构造器
  • 有属性,且有对应的get\set方法

day12

1.什么是继承?为什么要继承?如何继承?

现有类创建子类,现有类又称为父类,基类,超类.

父类不能满足需要,需要子类在父类的基础上进行拓展.

通过extends关键字,声明一个子类继承另外一个父类

一句话: 子类是完全且更强大的父类

2.子类能继承父类的的私有成员吗?如何处理?

可以.提供get/set方法间接调用父类的私有成员.

3.为什么父类又叫基类或超类?

子类拥有父类的所有成员(构造器除外),并且强于基类.英文名叫superclass,所以叫超类.

4.什么是方法覆盖?方法覆盖有什么条件?

在子类中重写在父类中继承过来的方法.

条件:

①子类的访问权限控制符要大于等于父类

②子类方法签名要与父类一致(返回值类型 方法名 参数列表)

5.如果A类被B类继承,B类又被C类继承,在所有类中都有一个方法test(),创建C类对象,调用test()方法,执行的是哪个类的方法?在C类种有几个test()方法?

执行C类方法

测试类视角: C类中只有一个test()方法

如果在C类的内部: C类中2个test()方法 this.test() / super.test()

继承的概念来看: C类中有3个test()方法

day13

static关键字可以修饰什么

static可以修饰属性,方法,代码块,内部类

static修饰属性的特点

static修饰属性:

  • 类变量 : 所有的对象共同拥有一份
  • 实例变量(非静态) : 每个对象独自拥有一份

static修饰方法的特点

static修饰方法:

  • 静态方法 : 可以直接通过类名进行调用–不需要对象
    • 静态方法中为什么不能调用this和super? —>加载时机不同,静态方法通过类名调用
  • 非静态方法 : 通过对象调用(方法中的this不一样)

类变量\实例变量

类变量 : 所有的对象共同拥有一份

实例变量(非静态) : 每个对象独自拥有一份

day14

被static修饰的成员有什么特点?

static修饰属性,方法,代码块,内部类

共同点

  • 在类加载(只加载一次)时进行加载

不同点

  • static修饰属性
    • 类变量 : 所有的对象共同拥有一份
    • 实例变量(非静态) : 每个对象独自拥有一份
  • static修饰方法
    • 静态方法 : 可以直接通过类名直接调用–不需要对象
      • 静态方法中为什么不可以调用this和super? 加载时机不同,静态方法通过类名调用
    • 非静态方法 : 通过对象调用(方法中的this不一样)

被static修饰的成员在内存空间只有一份

什么成员应该声明成静态的?什么成员应该设置成非静态的?

类的成员: 属性,方法,构造器,代码块,内部类.

类变量设置成静态,实例变量设置成非静态

什么时候声明成类变量 : 同一个类的所有对象共享的时候

什么时候声明成静态方法 : 如果要做成工具类中的方法(可以类名直接调用-常用)

单例设计模式用来解决什么问题?如何实现单例设计模式?

设计模式: 用来解决问题的方案

整个系统中某个类只存在一个对象. 有懒加载 和 饿汉式.

给构造器的权限修饰符改为private

如何给main方法传参

1.在idea中是点edit—>program arguments—>参数1 参数2 参数3….

2.命令: java 字节码文件 参数1 参数2 ……

定义一个工具类EmploeeUtil

  • 提供方法中创建一个数组用来存放三个员工(Employee)的信息(id,name,salary)
  • 提供方法输入员工id可以输出该员工年薪annualSalary没有就输出查无此人
  • 提供方法输入员工id可以输出数组中员工信息没有就输出查无此人

day15

什么是多态?什么是虚方法调用?

多态

  • 从右向左: 子类对象的多种父类类型的形态
  • 从左向右: 父类类型的引用变量可以指向多种不同子类对象

虚方法调用

  • 多态引用调用重写的方法,编译时看重父类类型,运行时动态绑定具体子类的方法.

描述equals方法和hashcode方法的含义和作用

equals 比较2个对象的内容是否相同

hashcode 2个对象的内容相同hashcode相同

什么成员应该声明成静态的,什么成员应该声明为非静态?

共享的数据声明为类属性(静态),方法和调用者对象无关时,定义为静态方法.

静态环境中可以直接访问非静态成员吗?非静态环境中可以访问静态成员吗?各自的原因是什么?

①不能,静态环境中没有this,不能直接访问非静态成员.可以通过现new一个对象再通过对象来访问

1
new person().say();

②能

判断:

抽象类中必须包含抽象方法 False,可以不包含

抽象类中不能包含普通方法 False,抽象类可以包含具体方法

抽象类中可以包含抽象方法 True

抽象类不能创建对象,所以可以省略构造器 False,子类要继承父类,构造器虽然不继承,但是必须调用,所以不能

具体类最多允许包含1个抽象方法 False

抽象类主要用于被具体子类继承,具体子类可以不必理会抽象父类中的抽象方法 F

具体类中如果包含抽象方法,编译出错 T

一个类中如果包含抽象方法,这个类必须是抽象类 T

抽象类中必须包含属性,构造器和普通方法和抽象方法. F

抽象类中可以不包含抽象方法,具体子类必须实现全部的父类的抽象方法. T

代码块

静态代码块(类初始化器)

非静态代码块

变量 :

​ 内存中的一块被命名的且有特定数据类型约束的空间, 此空间中可以保存一个数据类型约定的数据, 并且此空间中的数据可以在其数据类型的范围内随意变化.

​ 变量声明 :

​ 数据类型 变量名;

​ 数据类型的作用 :

​ 1) 决定空间的大小

​ 2) 决定了空间中的保存什么数据

​ 3) 决定了空间中的数据可以做什么.

1 变量根据类型来分 :

​ 1) 基本数据类型(primitive) : 空间中保存数据本身

​ 数值型

​ 整数

​ byte, short, int ,long, char(没有负数)

​ 浮点数

​ float , double

​ 布尔型

​ boolean

​ 2) 引用数据类型(reference) : 空间中保存对象地址(首字节编号), 永远占用8字节.

​ 数组

​ 类, Student s;

​ 接口 , Flyer f; 100%多态引用

​ 枚举

​ 注解

  1. 变量根据 声明语句的位置来分 :

    1. 局部变量(local) : 在方法中声明的变量, 包括 参数和方法中的普通变量

      ​ 范围小, 寿命短, 存在于方法调用时的栈中, 没有自动初始化, 必须由程序员手工初始化.

    2. 成员变量(member) : 在类中方法外声明的变量.

      ​ 范围大, 寿命长, 都有自动初始化值0

      ​ static修饰的 : 静态变量, 静态属性, 类属性, 类变量

      ​ 寿命最长, 和类模板同周期, 存在于方法区中的类模板中

      ​ 没有static修饰的 : 非静态变量, 对象属性, 实例变量.

      ​ 寿命和对象同周期, 存在 于GC区中的对象中

day16

内部类

对象关联

普通对象关联

内部类对象关联

day17

描述什么是代理设计模式,在什么样的场景中使用

代理设计模式就是把代理对象当作被代理对象来使用.

使用场景:

​ ①类不能直接访问

​ ②需要在原有的基础上统一实现功能升级

完成代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
interface IHello{

}

class Test{
main(){
IHello ih = new IHello() {
@Override
public String transfer(int n){
return "" + n;
}
};

String s = ih.transfer(3);
sout(s); // "3"
}
}

异常按照处理方式分为几种,各包含哪些类?

受检异常 : 必须接收检查和处理的异常,如果不处理,编译报错,也称为编译时异常

​ Throwable

​ Exception及其子类.(RuntimeException除外)

非受检异常 : 不是必须接受检查和处理的异常,如果不处理,编译不出错,但是运行时还会出问题,也称为运行时异常(RuntimeException)

​ Error : 太过严重

​ RuntimeException : 太过常见和轻微

判断

  • 非受检异常就是必须不要处理的异常
  • 受检异常就是可以处理的异常
  • 非受检异常是不必须处理的异常
  • 受检异常可以对其忽略
  • 无论是什么异常,都必须对其进行处理
  • 只有受检异常会引起程序中断
  • 受检异常是必须对其进行处理的异常
  • 只有非受检异常会引起程序中断
  • 异常处理只适用于受检异常
  • 异常处理适用于所有异常,都是error

异常的处理有几种方式,各是什么?怎么处理

  • try - catch - finally
1
2
3
4
5
6
7
8
9
10
11
12
13
try{
可能出现异常的语句;
}catch(异常类型1 引用){
输出异常语句;
}catch(异常类型2 引用){
输出异常语句;
}catch(Exception e){
输出异常语句;
}finally{
无论前面try catch中发生什么都要执行,通常执行最重要的语句,释放资源;
}

被保护的语句;
  • throws : 抛出

方法声明中加入throws 异常类型列表,警告和提醒此方法的调用者,本方法的风险列表.

使用中有throws没有throw的抛出动作也是合法的,但是最好不要这样.

在方法中如果有throw而且后面有受检异常必须加throws,如果后面是非受检异常,则可以不加throws.

day18

day19

包装类的作用是什么? 包装类有哪些? 如何使用包装类把字符串转换成相应的基本数据类型?

包装类的作用: 把基本数据类型转换成对象

包装类有哪些? Byte Short Character Long Integer Float Double Boolean

使用包装类把字符串转换成相应的基本数据类型: Xxx.parseXxx(xxx);

什么是装箱, 什么是拆箱? 如何使用?

装箱 : 把基本数据类型转换成对象

​ 手动装箱 : Xxx i = new Xxx(xxx);

​ 自动装箱 : Xxx i = xxx;

拆箱 : 把对象转换成基本数据类型

​ 手动拆箱 : xxx i = Xxx.value(Xxx);

​ 自动拆箱 : xxx i = Xxx;

String和StringBuilder的区别是什么? StringBuilder和StringBuffer的区别又是什么?

String和StringBuilder的区别 :

String : 内容不可改变,如果改变需要创建新对象.

StringBuilder : 内容可以改变,如果改变不需要创建新对象.线程不安全但是效率高

StringBuffer : 内容可变,如果改变不需要创建新对象,线程安全但是效率低

问答:

String类中的方法 :

1.length() 作用是什么?

返回字符串长度

2.获取指定的下标处的字符的方法是哪个?

public char charAt(int index);

3.indexOf(String child, int start)的作用是什么, 其中参数是什么含义?

获取指定字符串的起始下标,start为开始索引下标(从左向右)

4.获取字符串的子串的方法是哪些? 分别描述参数的含义.

public String substring(int i,int j) : i开始下标,j为结束下标

5.startsWith(String str)和endsWith(String str)的作用是什么?

判断字符串是否以子串开始/结束.

6.比较字符串对象并忽略大小写的方法是?

public boolean equalsIgnoreCase(String s1);

public int compareToIgnoreCase(String s2);

7.trim()方法的作用是什么?

消除字符串首尾空白字符(码值小于等于32)

8.把字符串中的所有大写字母变小写, 小写字母变大写的方法是什么?

toUpperCase—>变大写,toLowerCase()—>变小写

9.replace(char ch1, char ch2)作用是什么? 和replaceAll有什么区别?

replace的作用是把全部ch1替换成ch2.

replaceAll支持正则表达式

10.把字符串以某个子串为切割器切割的方法是什么?

public String[] split(String str);

11.获取字符串对应的字符数组方法是什么?

public char[] toCharArray( ); //返回内部数组value的副本

StringBuilder类中的方法:

1.在字符串后面追加内容的方法是? 可以是什么类型的参数?

append(…) 可以是任意参数

2.在字符串的指定位置处插入新内容的方法是? 可以是什么类型的参数?

insert(int index,…) 可以是任意参数

如何把一个时间显示成 2017年05月19日 08时50分?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//用Calendar做
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2017);
cal.set(Calendar.MONTH, 4);
cal.set(Calendar.DAY_OF_MONTH, 19);
....
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分");
String str = sdf.farmat(cal.getTime());
sout(str);

//用LocalDateTime做
LocalDateTime ldt = LocalDateTime.now();
LocalDateTime ldt2 = ldt.withYear(2017).withMonth(5).withDayOfMonth(19).withHour(8).withMinitue(50);
DateTimeFormatter dtf = DateTimeFormatter.ofPatter("yyyy年MM月dd日 HH时mm分");
String str2 = dft.format(ldt2);

day22