一、float,double,short,long
1、float
单精度浮点数(32位);默认值 0.0f;浮点数不能用来表示精确的值
例:float f1 = 1.5f;
关于浮点数存在的原因,我找到下面一段话,觉得很有道理
虽然计算机使用二进制,但在处理非整数时,也需要考虑小数点位置的问题,无法对齐小数点就无法做加法、减法比较这样的操作。
我们说小数点位置,永远是说相对于我们存储的数位来说的,比如说我们存储了01001001,然后小数点在第三位之后,也就是010.01001了。
定点数是提前对齐好的小数,整数是一种特殊情况,小数点永远在最后一位之后。定点数的优点是很简单,大部分运算实现起来和整数一样或者略有变化,但是缺点则是表示范围,比如我们刚才的例子中,最大只能表示32;而且在表示很小的数的时候,大部分位都是0,精度很差,不能充分运用存储单元。
浮点数就是设计来克服这个缺点的,它相当于一个定点数加上一个阶码,阶码表示将这个定点数的小数点移动若干位。由于可以用阶码移动小数点,因此称为浮点数。
2、double
双精度浮点数(64位);默认值 0.0d;double也不能用来表示精确的值
例:double d1 = 1.5;
3、short
16位有符号数,默认值0
4、long
64位有符号数,默认值0L
short a=0;
long b=0;
float c=0;
double d=0;
System.out.println(a+"/"+b+"/"+c+"/"+d);
//输出0/0/0.0/0.0
System.out.println("short:"+Short.SIZE+"位:"+Short.MIN_VALUE+"~"+Short.MAX_VALUE);
//short:16位:-32768~32767
//long:64位:-9223372036854775808~9223372036854775807
//float:32位:1.4E-45~3.4028235E38
//double:64位:4.9E-324~1.7976931348623157E308
二、final
final 表示不可改变的
1、final数据
final int a=8;
a=10;
//此时a报错:The final local variable a cannot be assigned.
//It must be blank and not using a compound assignment
所以可以将final定义的数据看做常量(大写),只能被赋值一次
还有一种空白常量:
一个类中的final数据成员就可以实现依对象而有所不同,却有保持其恒定不变的特征。
我理解是:该数据类型是final,但是对象是每次new时动态的,那么该数据可以成为动态的对象中不变的常量(依对象实际而变化)
public class StudyFinal {
final int a;
public StudyFinal (int a) {
this.a=a;
}
public int getA() {
return a;
}
public static void main(String[] args) {
for(int i=0;i<10;i++)
System.out.println(new StudyFinal(i).getA());
//每个实例化对象都有个final a
}
}
public class StudyFinal {
final int a,b;
public StudyFinal (int a) {
//此时a提示The blank final field b may not have been initialized
//所以再次强调了:无论什么情况编译器都确保是空白final在使用前必须被初始化。
this.a=a;
}
public StudyFinal (int a,int b) {
this.a=a;
this.b=b;
}
}
2、final方法
public class StudyFinal {
public final void method(){
System.out.println("this is a final method");
}
}
class emethod extends StudyFinal{
public void method() {
//method处报错:Cannot override the final method from StudyFinal
}
}
使用final方法原因如下
第一、把方法锁定,防止任何继承类修改它的意义和实现。
第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。
public class StudyFinal {
public static void main(String[] args) {
final int a=8;
emethod e=new emethod();
e.method();
//程序执行完,显示“this is a final method”,代表final方法可以继承,但是不能修改
}
public final void method(){
System.out.println("this is a final method");
}
}
class emethod extends StudyFinal{
}
3、final类
final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。
public final class StudyFinal {
}
class sf1 extends StudyFinal{
//此时提示:The type sf1 cannot subclass the final class StudyFinal
}
三、extends
extends:继承
子类会自动得到父类的字段和方法(非private),也可以重写父类的方法,上面很多地方都用到了extends,就不累赘说了
实践发现extends理解不是透彻,附上例子
class grand{
public grand() {
System.out.println("this is grand");
}
}
class parents extends grand{
}
public class ThisSuper extends parents {
public static void main(String[] args) {
ThisSuper t=new ThisSuper();
}
}
//输出一行this is grand
/*
*说出来自己都觉得挺搞笑的,真是学着学着学傻了。写下这段反思的原因是现在用上面的代码做第六课作业时,出现了3行this is grand。然后就开始怀疑智商和人生了。
再细看现在的代码,原来我是实例化了三次:new ThisSuper();new parents();new grand();
当然会有3行。
所有再次验证了extends是调用,并不是实现,我new一次,它会一直往调用。而非把父类构造方法继承过来再实现一次。
*/
四、implements
接口一直是我没搞懂的地方。
因为Java不允许多重继承,这个时候接口就实现了多重接口 :有多个行为你,但是只要一个类可以具体实现
语法:
定义接口
interface 接口名{
}
实现接口:implement
class A implements B,C,D,E {
}
注意事项:
a.实现一个接口就是要实现该接口的所有的方法(抽象类除外)。
否则提示:The type Interface must implement the inherited abstract method XXX
b.接口中的方法都是抽象的。
c.多个无关的类可以实现同一个接口,一个类可以实现多个无关的接口。
implement的栗子:
interface testinterface{
void settest();
void playtest();
}
public class Interface implements testinterface{
public void settest(){
System.out.println("this is a set interface");
}
public void playtest(){
System.out.println("this is a paly interface");
}
public static void main(String[] args) {
Interface inter=new Interface();
inter.settest();
inter.playtest();
}
}
但是我觉得我理解接口这块还是比较浅显,也没太明白接口的优势所在,后续补充~