1.short byte char 在做运算时,先自动转化成int类型,再进行计算
2.this关键字:在java中,this通常指谁调用这个方法,这个方法中的this就指向谁。
3.java允许省略同一对象方法之间调用时的this关键字,但是虽然省略this是依然存在
4.java不能用静态方法调用非静态方法(不能访问任何非静态资源),因为被static修饰的方法是属于这个类的而不属于某个特定的对象。
5.在java中只有值传递,所谓值传递就是将实际参数值的副本(复制品)传入方法内,而参数本身不会受到任何影响。不管方法中对传入参数进行怎样的操作
,实际参数都不会受到影响。
6.new 出来的东西存放在堆内存中。
7.java机制在new对象之前首先是要加载类的,如果先不把类加载到内存,怎样来通过类new出对象
8.在java中,成员变量不需要显示的初始化,java自动会进行初始化,但是局部变量需要程序员进行显示的初始化
9.不同对象访问被static修饰的资源是总是访问的是同一个资源,因为静态资源是不存在于某个对象的堆内存中的
10.局部变量不属于某个特定的对象,他只有在程序运行时被分配空间,并且被存储在栈内存中。
11.栈内存中的变量不需要系统垃圾回收,往往会随方法或者代码块的结束而结束
12.java虚拟机相当于一个虚拟的计算机,他也有自己的内存机制和各个管理机制
13.当我们调用java命令运行某个java程序时,该命令将会启动一个java虚拟机进程,不管该java程序有多么复杂,该进程启动了多少个线程,他们都处于该JVM的进程里,,同一个JVM的所有线程、所有变量都处于同一个进程里,他们都使用该JVM进程的内存区。
14.java在运行main方法时会开启一个进程,所以在每次运行main方法时都会开启不同的进程。一个java程序从main开始之后,进程启动,为整个程序提供各种资源,而此时将启动一个线程,这个线程就是主线程,它将调度资源,进行具体的操作.所以资源只有在同一进程中才能共享。
15.由于构造器是Java中构建对象的重要途径,所以当程序员不为某一个类编写构造器时Java机制会默认该类存在一个无参构造器,如果程序员为某个类编写了有参构造器则Java机制不会默认存在无参构造器。通常建议为Java类保留五参数默认构造器。因此,如果为一个类编写了有参构造器,则通常建议为该类额外提供一个无参数构造器
16.接口和抽象类的区别和相同点
相同点:接口和抽象类都是抽象的,因此都不能实例化。接口中可以没有方法,抽象类中可以没有抽象方法。
区别:接口中只有方法声明,不存在方法实现,但是抽象类中可能存在实现的方法(有方法体的方法)。
17.垃圾回收
垃圾回收主要针对的是堆区的回收,因为栈区的内存是随着线程而释放的。堆区分为三个区:年轻代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation,也就是方法区)。
年轻代:对象被创建时(new)的对象通常被放在Young(除了一些占据内存比较大的对象),经过一定的Minor GC(针对年轻代的内存回收)还活着的对象会被移动到年老代(一些具体的移动细节省略)。
年老代:就是上述年轻代移动过来的和一些比较大的对象。Minor GC(FullGC)是针对年老代的回收
永久代:存储的是final常量,static变量,常量池。
18.接口中也可以包含域,但是这些与隐式的是static和final。 接口中只有常量定义,没有变量声明。
19.IO流
20.abstract类的子类可以实现超类所以的抽象方法,也可以实现超类的部分抽象方法如果超类还有抽象方法未被子类实现,那么该子类也是abstract的
21.容器
22.构造器是不存在任何返回值的,包括void
23.String和StringBuffer的区别
public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operator(a, b);
System.out.println(a + "," + b);
}
public static void operator(StringBuffer x, StringBuffer y) {
x.append(y); y = x;
}
}
//print:AB,B
public class Test {
public static void main(String[] args) {
String a = new String("A");
String b = new String("B");
operator(a, b);
System.out.println(a + "," + b);
}
public static void operator(String x, String y) {
x+=y; y = x;
}
}
//print:A,B
不管是String还是StringBuffer在JAVA中都只有引用传递,所以在本题中传入operator(StringBuffer x, StringBuffer y)中的都是copy的引用,因此y=x知识改变了y变量的值,并不能改变b的值。但是需要注意的是StringBuffer和String不一样的地方时,StringBuffer是可变的,改变它是并不会每次都重新copy一个对象,而是操作原对象。
一句话总结: x.append(y)操作了堆内存,而 y = x只是简单的修改了栈内存中的y变量的值。
附加:String对象是不可变的。查看jdk文档你就会发现,String类中每一个方法看起来会修改String值得方法,实际上都是创建了一个全新的String对象,以包含修改后的字符串的内容。而最初的String对象则丝毫未动。
24.Integer
print:false,false,true
解析:
其实当我们在为Integer赋值的时候,java编译器会将其翻译成调用valueOf()方法。比如Integer i=127翻译为Integer i=Integer.valueOf(127)
然后我们来看看valueOf()函数的源码:
1 2 3 4 5 6 7 8 |
|
可以看出,对于-128到127之间的数,Java会对其进行缓存。而超出这个范围则新建一个对象。
所以现在回到这道问题
i1和i2为128,超出范围,所以都需要新建对象,对象比较为false;
i5和i6为100,在范围之内,在执行Integer i5=100时,就会直接缓存到内存中,但执行执行Integer i6=100时,就直接从缓存里取,而不需要新建对象,所以为true。