2021-07-10 JavaBase

请简述java 128陷阱
答案就在Integet的valueOf()方当中,如果我们的数值在-128-127之间的数值都存储在有一个catch数组当中,
该数组相当于一个缓存,当我们在-128-127之间进行自动装箱的时候,我们就直接返回该值在内存当中的地址,
所以在-128-127之间的数值用==进行比较是相等的。而不在这个区间的数,需要新开辟一个内存空间,所以不相等。

普通类可以去实例化调用;抽象类不能被实例化,因为它是存在于一种概念而并非具体。
普通类和抽象类都可以被继承,但是抽象类被继承后子类必须重写父类抽象的方法,除非子类也是抽象类。
抽象类可以有构造方法,只是不能直接创建抽象类的实例对象而已。在继承了抽象类的子类中通过super()或super(参数列表)调用抽象类中的构造方法。
类名前加修饰符abstract;
可包含常规类能包含的任何成员,包括非抽象方法;
也可包含抽象方法:用abstract修饰,只有方法原型,没有方法的实现;
没有具体实例对象的类,不能使用new方法进行实例化,只能用作超类;
只有当子类实现了抽象超类中的所有抽象方法,子类才不是抽象类,才能产生实例;
如果子类中仍有抽象方法未实现,则子类也只能是抽象类。
Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以(就是interface中只能定义方法,而不能有方法的实现,而在abstract class中则可以既有方法的具体实现,又有没有具体实现的抽象方法)
1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface.
2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是 static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。
4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
7.接口中的方法默认都是 public,abstract 类型的

JDK =JRE+编译器(javac)+工具(javadoc);开发环境
JRE = JVM+Java命名+Java类库; 运行环境
JVM Java为什么存在一次编译到处运行
Java编译后的代码是不能被不同平台直接识别,而是形成一种字节码文件,字节码文件是可以被安装在不同平台的不同的JVM所识别,然后由JVM把字节码文件翻译成平台可以执行的代码
2.在最高位代表符号位区分正数还是负数,0代表正数,1代表负数
反码是为了解决减法运算,补码是为了解决反码产生的±0的问题
-0:1000 0000、
-0 就是-128。
于是我们的计算机当中规定-0的补码就是-128在计算机当中的存储方式。这样也可好可以满足计算机当中的计算。
请简述java 128陷阱
答案就在Integet的valueOf()方当中,如果我们的数值在-128-127之间的数值都存储在有一个catch数组当中,
该数组相当于一个缓存,当我们在-128-127之间进行自动装箱的时候,我们就直接返回该值在内存当中的地址,
所以在-128-127之间的数值用进行比较是相等的。而不在这个区间的数,需要新开辟一个内存空间,所以不相等。
float a1 = 0.1f; double a2 =1.0/10; System.out.println(a1
a2); flase
double b1=1212121212121212.0;double b2 =b1+1; System.out.println(b1==b2); ture
PI是double类型的
银行一般由Bigdecimal 浮点型有 舍入误差 接近但不等于
3.
java字符类型采用Unicode字符集编码 16位
数值型和boolean之间不能直接转化。
4.
变量初始化的实质----》拥有了自己的内存空间
在我们java当中变量分为局部变量和全局变量两种
全局变量
全局变量使用来描述我们这个对象当中有什么的(在类中定义和方法同级),作用域是整个对象,有初始值可以不赋值,在该类当中不可以出现拥有相同名称的全局变量;
全局变量的内存空间和值都存储在堆内存当中。
局部变量用来临时保存数据(在类的方法中定义),只能在当前方法中使用,没有初始值,所以必须赋值,在该方法当中不可以出现拥有相同名称的局部变量;
局部变量的内存空间和值都存储在栈内存当中。
关键字final表示这个变量只能被赋值一次。一旦被赋值后,就不需要在更改了。习惯上,常量名使用全大写,被fianl定义的常量一旦赋值就不可以更改。
5.
◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中(new 出来的对象)
  ◆堆:存放用new产生的数据
  ◆静态域:存放在对象中用static定义的静态成员
  ◆常量池:存放常量
6.
重点面试题:
用最快速度计算出2*16的值 用位运算符 2<<4 2^4

注意:static关键字是对类而言的,this关键字是指当前对象,因此staic修饰的方法中不能使用this

final修饰的类不能被继承

父类使用默认无参构造器的时候,子类会隐式susper()调用父类无参构造方法,而题目当中我们在父类当中写了一个有参的构造方法,初始化原则上需要我们子类构造方法中显示super(String s)调用构造方法。

父类静态代码块—》子类静态代码块—》父类动态代码块(父类属性初始化【根据定义顺序】)–》父类构造方法—》子类动态代码块(子类属性初始化【根据定义顺序】)–》子类构造方法

对于 final修饰变量 全局变量必须初始化 局部变量使用时必须初始化
原生类是指基本数据类型
局部变量必须赋值 不然会编译错误 全局变量有初始值 不需要赋值

public class InitializeDemo {
    private static int k = 1;
    private static InitializeDemo t1 = new InitializeDemo("t1");
    private static InitializeDemo t2 = new InitializeDemo("t2");
    private static int i = print("i");
    private static int n = 99;
    {
        print("构造块");
        j=100;

    }
    public InitializeDemo(String str) {
        System.out.println((k++) + ":" + str + "   i=" + i + "    n=" + n);
        ++i;
        ++n;
    }
    static {
        print("静态块");
        n=100;
    }
    private int j = print("j");
    public static int print(String str) {
        System.out.println((k++) + ":" + str + "   i=" + i + "    n=" + n);
        ++n;
        return ++i;
    }
    public static void main(String[] args) {
        System.out.println("123");
        InitializeDemo  n =new InitializeDemo("初始化");
    }
}

在mian 方法中 newDemo(); 去加载Deom的类 就是类加载
类加载只加载一遍 从上往下加载 静态初始化语句 ,静态初始化块 ,静态初始化语句 全是0 null
新对象的创建(new对象)非静态的初始化语句 非静态初始化块
这个静态代码块 在类加载中过程中 是跟上下顺序有关 如果在t1和t2 之间 那就是先执行静态代码块在执行 t2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值