每日一问
每日一问
Aierns每日一问
day01
JavaSE重点知识点列表:
- 变量
- 数据类型
- 循环
- 数组
- 多态
- 集合
day02
写出Java语言的8个特性
- 健壮性 强类型机制(所有数据必须要有数据类型) 异常处理 GC(垃圾回收) 标记 引用:安全的指针
- 安全 类加载器(ClassLoader)
- 简单 去掉了C/C++的复杂部分
- 多线程 高效并最大化利用CPU
- 分布式 网络中多主机协作
- 面向对象 关注的是有功能的对象
- 高效 编译型语言比解释型语言高效
- 跨平台 JVM有不同的版本
语句,类,方法的关系
- 类可以包含多个方法
- 方法可以包含多个语句
- 类是Java程序的基本单位
- 方法是功能单位,必须隶属于类,表达的是类和对象的功能
- 语句是最小执行单位,语句必须隶属于方法
什么是主类,什么是公共类,公共类注意点
主类是包含了主方法的类
公共类是Java文件中的唯一一个类,且类名与文件名相同
变量是什么
在内存中的一块固定类型,一个位置的空间,此空间中可以保存一个数据,且此空间中的数据可以随意变化.
数据类型的作用是什么
- 决定空间大小
- 决定空间中可以保存什么数据
- 决定数据能做什么
day03
数据类型
变量按照数据类型来分, 分为基本数据类型变量和引用数据类型变量, 请写出基本数据类型变量和引用数据类型变量的区别.
- 基本数据类型: 空间中保存数据本身
- 整数型 byte short int long
- 浮点型 float double
- 字符型 char
- 布尔型 Boolean
- 引用数据类型: 空间中保存其他数据的地址
- 类 class
- 接口 interface
- 枚举 enum
- 注解 @interface
- 数组 [ ]
基本数据类型有8种, 写出8种基本数据类型
整数型 byte short int long
浮点型 float double
字符型 char
布尔型 Boolean
列出变量使用注意事项(6点), 并简单阐述你的理解
- 必须先声明后使用
- 必须初始化再使用
- 必须要有数据类型和变量名,数据类型的作用是3个(day02).变量名的作用是定位空间.
- 同一作用域内变量不能重复声明
- 只能用本作用域中的变量,由其声明语句所在的’{}’决定.
- 变量有其数据范围
按照兼容性从大到小对所有基本数据类型排序
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 |
运算符%的作用是什么? 有什么实际的应用?
求余 判断是否可以整除.
M % N 结果一定是小于N的. 可以让一个未知的数落入一个已知的范围N之内.
M % N 结果如果为0, 表明M可以被N整除
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.动态初始化
1 | //动态初始化1 |
2.静态初始化
1 | //静态初始化1 |
什么是类?什么是对象?什么是实例?类中有哪些成员?各自的作用是什么?
类: 某种事物的抽象描述,是一组相关属性和行为的集合
对象: 是一类事物的具体个体.即对象是类的一个实例, 必然具备该类事物的属性和行为.
实例: 对象
类中有哪些成员: 方法(描述事物的行为动作) 属性(描述事物的特征数据) 构造器
day09
类中有哪些成员?各有什么作用?成员意味着什么?什么是封装?如何封装?
属性: 描述事物的特征数值
方法: 描述事物的行为动作
构造器: 在创建对象时,为对象的初始化工作.有几个特殊点:
- 方法名和类名相同
- 不能有返回值声明
- 不能被一些关键字修饰
- 不能像普通方法一样随意调用
成员意味着在同一个类内可以相互随意访问
将成员用private修饰,后面用public修饰的setXXX()方法和getXxx()方法来修改和访问数据
什么是垃圾对象?垃圾对象会被立刻清理吗?如何清理垃圾?
没有被引用变量指向的对象.但是GC还在引用,所以可以辨识到垃圾对象
不一定会被立刻清理.
把垃圾对象占用的所有内存空间标记为可用状态.
描述创建对象过程
1.看方法区内是否有类模板
2.没有的话,用类加载器加载类模板
3.有的话,不加载类模板,保证类模板只有一份
4.直接使用,依据类模板中所有属性的定义信息(修饰符,数据类型,属性名),开辟一个独立的空间
5.jvm对空间数据清零,保证属性有缺省值0.
6.对属性显示赋值
7.执行构造方法
tips:每次创建对象有3次初始化,第一次是jvm的刷0,第二次是对属性显式赋值,第三次是执行构造方法.
封装的两个含义
- 成员私有化,保护成员
- 功能性封装:1.该我做的义不容辞 2.不该做的绝不多管闲事. —–边界清晰
类模板
包含了所有属性的定义信息\修改符\数据类型\属性名.
1 | public String say(){ |
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%多态引用
枚举
注解
变量根据 声明语句的位置来分 :
局部变量(local) : 在方法中声明的变量, 包括 参数和方法中的普通变量
范围小, 寿命短, 存在于方法调用时的栈中, 没有自动初始化, 必须由程序员手工初始化.
成员变量(member) : 在类中方法外声明的变量.
范围大, 寿命长, 都有自动初始化值0
static修饰的 : 静态变量, 静态属性, 类属性, 类变量
寿命最长, 和类模板同周期, 存在于方法区中的类模板中
没有static修饰的 : 非静态变量, 对象属性, 实例变量.
寿命和对象同周期, 存在 于GC区中的对象中
day16
内部类
对象关联
普通对象关联
内部类对象关联
day17
描述什么是代理设计模式,在什么样的场景中使用
代理设计模式就是把代理对象当作被代理对象来使用.
使用场景:
①类不能直接访问
②需要在原有的基础上统一实现功能升级
完成代码
1 | interface IHello{ |
异常按照处理方式分为几种,各包含哪些类?
受检异常 : 必须接收检查和处理的异常,如果不处理,编译报错,也称为编译时异常
Throwable
Exception及其子类.(RuntimeException除外)
非受检异常 : 不是必须接受检查和处理的异常,如果不处理,编译不出错,但是运行时还会出问题,也称为运行时异常(RuntimeException)
Error : 太过严重
RuntimeException : 太过常见和轻微
判断
- 非受检异常就是必须不要处理的异常
- 受检异常就是可以处理的异常
- 非受检异常是不必须处理的异常
- 受检异常可以对其忽略
- 无论是什么异常,都必须对其进行处理
- 只有受检异常会引起程序中断
- 受检异常是必须对其进行处理的异常
- 只有非受检异常会引起程序中断
- 异常处理只适用于受检异常
- 异常处理适用于所有异常,都是error
异常的处理有几种方式,各是什么?怎么处理
- try - catch - finally
1 | try{ |
- 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 | //用Calendar做 |