大家好,我是
方圆
,您说,咱不得把这基础知识办的明明白白的?
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。
Java程序经过一次编译后,即可在多个系统平台上运行。
实现原理,Java程序运行在JVM上,系统只要安装了JVM,那么即可运行Java程序。
字节码是Java源代码经过JVM编译后产生的.class文件,面向JVM
好处: 运行起来比较高效,并且实现了跨平台性
Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加 0.5 然后进行下取整。
Java采用的是Unicode编码标准
final可以修饰类、方法和变量
将一个对象的属性私有化,并且提供一些可以被外界访问的方法
子类以父类为基础,可以增加新得数据或扩展
百度百科:在面向对象语言中,接口的多种不同的实现方式即为多态。更好理解就是:你可以把父对象设置成它的子对象,根据实际的对象进行操作,再简单就是可以将子类赋值给父类。
大家可以参考下面这篇文章
接口和抽象类的不同,就像你和我的不同一样
当然是大大的不能了!定义出抽象类就是准备要被其他类继承的,如果被final修饰了这不就自我矛盾了嘛!
帮助子类完成初始化工作。
public class Outer {
private static int radius = 1;
private int count =2;
class Inner {
public void visit() {
System.out.println("visit outer static variable:" + radius);
System.out.println("visit outer variable:" + count);
}
}
}
成员内部类可以访问外部类的所有变量和方法,不论静态与非静态,公有和私有。成员内部类依赖于外部类的实例,它的创建方式如下
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.visit();
public class Outer {
private static int radius = 1;
static class StaticInner {
public void visit() {
System.out.println("visit outer static variable:" + radius);
}
}
}
静态内部类可以访问外部类所有的静态变量,而不可以访问外部类的非静态变量;静态内部类的创建方式如下
Outer.StaticInner inner = new Outer.StaticInner();
inner.visit();
public class Outer {
private int out_a = 1;
private static int STATIC_b = 2;
public void testFunctionClass(){
int inner_c =3;
class Inner {
private void fun(){
System.out.println(out_a);
System.out.println(STATIC_b);
System.out.println(inner_c);
}
}
Inner inner = new Inner();
inner.fun();
}
public static void testStaticFunctionClass(){
int d =3;
class Inner {
private void fun(){
//编译错误,定义在静态方法中的局部类不可以访问外部类的实例变量
// System.out.println(out_a);
System.out.println(STATIC_b);
System.out.println(d);
}
}
//局部内部类创建对象的方式
Inner inner = new Inner();
inner.fun();
}
}
定义在实例方法中的局部内部类可以访问外部类的所有变量和方法,定义在静态方法中的局部内部类只能访问外部类的静态变量和方法。
public class Outer {
private void test(final int i) {
new Service() {
public void method() {
for (int j = 0; j < i; j++) {
System.out.println("匿名内部类" );
}
}
}.method();
}
}
//匿名内部类必须继承或实现一个已有的接口
interface Service{
void method();
}
匿名内部类的特点
匿名内部类的创建方式
new 类/接口{
//匿名内部类实现部分
}
public class Outer {
void outMethod(){
final int a =10;
class Inner {
void innerMethod(){
System.out.println(a);
}
}
}
}
因为生命周期不一致, 局部变量直接存储在栈中,当方法执行结束后,非final的局部变量就被销毁。而局部内部类对局部变量的引用依然存在,如果局部内部类要调用局部变量时,就会出错。加了final,可以确保局部内部类使用的变量与外层的局部变量区分开,解决了这个问题。
构造器可以重载,不能被重写
我们以向HashSet中插入值,检查重复为例子,HashSet会计算对象的哈希值来确定它的位置,同时也会将其哈希值与其他的对象做比较,如果没有一样的,那么HashSet会认为新加入的对象没有重复;若发现了它的哈希值和其他对象相同,那么会调用equals方法再比较它们的内容是否一致,若不同,则添加成功,否则认为对象重复,添加失败。这样可以减少equals的执行次数,加快效率。
所以,equals方法被重写,hashCode方法也要被重写。
Java语言总是采用按值调用。也就是说,方法得到的是值的拷贝。
大家有时间可以看一下这篇文章
注解和反射详解
字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块儿内存空间存储相同的字符串。在创建字符串的时候,JVM会首先检查字符串常量池,如果该字符串已经在常量池中,则返回它的引用,否则创建一个新的字符串加入到常量池中。
String底层是char类型的数组。
我们不妨看一下源码
/** The value is used for character storage. */
private final char value[];
大大的眼睛有没有看见final修饰?
而且String类是被final修饰的,不能被继承
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
不一样啊。String str="i"是将字符串分配到常量池中;String str=new String(“i”)是将其分配到了堆中。
因为String是不可变的类型,所以它的hashCode不会改变,这样就相比于其他类型的对象更好。
Java基础知识面试题(2020最新版)
笔者水平有限,还需大家批评指正,共同进步!