由于本人的个人博客网站到期,因此开始整理之前的学习笔记发布到简书,供日后学习使用。
关键字
- null,goto,const,true和false是不是java关键字?
都不是,他们是java保留字,不是Java关键字,也就是Java保留了,但是没有使用。
- java关键字是不是都是小写
是的,java关键字都只能小写
标识符
标识符是java编码语言中类,方法,变量的名字
- 9pins, a+c, It's,Java私塾是不是正确的标识符?
只有Java私塾是正确的,注意以下几点标识符命名规则:
- 只能以下划线,或者下划线
- java标识符由符合规范的UNICODE字母组成,所以可以使用中文
基本数据类型
java是一种强类型语言,也就是先声明后使用, 且若未作类型转换,则不能接受其它数据类型的赋值
- java有几种基本数据类型?
8种基本数据类型。注意String不是基本数据类型,是一个类
数据类型 | 说明 |
---|---|
boolean | 布尔型,值为true或者false |
byte | 字节型,8位,范围为-2^7 到 2^7 -1即 -128 - 127 |
short | 短整型,16位, |
int | 整型,32位,整数型的值默认是int |
long | 长整型,64位 |
float | 浮点型, |
double | 双精度型,浮点型的值默认是double |
char | 字符类型,表示单字符 |
- byte的取值范围为什么是-128 - 127
需要注意,在计算机种内部数据都是以二进制存储和计算的;数据分为有符号数和无符号数,有符号数的最高位为符号位,0表示正数,1表示负数;Java中的数据是有符号数;计算机的整数数据是以二进制的补码存储的。
计算机中的最大的正数补码为:01111111 = 1+2+4+8+16+31+64 = 127
最小的负数补码为:11111111 得到对应的原码为 10000000,转化成十进制为128
- 计算机为什么要使用二进制的补码存储数据?
如果使用二进制的原码,反码,补码表示+0和-0的话,只有补码是一致的,而原码和反码则是不一致的。
- float f=4096.0;是否会引起编译错误?
是,因为浮点型定义的时候必须要申明出是浮点型,后面加上f或者F
类型转换
- long num = 99L; int num2 = (int) num; 强制类型转换是否正确?
正确
- long num = 99; int num2 = 99L; double num3 = 12.414F; double num4 = 12.414; 表达式是否正确?
num正确,因为99是int型,可以自动升级为精度较长的形式
num2不正确,99L是长整型,不能自动降级为精度较低的形式,需要进行强制转换
同理num3正确,num4不正确
- short a,b,c; a=1; b=2;c=a+b 是否正确?
不正确,因为在执行+操作前,a和b都会自动升级为int型,a+b为int型,所以把int型的数据赋值给short不正确.主要是因为+运算结果要为int型.
- Integer a = 5;int a2 = new Integer(5);是否正确?
正确,自动包装:将基本数据类型自动包装成对应的包装类引用对象
自动解包:将包装类的引用对象自动解包成对应的基本的数据类型
子类初始化
- 子类初始化时先初始化父类,再初始化子类。初始化类,先初始化类的属性,再初始化类的构造方法。
- super()和this()必须放在构造函数的第一行
方法重载和方法覆盖
- 方法重载:重载的方法必须方法名相同,参数列表不同,仅仅返回类型不同不能重载
- 方法覆盖:子类重写父类的方法,方法名,返回类型,参数列表必须相同,访问修饰符不能降级
static关键字
- 静态方法只能访问静态属性,不能访问非静态属性
- 静态方法不能调用非静态方法,非静态方法可以访问静态方法
- 静态方法中不存在当前对象,所以不能使用this关键字
- 构造方法不能被声明为静态方法
抽象类
- 抽象类不一定包含抽象方法,包含抽象方法的类一定是抽象类
接口
- 接口中的属性默认也只能是public static final
- 接口中的抽象方法默认也只能是public abstract
- 接口是一种特殊的抽象类,只包含常量和抽象方法,不包含变量和方法的实现
子类和父类实现同一个接口的意义
- 效果上没什么特别用途,主要是表示子类实现了这个核心接口
String 字符串常量池
-
String str1="abc"; String str2="abc"; result = str1==str2;
result 结果为true,因为str1="abc"首先在方法区中的常量池中生成一个对象,然后str2="abc"是生成一个新的对象引用,指向常量池中的"abc",所以str1和str2指向同一个对象,所以相等 -
String str1="abc"; String str2="ab"+c; result = str1==str2;
result 结果为true,因为str2="ab"+c在编译时已经确定为"abc",所以会和str1指向同一个"abc"对象 -
String str1="abc"; String str2="ab"; String str3=str2+"c" result = str1==str3;
result 结果为false,因为str3=str2+c在编译时不能确定引用类型str2的内容,只有在运行时动态连接并分配新的地址给str3 -
String str1="abc"; final String str2="ab"; String str3=str2+"c" result = str1==str3;
result 结果为true,str2="ab" 在编译时就以及在常量池维护了"ab",str3=str2+"c"在编译时可以确定str2的值为"ab"了