概述
1.逻辑运算
与 或 非 异或 & | ~ ^ (异或:相同为0;不同为1)
2.权限修饰符号
protected 可访问范围大于 默认
3. 双引号是字符串 单引号是字符
4. 字符串是否相同用equals 比较引用地址用
5. java 栈 stack
进栈 push
出栈pop返回栈顶值
获取栈顶值peak
判断为空empty
查询num是否在栈中search(num),如果在返回1,不在返回-1。
https://blog.csdn.net/imbingoer/article/details/85884474
6.float f = 0.1 报错?
整数默认为int 小数默认为double
7.System.out.println(0.1*3==0.3) false?
十进制小数转二进制小数时存在误差(乘2取整,顺序排列)
8.final 关键字
类:不可继承 方法:可以被继承 不能被子类覆盖 成员变量:只能被赋值一次
9.java只有值传递
https://blog.csdn.net/bntx2jsqfehy7/article/details/83508006
10.原码、补码、反码
https://blog.csdn.net/chenchao2017/article/details/79733278
11.Java 子类重写(覆盖)父类的方法必须满足的条件
里氏替换原则
子类可以继承父类的一切方法,成员变量,甚至是私有的,但是却不能够访问这些私有的成员变量和方法
https://www.jianshu.com/p/6ceb4c581d3b
12.Cglib 和 jdk动态代理
cglib继承类 jdk基于接口代理
https://blog.csdn.net/yhl_jxy/article/details/80633194
https://baijiahao.baidu.com/s?id=1615034709376787673&wfr=spider&for=pc
13.Volatile关键字
保证不进行指令重排
14.泛型
https://www.cnblogs.com/xunzhi/p/5683709.html
15.枚举
http://c.biancheng.net/view/1100.html
16.数据类型
基本类型:
byte/8 short/16 int/32 long/64 float/32 double/64 boolean/? char/16
缓存池
new Integer(123) 与 Integer.valueOf(123) 的区别在于:new Integer(123) 每次都会新建一个对象;Integer.valueOf(123) 会使用缓存池中的对象,多次调用会取得同一个对象的引用。
编译器会在自动装箱过程调用 valueOf() 方法,在使用这些基本类型对应的包装类型时,如果该数值范围在缓冲池范围内,就可以直接使用缓冲池中的对象。Integer 的缓冲池 IntegerCache 很特殊,这个缓冲池的下界是 - 128,上界默认是 127,但是这个上界是可调的
17.String
不可变的好处
可以缓存 hash 值,String Pool 的需要,线程安全,安全性
String, StringBuffer and StringBuilder
- 可变性
String 不可变
StringBuffer 和 StringBuilder 可变 - 线程安全
String 不可变,因此是线程安全的
StringBuilder 不是线程安全的
StringBuffer 是线程安全的,内部使用 synchronized 进行同步
String Pool
Jdk6中常量池位于PermGen(永久代)中,PermGen是一块主要用于存放已加载的类信息和字符串池的大小固定的区域。执行intern()方法时,若常量池中不存在等值的字符串,JVM就会在常量池中创建一个等值的字符串,然后返回该字符串的引用。
Jdk7将常量池从PermGen区移到了Java堆区,执行intern操作时,如果常量池已经存在该字符串,则直接返回字符串引用,否则复制该字符串对象的引用到常量池中并返回。
https://blog.csdn.net/u013366617/article/details/83618361
https://blog.csdn.net/u011635492/article/details/81048150
18.运算
参数传递
Java 的参数是以值传递的形式传入方法中,而不是引用传递,以下代码中 Dog dog 的 dog 是一个指针,存储的是对象的地址。在将一个参数传入一个方法时,本质上是将对象的地址以值的方式传递到形参中。
https://www.zhihu.com/question/31203609/answer/50992895
float和double
Java 不能隐式执行向下转型,因为这会使得精度降低。
1.1 字面量属于 double 类型,不能直接将 1.1 直接赋值给 float 变量,因为这是向下转型。
// float f = 1.1; error
1.1f 字面量才是 float 类型。
float f = 1.1f;
隐式类型转换
因为字面量 1 是 int 类型,它比 short 类型精度要高,因此不能隐式地将 int 类型向下转型为 short 类型。
short s1 = 1;
// s1 = s1 + 1;
但是使用 += 或者 ++ 运算符会执行隐式类型转换。
s1 += 1;
s1++;
上面的语句相当于将 s1 + 1 的计算结果进行了向下转型:
s1 = (short) (s1 + 1);
switch
从 Java 7 开始,可以在 switch 条件判断语句中使用 String 对象。
switch 不支持 long,是因为 switch 的设计初衷是对那些只有少数几个值的类型进行等值判断,如果值过于复杂,那么还是用 if 比较合适。
19.关键字
final
- 数据 声明数据为常量,可以是编译时常量,也可以是在运行时被初始化后不能被改变的常量。对于基本类型,final 使数值不变;对于引用类型,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。
- 方法 声明方法不能被子类重写。private 方法隐式地被指定为 final,如果在子类中定义的方法和基类中的一个 private 方法签名相同,此时子类的方法不是重写基类方法,而是在子类中定义了一个新的方法。
- 类 声明类不允许被继承
static
- 静态变量 静态变量:又称为类变量,也就是说这个变量属于类的,类所有的实例都共享静态变量,可以直接通过类名来访问它。静态变量在内存中只存在一份。实例变量:每创建一个实例就会产生一个实例变量,它与该实例同生共死。
- 静态方法 静态方法在类加载的时候就存在了,它不依赖于任何实例。所以静态方法必须有实现,也就是说它不能是抽象方法。只能访问所属类的静态字段和静态方法,方法中不能有 this 和 super 关键字,因此这两个关键字与具体对象关联。
- 静态语句块 静态语句块在类初始化时运行一次
- 静态内部类 非静态内部类依赖于外部类的实例,也就是说需要先创建外部类实例,才能用这个实例去创建非静态内部类。而静态内部类不需要。静态内部类不能访问外部类的非静态的变量和方法。
- 初始化顺序 静态变量和静态语句块优先于实例变量和普通语句块,静态变量和静态语句块的初始化顺序取决于它们在代码中的顺序。最后才是构造函数的初始化。存在继承的情况下,初始化顺序为:
父类(静态变量、静态语句块)
子类(静态变量、静态语句块)
父类(实例变量、普通语句块)
父类(构造函数)
子类(实例变量、普通语句块)
子类(构造函数)
20.Object 通用方法
hashCode() 返回哈希值,而 equals() 是用来判断两个对象是否等价。等价的两个对象散列值一定相同,但是散列值相同的两个对象不一定等价,这是因为计算哈希值具有随机性,两个值不同的对象可能计算出相同的哈希值。
在覆盖 equals() 方法时应当总是覆盖 hashCode() 方法,保证等价的两个对象哈希值也相等。
HashSet 和 HashMap 等集合类使用了 hashCode() 方法来计算对象应该存储的位置,因此要将对象添加到这些集合类中,需要让对应的类实现 hashCode() 方法。
浅拷贝 拷贝对象和原始对象的引用类型引用同一个对象。
深拷贝 拷贝对象和原始对象的引用类型引用不同对象
21.继承
访问权限 如果子类的方法重写了父类的方法,那么子类中该方法的访问级别不允许低于父类的访问级别。这是为了确保可以使用父类实例的地方都可以使用子类实例去代替,也就是确保满足里氏替换原则。
抽象类与接口 从设计层面上看,抽象类提供了一种 IS-A 关系,需要满足里式替换原则,即子类对象必须能够替换掉所有父类对象。而接口更像是一种 LIKE-A 关系,它只是提供一种方法实现契约,并不要求接口和实现接口的类具有 IS-A 关系。
从使用上来看,一个类可以实现多个接口,但是不能继承多个抽象类。
接口的字段只能是 static 和 final 类型的,而抽象类的字段没有这种限制。
接口的成员只能是 public 的,而抽象类的成员可以有多种访问权限。
从 Java 8 开始,接口也可以拥有默认的方法实现,这是因为不支持默认方法的接口的维护成本太高了。
22.异常
Throwable 可以用来表示任何可以作为异常抛出的类,分为两种: Error 和 Exception。其中 Error 用来表示 JVM 无法处理的错误,Exception 分为两种:
受检异常 :需要用 try…catch… 语句捕获并进行处理,并且可以从异常中恢复;
非受检异常 :是程序运行时错误,例如除 0 会引发 Arithmetic Exception,此时程序崩溃并且无法恢复
23.Java 与 C++ 的区别
Java 是纯粹的面向对象语言,所有的对象都继承自 java.lang.Object,C++ 为了兼容 C 即支持面向对象也支持面向过程。
Java 通过虚拟机从而实现跨平台特性,但是 C++ 依赖于特定的平台。
Java 没有指针,它的引用可以理解为安全指针,而 C++ 具有和 C 一样的指针。
Java 支持自动垃圾回收,而 C++ 需要手动回收。
Java 不支持多重继承,只能通过实现多个接口来达到相同目的,而 C++ 支持多重继承。
Java 不支持操作符重载,虽然可以对两个 String 对象执行加法运算,但是这是语言内置支持的操作,不属于操作符重载,而 C++ 可以。
Java 的 goto 是保留字,但是不可用,C++ 可以使用 goto。
面向对象与面向过程的本质的区别
五子棋 蛋炒饭/盖饭
最后
以上就是合适云朵为你收集整理的java 基础知识的全部内容,希望文章能够帮你解决java 基础知识所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复