if和switch的异同之处
相同之处: 都是分支语句,多超过一种的情况进行判断处理。
不同之处: switch更适合用于多分支情况,就是有很多种情况需要判断处理,判断条件类型单一。
只有一个入口,在分支执行完后(如果没有break跳出),不加判断地执行下去; 而if—elseif—else多分枝主要适用于分支较少的分支结构,判断类型不是单一,只要一个分支被执行后,后边的分支不再执行。
switch为等值判断(不允许比如>= <=),而if为等值和区间都可以,if的使用范围大。
while和do-while循环的区别
答:while先判断后执行,第一次判断为false , 循环体一次都不执行。
do while先执行 后判断,最少执行1次。
如果while循环第一次判断为true, 则两种循环没有区别。
break和continue的作用
回答:break:
结束当前循环并退出当前循环体。break还可以退出switch语句。
continue:
循环体中后续的语句不执行,但是循环没有结束,继续进行循环条件的判断(for循环还会i++)。continue只是结束本次循环。
请写出冒泡排序代码
public class Bubble {
public int[] sort(int[] array) {
int temp = 0;
// 外层循环,它决定一共走几趟 //-1为了防止溢出
for (int i = 0; i < array.length - 1; i++) {
int flag = 0; //通过符号位可以减少无谓的比较,如果已经有序了,就退出循环
//内层循环,它决定每趟走一次
for (int j = 0; j < array.length - i - 1; j++) {
//如果后一个大于前一个,则换位
if (array[j + 1] > array[j]) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
flag = 1;
}
}
if(flag == 0){
break;
}
}
return array;
}
public static void main(String[] args) {
Bubble bubble = new Bubble();
int[] array = {2,5,1,6,4,9,8,5,3,1,2,0};
int[] sort = bubble.sort(array);
for (int num:sort){
System.out.print(num+"\t");
}
}
}
this和super关键字的作用
回答:this是对象内部指代自身的引用,同时也是解决成员变量和局部变量同名问题;this可以调用成员变量,不能调用局部变量;
this也可以调用成员方法,但是在普通方法中可以省略this,在构造方法中不允许省略,必须是构造方法的第一条语句。
而且在静态方法当中不允许出现this关键字。
super代表对当前对象的直接父类对象的引用。
super可以调用直接父类的成员变量(注意权限修饰符的影响,比如不能访问private成员)
super可以调用直接父类的成员方法(注意权限修饰符的影响,比如不能访问private成员);
super可以调用直接父类的构造方法,只限构造方法中使用,且必须是第一条语句。
递归应用题
题目 : 使用递归算法输出某个目录下及其子目录下所有文件.
递归 : 自动调用自己 , 需要定义递归出口.
public class ShowFile {
/*
静态私有化方法的特点:
1. 方法只能在类内部使用。
2. 性能提高,静态的函数无需检测this指针是否为空。
(一般函数的第一个参数是对象本身,而静态的可以为null,不需要额外的检查)
*/
private static void test(String path) {
//list()方法是返回某个目录下的所有文件和目录的文件名,返回的是String数组
//listFiles()方法是返回某个目录下所有文件和目录的绝对路径,返回的是File数组
File f = new File(path);
File[] fs = f.listFiles();
//如果没有文件,返回空;
if (fs == null) {
return;
}
//递归遍历输出
for (File file : fs) {
//如果是文件就直接打印出来,否则就递归循环
if (file.isFile()) {
System.out.println(file.getPath());
} else {
test(file.getPath());
}
}
}
public static void main(String[] args) {
String path = "E:\\XXX\\xxx";
test(path);
}
}
给定以下代码,程序将输出 ()
class A {
public A(){
System.out.print("A");
}
}
class B extends A{
public B(){
System.out.print("B");
}
public static void main(String[] args) {
B b=new B();
}
}
A 不能通过编译
B. 通过编译,输出AB
C. 通过编译,输出B
D. 通过编译,输出A
答案:B
分析:在继承关系下,创建子类对象,先执行父类的构造方法,再执行子类的构造方法。
下列关于关键字的使用说法错误的是()
A. abstract不能与final并列修饰同一个类
B. abstract类中可以有private的成员
C. abstract方法必须在abstract类中
D. static方法能处理非static的属性
答案:D
分析:因为static
得方法在装载class
得时候首先完成,比构造方法早,此时非static
得属性和方法还没有完成初始化所以不能调用。
面向对象的特征有哪些方面?请用生活中的例子来描述。
面向对象的三大特征: 封装、继承、多态。
举例:
比如设计一个游戏:
我建了一个对象,叫人。 属性 : 性别,年龄,职业,等级,血量 方法 : 逃跑,吃饭,睡觉,死。
我现在创建了一个对象,名叫战士。 战士的属性 : 性别,年龄,职业,等级,战斗力,血量。 它的方法 : 战斗,逃跑,吃饭,睡觉,死。
我让人,成为战士的父类,战士可以直接继承人的属性和方法。 战士修改成— 属性 : 战斗力。 方法 : 战斗。
看上去战士的资料变少了,实际上没有,我们仍然可以调用方法—战士.死。 而且我们还可以重载战士.死的方法,简称重载死法。
我还建了一个对象—法师,父类也是人。 属性 : 法力值 方法 : 施法,泡妞。 你看,用了继承,创建对象变得更方便了。
再后来,我又建立了一个对象,叫怪物。 属性 : 等级,战力,血量。 方法 : 战斗,死。
建了个对象,叫白兔怪,父类怪物,可继承怪物所有的属性和方法。 属性 : 毛色。 方法 : 卖萌,吃胡萝卜。
沉湎于希望的人和守株待兔的樵夫没有什么两样。