1.名词解释:构造方法、抽象。
- 构造方法是一种特殊的方法,它是一个与类同名且返回值类型为同名类类型的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。
- 从具体事物抽出、概括出它们共同的方面、本质属性与关系等,而将个别的、非本质的方面、属性与关系舍弃,这种思维过程,称为抽象。
2.对象位于内存何处?声明能引用对象的实质是什么?
例如:Person per = new Person();
per这个引用在栈内存中,而new出来的对象是在堆内存中,栈中的per指向了堆中的新分配的空间。
如果只有Person per;这时的per叫做 声明。
3.对象和基本数据类型作为参数传递时,有什么不同?
基本数据类型作为参数在方法中的传递是值传递,
对象是引用传递,传递的是对象的地址。
4.在自定义对象中写finalize方法,看看什么情况下finalize被调用。
package test;
public class test {
private int a;
public test(int _a) {a = _a;}
public void finalize(){
System.out.println("已释放");
}
public static void main(String[] args) {
test my = new test(12);
System.out.println(my.a);
my = new test(14);//my指向了别的对象,原先的变成垃圾了
System.gc();//调用系统函数,告诉系统该回收垃圾了
}
}
结果为:12 已释放
5.对象在什么条件下成为垃圾?什么情况下释放垃圾对象,如何证明一个对象被释放了?
对象在没有任何引用时成为垃圾。
系统在内存不足时会释放垃圾,或者手动 System.gc() 释放垃圾。
6.final修饰符都有什么作用?
Java中final修饰符既可以修饰类、方法,也可以修饰变量
用final修饰的类不能被继承
用final修饰的方法不可重写
用final修饰的变量必须初始化,且之后不能赋值
7.static修饰的属性和方法有什么特点?
static修饰属性或方法后,属性和方法不在属于某个特定的对象,而是所有共享,也可以说是static成员不依赖某个对象,在类加载时就被初始化。static修饰的属性或方法,可以直接使用类名调用,而不用先实例化对象再调用。
8.Application程序执行时,为什么不能带后缀名?
java命令是执行一个类。
若写 java xxx.yyy
是代表要运行 package xxx 中的class yyy 里面的 main(String[])
所以当你写 java xxx.class 时, 它会以为要找一个叫xxx的package里面的一个叫class的class.
9.下面代码中,Vector是 java.util 包中的一个类,关于此类哪个叙述是正确的?
1)public void create(){
2)vector myvect;
3)myvect=new vector();
4)}
A第二行的声明不会为变量myvect分配内存空间
B第二行的声明分配一个到vector对象的引用的内存空间
C第二行语句创建一个vector类对象
D第三行语句创建一个vector类对象
E第三行语句为一个vector类对象分配内存空间
答案:ADE
解析:java里面的声明都是不分配内存空间的,创建对象时才分配对应的空间。
10.请在 dislpay 函数中用递归方式输出如下图型。
图形:
9 9 9 9 9 9 9 9 9
8 8 8 8 8 8 8 8
7 7 7 7 7 7 7
6 6 6 6 6 6
5 5 5 5 5
4 4 4 4
3 3 3
2 2
1
代码:
public class List {
public static void display(int n){
if(n <= 0){ return;}
for(int i = 1 ;i <= n; i++){
System.out.print(n + " ");
}
System.out.println();
display(n-1);
}
public static void main(String[] args) {
display(9);//这里改变 n 的值
}
}
11.国际象棋。
水平有限,只能出一种结果,而且由于判断的原因到第37步时产生错误,编程思路大家可以借鉴。
package test;
import java.text.DecimalFormat;
public class test {
static DecimalFormat df = new DecimalFormat("00");
void printchess(test my)
{
int a,b;
for(a=2;a<=9;a++)
{
for(b=2;b<=9;b++)
{
System.out.print( df.format(my.chessboard[a][b])+" ");
}
System.out.println();
}
}
void horse(test my,int x,int y)
{
int i;
for(i=0;i<8;i++)
{
// int a,b,sign=1;
// for(a=2;a<=9;a++)
// {
// for(b=2;b<=9;b++)
// {
// if(my.chessboard[a][b]==0)
// {
// sign=0;
// }
// }
//
// }
// if(sign==0) {
if(my.chessboard[x+my.move[i][0]][y+my.move[i][1]]==0)
{
my.chessboard[x+my.move[i][0]][y+my.move[i][1]]=++my.cnt;
my.horse(my,x+my.move[i][0],y+my.move[i][1]);
}
// }
// else
// {
// sign=1;
// my.printchess(my);
// System.out.println();
// System.out.println();
// System.out.println();
// my.chessboard[x][y]=0;
// }
}
}
int[][] chessboard = new int[12][12];
int cnt = 0;//标记马已走的方格数
int sum = 0;//标记吗走完全程的具体方案数
int[][] move = {{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1},};
//每个马有8个位置可以跳,这是8中情况下x,y的偏移量
public static void main(String[] args) {
test my = new test();
int a,b;
for(a=0;a<12;a++)
{
for(b=0;b<12;b++)
{
my.chessboard[a][b]=0;
}
}
for(a=0;a<12;a++)
{
for(b=0;b<12;b++)
{
if(a==0||a==1||a==10||a==11||b==0||b==1||b==10||b==11)
{
my.chessboard[a][b]=-1;
//在8x8棋盘外面加两层,使得每个位置都有8种跳法,只不过这些多出来的位置标记为已跳
}
}
}
my.chessboard[2][2]=++my.cnt;//开始位置为第一个已跳位置
my.horse(my,2, 2);
my.printchess(my);
}
}