1:%:任何整数模2不是0就是1,所以只要改变被模数就可以实现开关运算。
2:java分了5片内存。
1:寄存器。2:本地方法区。3:方法区。4:栈。5:堆。
栈:存储的都是局部变量 ( 函数中定义的变量,函数上的参数,语句中的变量 );
只要数据运算完成所在的区域结束,该数据就会被释放。
堆:用于存储数组和对象,也就是实体。啥是实体啊?就是用于封装多个数据的。
1:每一个实体都有内存首地址值。
2:堆内存中的变量都有默认初始化值。因为数据类型不同,值也不一样。
3:垃圾回收机制。
3:AVA中除了RunTimeException类,其他异常均须捕获或抛出。
常见的RunTimeException类(系统异常):NullPointException、
ArrayIndexOutOfBoundsExcepton(数组越界异常)、ClassCastException(强制转换错误)
4:&与&&的区别 | 和 ||的区别
&和&&都是逻辑与的运算符,但&&具有短路功能,当第一个表达式为false时,则不再计算第二
个表达式。
&可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作。
||具有短路功能,当第一个表达式为true时,则不再计算第二个表达式。
5:char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含汉字,所以,
char型变量中可以包含汉字。unicode编码占用两个字节,所以,char类型的变量也占用两个字节。
6:使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容是可以
改变的。final StringBuffer a = new StringBuffer("im");
执行如下将报告编译器错误: a = new StringBuffer("");
执行如下将通过编译:a.append("broken");
7:"=="与equals方法区别
==操作符比较两个变量的值是否相等,两个变量所对应内存中的所存储的数值是否相等。
equals方法用于比较两个独立对象的内容是否相同
String a = new String("foo");
String b = new String("foo");
两条new语句创建了两个对象,然后用a,b
这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的
即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是
相同的, 所以,表达式a.equals(b)将返回true。如果一个类没有自己定义equals方法,它默认
的equals方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否
是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则
总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须
覆盖equals方法
8:静态变量和实例变量的区别
实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用
这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称类变量。
public class VariantTest{
public static int staticVar = 0;
public int instanceVar = 0;
public VariantTest(){
staticVar++;
instanceVar++;
System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);
}
}
9:if(username.equals("zt")){} 若username是null,则会报NullPointException
10:Overload重载,Override重写。
Overload方法相同,参数个数或类型不同。
Override表示子类中的方法与父类中的某些方法的名称和参数完全相同。
也是面向对象编程的多态性的一种表现。
1:返回值一致
2:方法抛出的异常一致
3:被重写的方法不能为private
11:面对对象的特征
1: 封装
目标是实现软件部件的”高内聚、低耦合“,对象是封装的最基本单位。
原则:把对同一事物进行操作的方法和相关的方法放在同一个类中,把方法和它操作的数据放在
同一 个类中。
2: 抽象
抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类。
3: 继承
继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了
软件的可重用性和可扩展性。
4: 多态
一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中
实现的方法,必须在由程序运行期间才能决定。
12:java实现多态的机制
靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象 。
13:内部类可以引用它的包含类的成员,但静态内部类不可以。
calss Outer{
static int x;
static class Inner{
void test(){
syso(x);
}
}
}
14:Java中有几种类型的流?
字节流,字符流。 字节流继承于InputStream OutputStream
字符流继承于InputStreamReader OutputStreamWriter
15:java序列化 Serializable接口作用
我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java对象变成某个格式的字节流再传输,但是,jre本身就提供了这种支持,我们可以调用OutputStream的writeObject方法来做,如果要让java 帮我们做,要被传输的对象必须实现serializable接口,这样,javac编译时就会进行特殊处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化。需要被序列化的类必须实现Serializable接口,该接口是一个mini接口,其中没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的。
例如,在web开发中,如果对象被保存在了Session中,tomcat在重启时要把Session对象序列化到硬盘,这个对象就必须实现Serializable接口。如果对象要经过分布式系统进行网络传输或通过rmi等远程调用,这就需要在网络上传输对象,被传输的对象就必须实现Serializable接口。
16:描述一下JVM加载class文件的原理机制
JVM中类的装载是由ClassLoader和它的子类来实现的,java ClassLoader是一个
重要的java运行时的系统组件。它负责在运行时查找和装入类文件的类。
17:垃圾回收器的基本原理
对于GC,当程序员创建对象时,GC就开始监控这个对象的地址、大小,以及使用情况。
通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。来确定哪些对象是”可达的“
哪些对象是”不可达的“。当GC确定一些对象为”不可达“,时,GC就有责任回收这些内存空间。
垃圾回收期可以马上回收内存,手动执行System.gc(),通知GC运行,但java语言规范并不保证GC一定执行
18:构造器Constructor是否可被override?
构造器不能被继承,因此不能重写override,但可以被重载overload。