每日一点Java基础小知识 — day8
欢迎来到叮当猫学编程的Java基础小知识系列~在这里,你将会看到叮当猫每日关于Java的基础知识总结,欢迎大家的点赞关注喔
-
子类想要访问父类中的方法:
- 子类构造函数调用父类构造函数用super
- 子类重写父类方法后,若想调用父类中被重写的方法,用super
- 未被重写的非私有方法可以直接调用
-
接口与抽象类的区别:
- 接口的方法默认为public abstract,接口中的变量默认为public static final,在java8之前所有的方法不能有实现,抽象类中可以有非抽象方法
- 一个类可以实现多个接口,但只能继承一个抽象类
- 一个类实现接口,要实现该接口的所有抽象方法
- 接口不能被实例化,可以声明,但是必须引用一个实现该接口的对象
- 抽象类可以有构造方法,但是不能被直接通过new进行实例化,可以通过子类继承,实例化子类的时候抽象类也会被实例化。这其实用到了多态,向上转型。父类引用指向子类对象
- 从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范
-
通俗的讲,就是基本数据类型和包装类之间的转换。如:int 类型和 Integer 类的转换。基本数据类型转化成包装类是装箱 (如: int --> Integer)、包装类转化成基本数据类型就是拆箱(如:Integer --> int)
通过 装箱 和 拆箱 操作,能够在值类型和引用类型中架起一做桥梁。换言之,可以轻松的实现值类型与引用类型的互相转换,装箱和拆箱能够统一考察系统,任何类型的值最终都可以按照对象进行处理
装箱——值类型转换为引用类型;拆箱——引用类型转换为值类型;包装类就是引用类型,基本数据类型就是值类型
-
被static修饰的变量称为静态变量,静态变量属于整个类,而局部变量属于方法,只在该方法内有效,所以static不能修饰局部变量,即在方法中不能使用static来修饰变量,如:
public class Test { public static void main(String args[]) { static int z=2; // error System.out.println(x+y+z); } }
-
运算符“>>”执行算术右移,它使用最高位填充移位后左侧的空位。右移的结果为:每移一位,第一个操作数被2除一次,移动的次数由第二个操作数确定。逻辑右移或叫无符号右移运算符“>>>“只对位进行操作,没有算术含义,它用0填充左侧的空位
算术右移不改变原数的符号,而逻辑右移不能保证这点
-
线程安全的map:HashTable,SynchronizedMap,ConcurrentHashMap
Hashtable的方法都是synchrnized修饰的线程安全,ConcurrentHashMap并发容器,JDK7采用分段锁,JDK8采用CAS算法,线程安全,建议使用,Connections工具类提供了一个方法synchrnizedMap可以把Map同步,本质就是给每一个方法加上synchrnized关键字进行同步
-
题目:
String s=null;
下面哪个代码片段可能会抛出NullPointerException?
A. if((s!=null)&(s.length()>0)) B. if((s!=null)&&(s.length()>0)) C. if((s==null)|(s.length()==0)) D. if((s==null)||(s.length()==0))
答案:AC
s为null,因此只要调用了s.length()都会抛出空指针异常。因此这个题目就是考察if语句的后半部分会不会执行
A,单个与操作的符号& 用在整数上是按位与,用在布尔型变量上跟&&功能类似,但是区别是无论前面是否为真,后面必定执行,因此抛出异常
B,与操作,前半部分判断为假,后面不再执行
C,这里跟 & 和&& 的区别类似,后面必定执行,因此抛出异常
D,或语句,前面为真,整个结果必定为真,后面不执行
-
实现线程的方式有:
- 继承Thread类,重现run()方法
- 实现Runable接口,实现run()方法
- 实现Callable接口,线程结束后有返回值
-
HashSet 内部使用 Map 保存数据,即将 HashSet 的数据作为 Map 的 key 值保存,这也是 HashSet 中元素不能重复的原因。而 Map 中保存 key 值前,会去判断当前 Map 中是否含有该 key 对象,内部是先通过 key 的 hashCode,确定有相同的 hashCode 之后,再通过 equals 方法判断是否相同
-
jsp中有四个域对象,从小到大分别为:
- page域:在同一个jsp页面中数据有效
- request域:在同一个请求中数据有效
- session域:在同一个会话中数据有效
- application域:在同一个网站中数据有效
-
synchronized 关键字:用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这个段代码
volatile:用来确保将变量的跟新操作通知到其他线程,当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。然而,在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比 synchronized关键字更轻量级的同步机制
serialize:Java 对象序列化为二进制文件
static关键字:static关键字可以修饰变量,方法,静态代码块
-
匿名内部类的创建格式为:
new 父类构造器(参数列表)|实现接口(){ //匿名内部类的类体实现 }
- 使用匿名内部类时,必须继承一个类或实现一个接口
- 匿名内部类由于没有名字,因此不能定义构造函数(由于构造器的名字必须与类名相同,而匿名类没有类名,所以匿名类不能有构造器)
- 匿名内部类中不能含有静态成员变量和静态方法