知识点积累 持续更新
JDK与JRE的区别?
JDK:java development kit (java开发工具)
JRE:java runtime environment (java运行时环境)
JDK包含JRE
Java语言跨平台的原理
Java跨平台的特性,也就是同一份字节码文件可以在不同的系统上执行,由不同系统中的Java虚拟机负责翻译成对应的机器指令。
两种类型转换的区别
基本数据类型的两种转换分为自动类型转换和强制类型转换。区分处有2点。
1.自动类型转换也叫隐式类型转换,不需要开发人员干预,程序自动进行操作;强制类型转换也叫显式类型转换,需要开发人员在赋值时使用(结果类型)方式来进行转换;
2.自动类型转换是精度低/范围小的/子类向精度高的/范围大的/父类转换,强制类型转换则相反,比如:int->byte是范围大向范围小转换需要强制,long->float是精度低向精度高转换不需要强制。
数组有没有 length()方法?String 有没有 length()方法?
关键字static用法
static修饰成员方法不能访问类的非静态成员变量和非静态成员方法,static修饰成员变量被所有对象 共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化,static修饰代码块类初次被加载的时候,会按照static块的顺序来依次执行每个static块,并且只会执行一次。
Java中==与equals()的区别
Java中= =是运算符,用于比较两个变量是否相等,而equals是Object类的方法,用于比较两个对象是否相等.默认Object类的equals方法是比较两个对象的地址,此时和= =的结果一样.换句话说:基本类型比较用= =,比较的是他们的值.默认下,对象用==比较时,比较的是内存地址,如果需要比较对象内容,需要重写equal方法
构造器(constructor)是否可被重写(override)
构造器不能被继承,因此不能被重写,但可以被重载。
具体描述一下Java的三大特性
1.封装
封装指的是属性私有化,根据需要提供setter和getter方法来访问属性。即隐藏具体属性和实现细节,仅对外开放接口,控制程序中属性的访问级别。封装目的:增强安全性和简化编程,使用者不必在意具体实现细节,而只是通过外部接口即可访问类的成员。
2.继承
继承是指将多个相同的属性和方法提取出来,新建一个父类。
Java中一个类只能继承一个父类,且只能继承访问权限非private的属性和方法。 子类可以重写父类中的方法,命名与父类中同名的属性。
继承目的:代码复用。
3.多态
多态可以分为两种:设计时多态和运行时多态。
设计时多态:即重载,是指Java允许方法名相同而参数不同(返回值可以相同也可以不相同)。
运行时多态:即重写,是指Java运行根据调用该方法的类型决定调用哪个方法。
多态目的:增加代码的灵活度。
温馨提示:
一.Java中应尽量减少继承关系,以降低耦合度。
二.使用多态时,父类在在调用方法时,优先调用子类的方法。如果子类没有重写父类的方法,则再调用父类的方法。
为什么Java语言的开发者,把String类定义为final的呢?
因为只有当字符串是不可变的,字符串池才有可能实现。字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串。但如果字符串是可变的,那么String interning将不能实现,因为这样的话,如果变量改变了它的值,那么其它指向这个值的变量的值也会一起改变。如果字符串是可变的,那么会引起很严重的安全问题。譬如,数据库的用户名、密码都是以字符串的形式传入来获得数据库的连接,或者在socket编程中,主机名和端口都是以字符串的形式传入。因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子,改变字符串指向的对象的值,造成安全漏洞。
因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串自己便是线程安全的。
因为字符串是不可变的,所以在它创建的时候HashCode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键往往都使用字符串。
启动一个线程是调用run()还是start()方法?
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM 调度并执行,这并不意味着线程就会立即运行。run()方法是线程启动后要进行回调(callback)的方法。
当一个线程进入一个对象的 synchronized 方法 A 之后,其它线程是否可进入此对象的 synchronized 方法 B?
不能。其它线程只能访问该对象的非同步方法,同步方法则不能进入。因为非静态方法上的 synchronized 修 饰符要求执行方法时要获得对象的锁,如果已经进入 A 方法说明对象锁已经被取走,那么试图进入 B 方法的线 程就只能在等锁池(注意不是等待池哦)中等待对象的锁。
常用的线程的创建方式?
1.继承Thread类创建线程
2.实现Runnable接口创建线程
3.使用Callable和Future创建线程
4.使用线程池例如用Executor框架