1.局部变量和成员变量的区别?
1)定义位置:局部变量只定义局部范围内(如:函数或语句中),而成员变量定义在类中,
2)作用范围:局部变量只在函数类有效。成员变量在整个类中都可以被访问。
3)存储位置:局部变量存在于栈内存中,成员变量随着对象的建立而建立,存储在对象所在的堆内存中。
4)初始化:局部变量没有初始化值,而成员变量有默认的初始化值。
5)生命周期:局部变量在其作用的范围结束,变量空间会自动释放。成员变量当没有栈空间引用对象堆空间时,JVM会自动回收。
2.Java中的数据类型、默认值、大小?
基本数据类型(8种)
数值型
1)整型:byte short int long
2)浮点型:float double
字符型 char
布尔型 boolean
引用数据类型:
String
数组
类
接口等
默认值?
整型默认为0,浮点型默认为0.0,char型默认为'\u0000',boolean型默认为false.所有引用类型默认为null。
注意:默认值在主方法中无效。整数默认为int,小数默认为double。
数据大小?
由小到大依次是:boolean<byte<char=short<int=float<long=double
注意:boolean只占一位,char类型占两字节。short和char占两个字节,int和float占4字节,long和double占8个字节。
所有数值型数据类型中,double可以保存的数字是最大的。
3.转义字符
换行:\n
制表符:\t
单引号:\'
双引号:\"
4.逻辑运算符
与(&、&&)、或(|、||)、非(!)
注意:&和&&的区别?以及|和||的区别
当使用&时,要对所有条件进行判断。即使有一个条件返回false,剩下的条件仍然要判断;而&&,只要有一个条件返回false,
剩下的条件就不再判断了,返回false。|和||同样如此
5.Java中switch语句后面判断的数据类型?
从JDK1.7版本有的,数字、枚举、字符和字符串。case的内容不能是变量或表达式,只能是常量。
6.方法重载--针对两个或两个以上的方法而言。
定义:方法名称相同,而参数的类型或个数不同,返回值类型也相同。
方法签名:方法名和方法参数,返回类型不是方法签名的一部分。
eg:public int add(int x,int y); add(int x,int y)是方法签名
注意:在进行方法重载的时候,方法的返回值类型一定要相同!!
7.方法递归
定义:一个方法自己调用自己的过程。
特点:1)方法必须有递归的结束条件。2)方法在每次递归处理的时候一定要做出一些变更。
8.数组引用空间
同一块堆内存空间可以由不同的栈内存空间所引用。
9.数组的初始化
一维数组
动态初始化: 数据类型[] 数组名=new 数据类型[数组长度];//数组中的元素会被初始化为0
静态初始化: 完整形式:数据类型[] 数组名=new 数据类型[数组长度]{数组各元素的值}
简化形式:数据类型[] 数组名={数组各元素的值}
二维数组
动态初始化:数据类型[][] 数组名=new 数据类型[行数][列数]
静态初始化:数据类型[][] 数组名=new 数据类型[][]{{值,值,值},{值,值,值},{值,值,值}}
二维数组的说明:数组名.length--数组的行数 数组名[x].length--数组的列数
对象数组
动态初始化:格式:类名[] 对象数组名=new 类名[]{对象1,对象2,。。。。}
静态初始化:格式:类名[] 对象数组名=new 类名[对象数组长度];
匿名数组
new 数据类型[]{v1,v2,v3,......}
10.Java提供的一些和数组有关的方法
排序(升序):
java.util.Arrays.sort(数组名)
复制:
System.array.copy(源数组名,源数组起始点(下标),目标数组名,目标数组起始点,拷贝长度)
Arrays.copyof(源数组名,拷贝长度) eg:int[] b=Arrays.copyof(a,a.length)
11.Java数组复制方法的效率分析
复制方法有:Arrays.copyOf()、for循环、System.arraycopy、使用clone()
System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length)为native方法,即原生态方法。关键字为native,说明它不是用Java语言写的,而是调用其它语言的代码,因此效率最高。
clone的方法。Object.clone,从源码来看也是native方法,所以也是底层的C语言实现的,但返回类型为Object类型,需要
强转,故效率不如System.arraycopy。
Arrays.copyOf()实际上调用System.arraycopy(),故效率也不如System.arraycopy。
for循环效率最低。
12.面向对象三大特征?分别是什么意思?
三大特征为封装、继承和多态。下面从概念、作用和实现的角度回答分别是什么意思的问题。
封装:即内部操作对外部不可见。作用:保护性。实现方式:private、内部类和final。如:客户通过银行提供的接口取钱。
继承:即子类无需重复编写代码的情况下就拥有父类的所有属性和方法。作用:实现代码的复用性,不用重复写代码。实现方式:extends(单继承、满足is-a原则)如:汽车分为多种。
多态:一个类实例的相同方法在不同的情形下有不同的表现形式。作用:可以得到更好的设计,使程序具有灵活性。实现:方法覆写和对象的向上转型。如:饮品的制作方法大体相同,但是红茶和绿茶的制作过程有所差异。(一个放红茶,一个放绿茶)
13.匿名对象
使用格式:
new 类名().方法名()或new 类名().属性
注意:匿名对象使用一次就会变为垃圾空间!!(因为没有栈空间对它进行引用)
14.this、super、final和static关键字
this:
调用本类的属性或方法,或指当前对象。 this.方法名()或this.属性名 注意:在构造方法中调用其它的构造方法时,this();要放在方法体首行。
super:
调用父类的方法或属性。super.方法名()或super.属性 在对子类实例化对象时,如果没有调用父类的有参构造,系统就会自动调用无参构造,如果父类没有,那么会造成编译出错。
final:
终结器。被final修饰的变量值不能被修改;被final修饰的类不能被继承;被final修饰的方法不能被覆写。
static:
类属性 所有的对象引用同一段内存(属性或方法) 被static修饰的属性或方法可以直接通过类名.属性/方法名()访问。一改全改。
注意:所有的静态方法都不能访问非static定义的属性或方法。所有的非静态方法都可以访问static方法或属性。
15.引用传递分析
本质:一块堆内存可以被多个栈空间所指向。
垃圾空间:没有任何栈内存指向的堆内存空间。所有的垃圾空间会不定期GC,GC会影响性能。
16.为什么构造方法没有返回值,也不返回void?
构造方法是用来初始化一个对象的。在创建对象的时候,会自动地调用构造方法。因此,不需要返回值。从编译器的角度,编译器是根据程序结构来区分普通方法和构造方法的,所以在构造方法前没有返回值。
17.main函数为什么是静态的(为什么被static修饰)?
main()被static所修饰,属于类方法,可以直接被调用。一般的方法必须在实例化对象后才能调用。如果main()不是静态方法,则需要先定义对象,再由对象调用这个方法。而定义对象又要在主方法中执行。这就产生了先是鸡生蛋,还是蛋生鸡的问题。因此main()必须是静态的。
18.代码块
定义:使用“{}”定义的一段代码。
分类:
普通代码块:在方法中定义的块。
构造块:在类中定义的代码块,不加任何修饰符。
构造块优先于构造方法执行
静态块:被static修饰的代码块 。
在主类中定义的静态块,优先于主方法执行。在非主类中定义的在类加载时执行,优先于构造块执行。
同步块:被synchronized修饰的代码块。解决不同步问题,锁定一个对象,确保进入同步代码块的线程某一时刻只有一个,使线程依次执行。
构造块和静态块的说明:实例多个对象时,每实例化一个对象,构造块就执行一次。不论实例化多少个对象,静态块只执行一次。
19.多个代码块的执行顺序
主类中的静态块-主方法依次执行-父类的静态块-子类的静态块--父类的构造块、构造方法--子类的构造块、构造方法--父类的构造块、构造方法--子类的构造块、构造方法。
如果子类和父类都是主类,主方法在子类中,则先执行父类的静态块--子类静态块--子类主方法--.....。如果主方法在父类中,则执行顺序为:父类静态块--主方法--实例化子类对象时执行子类静态块--父类构造块、构造方法--子类构造块、构造方法--......。
每实例化一个对象,父类的构造块、构造方法和子类的构造块、构造方法都要执行一次。
20.方法重写
定义:方法名和参数名都相同。用于子类继承父类时,对父类的方法进行重写。
注意:被覆写的方法不能拥有比父类更为严格的访问控制权限。(访问权限:public>protected>default>private)
21.方法重写和方法重载的区别
1)概念上:方法重写方法名和参数列表以及返回值类型都相同。方法重载是方法名和返回值类型相同,但是参数列表不同。
2)范围:重载用于在一个类中,而覆写用于子类继承父类时。
3)权限:重载没有限制。而覆写要求子类中被覆写的方法不能拥有比父类更为严格的访问控制权限。