栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【JAVA】考试题整理bingo~

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【JAVA】考试题整理bingo~

JAVA考试题整理(主选择

print就是一般的标准输出,但是不换行
println和print基本没什么差别,就是最后会换行

1、父类静态变量和静态代码块(先声明的先执行)
2、子类静态变量和静态代码块
3、父类变量和代码块
4、父类的构造方法
5、子类的变量和代码块
6、子类的构造方法

静态方法不能访问非静态成员,编译会出错

已知如下代码

class Example{
    String str;
    public Example(){
        str= "example";
    }
    public Example(String s){
        str=s;
    }
}
class Demo extends Example{
}
public class Test{
    public void f (){
        Example ex = new Example("Good");
        Demo d = new Demo("Good");
    } 
}

q.哪句语句会导致错误?()
A、 line 3 B、line 6 C、line 10 D、 line 14 E、 line 15

*在java中,如果一个类没有定义构造方法,编译器会默认插入一个无参数的构造方法;但是如果一个构造方法在父类中已定义,编译器不会自动插入一个默认的无参构造方法。对于子类来说,不管是无参构造方法还是有参构造方法,都会默认调用父类的无参构造方法;当编译器尝试在子类中往这两个构造方法插入super()方法时,因为父类没有一个默认的无参构造方法,所以编译器会报错。
answer:E

int型范围-2147483648~2147483647
超过范围的int计算 i=2147483647+1-2×2147483648=-2147483648

给定如下一个Java源文件Child.java,编译并运行Child.java, 以下结果正确的是

A. 编译错误:没有找到构造器Child()
B. 编译错误:没有找到构造器Parent1()
C. 正确运行,没有输出值
D. 正确运行,输出结果为:parent2

因为Parent2构造方法会默认有super()调用他的父类构造方法,但是Parent1显示的定义了一个有参构造,系统会回收默认的无参构造。
answer:B

*知识点回顾:
继承中子类实例化的过程:先调用父类构造方法,然后再执行子类构造方法。因为子类中所有构造方法的第一行有默认式==super();==语句(父类对象先进内存,这样子类才能拥有父类的成员)。这道题的错因在于,父类有参数,那么子类的super()必须有参数<=>如果父类中没有无参构造方法,那么子类必须使用带参super()调用父类的构造方法。
构造方法

分析如下所示的Java代码,则选项中的说法正确的是


A. 第2行错误,Test类的构造函数中参数名称应与其父类构造函数中的参数名相同
B. 第3行错误,应使用super关键字调用父类的name属性,改为super.name=“hello”
C. 第4行错误,调用父类构造方法的语句必须放在子类构造方法中的第一行
D. 程序编译通过,无错误

*在调用父类的构造方法时,super必在子类构造方法的第一行,否则会报错。与上一题类似。
answer:C

分析下面两个类:

class First{
	final static int A=3;
}
final class Second extends First{
	void method(){
		System.out.printin(A);
	}
}

正确的是____。
A.类First能被编译,但类Second不能
B.类Second能被编译,但类First不能
C.两个类都不能被编译
D.两个类都不能被编译,并且当调用方法method()时,将输出3
E.两个类都能被编译,但当调用方法method()时,将抛出一个例外

*当关键字final用来修饰类时,其含义是该类不能再派生子类,换句话说,任何其他类都不能继承用final修饰的类,即使该类的访问权限为pubilc类型,也不能被继承;否则,将编译报错。但这道题是final类是子类所以不影响,故程序可以正常编译。

answer:D*

格式再次记忆!!

byte不能自动转换到char,因为char没有符号,会丢失精度

这样写一定要带括号!!
0 ! = 1

方法调用:
非静态方法在同一类内调用其他方法:直接调用方法名即可

public class Test {

    public void Son1(){//非静态方法
        System.out.println("java大爷,你成功调用了你非静态方法里的儿子1");
    }
    public static void Son2(){//静态方法
        System.out.println("java大爷,你成功调用了你静态方法里的儿子2");
    }
    public void alloutput(){
        Son1();//非静态方法直接调用类内的非静态方法△
        Son2();//非静态方法直接调用类内的静态方法△
    }
    public static void main(String[] args) {
        Test test = new Test();
        test.alloutput();//前边已学静态方法通过对象调用非静态方法
    }
}

非静态方法在不同类之间调用其他方法:通过对象才能调用非静态方法;非静态方法既可以通过对象调用静态方法又可以通过类名直接调用(由于对象的调用方式属于非静态调用方式,所以建议使用类名直接调用静态方法)
静态方法调用非静态方法:需要通过对象调用
静态方法调用静态方法:同一类内直接调用,不同类内直接通过类名.方法名(参数表)调用

public class Cylinder {  //04314题
	Cr c;   //引用变量是在栈内存里开辟了空间给引用变量c,这时c=null
	private int h;
	public Cylinder(){
		c=new Cr();  //表示在堆内存中开辟了空间给Cr类的对象,对象叫c(此时真正创建了对象)
		h=0;
	}
	public Cylinder(int r, int h){
		c=new Cr(r);
		this.h=h;
	}
	public double getArea(){
		return 2*c.getArea()+c.getPerimeter()*h;
	}
	public double getVolume(){
		return c.getArea()*h;
	}
}
public DateAndTime(MeDate date, MeTime time){
	this.date= new MeDate(date);
	this.time= new MeTime(time);}			// 构造方法
public DateAndTime(MeTime time, MeDate date){
	this(date, time);
	}			// 构造方法

此时this((date, time)显式调用同一类中有相同形参的构造方法,所以此时调用的是上面的构造函数,若为this(time,data)则会无限调用自己

String都是常用的方法,应写成str.length()
str.equals(“YES”)返回值是true和false

class MyClass {
	public static int method(String a, String b) {
	int a1=Integer.parseInt(a);  //Interger必须实例化后才能使用(int不需要)
	int b1=Integer.parseInt(b);
	return a1+b1;
		// 返回两个整数的和
	}
}

两者区别
1.Integer是int的包装类(Integer 类型的对象包含一个 int 类型的字段。 此外,该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还提供了处理道 int 类型时非常有用的其他一些常量和方法,比如定义了表示整数的最大值和最小值的常量),int则是java的一种基本数据类型 (面向过程留下的痕迹,不过是对java的有益补充)。
2.Integer变量必须实例化后才能使用,而int变量不需要 。
3.Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 。
4.Integer的默认值是null,int的默认值是0。


double只有10进制,有标准记数法和科学记数法表示方式
标准计数法由小数部分和整数部分组成,两者可省其一,如12d(要加d/D)和12.3和42
科学计数法,E/e前面必须有数字(可以是整数),E/e后必须是整数,如0.12E2,12e-10

此时运算式双目提升为double型,0是一个无限趋于0但不等于0的数,相除是无穷大

逻辑运算不涉及数据类型的转换或提升,所以&两边都应该是boolean型,故报错


关键字:都是小写字母 then不是,无论是String或string都不是
true,false,null是系统预定义的三个文字
instanceof是运算符

ACD)
A.这里的1是整形,当赋值给一个float时,存在一个隐式转换,不损失精度。
B.会出错。 因为1.0默认是double类型的。double范围比float大,为了不损失精度,不会自动转换。
CD.属于隐式转换了

C)a=b返回值1,C中赋值后,会与0进行比较,如果大于0,if为true,否则返回false,而java中不会于0进行比较,而是直接把赋值后的结果放入括号中,而if只存放boolean类型




这是接收数组
main不能作为关键字,它属于标识符,main函数的main是函数名

第二章 数据与数据运算

书本易错点:
基本类型包括:整型,浮点型,布尔型,字符型
整型:二进制码格式存放,分为byte(字节型,-128~127),short(短整型),long(长整型),int(整型)
浮点型:float(单精度),double(双精度),包括正零(+0.0),负零(-0.0),正无穷(+Infinity),负无穷(-Infinity),特殊NaN值
字符型:char型码值是无符号的,而short型整数有符号,在Java的基本数据类型中,char型采用Unicode编码方案,每个Unicode码占用2字节存空间,这样,无论是中文字符还是英文字符,都是占用2字节存空间
布尔型:略

文字
int型:10,8(以0开始),16(以0x或0X开始,A~F代表10-15)进制表示
long型:与int型类似,以 l 或 L 结尾
l与L可以加,也可以不加1. 所赋的值超过了int型的取值范围,后面必须加上字母l 2.所赋的值未超过int型的取值范围,后面可以加/可以省略字母l
eg. long n= 0xa; //合法的,定义了一个值为10的int型,int型可以被赋值给long型
float型:没有16进制
double型:只有十进制,可以加上d或D,有e的是
char型:‘ ’
boolean型: String型:必须在一行内写完

局部变量不能超前使用,在已经存在的变量上重新定义会编译错
int a=100; byte x1=a; //初始化是错误的,不能将非常数表达式的int值赋给byte型变量(int不能赋给byte),赋值转换是系统自动完成的,所以必须符合要求

double->float 值太小了是正负零,值太大了正负无穷

单目运算符:+、-在运算前会进行单目运算提升,结果至少是int型
而++,- -不提升,结果与变量类型相同
双目运算符:会算术提升,结果至少是int型
关系运算符:双目提升
0.0==-0.0
组合赋值运算符(+=、-=、*=、/=、%=):类似于强制转换,左面一定有值

double factor; int width; width+=factor;
会自动把double转化成int型(double不会自动转换成int

-x++ -(x++) 单目运算符同级右结合
a? b : c? d:e a? b : ( c? d:e ) 三目运算符同级右结合
x=y=13 x=(y=3) 赋值运算符也是右结合
eg. byte i=3, j=1;
i < j | i + j < 5
float类型的字面常量,后面需要加上f或者F来表示是一个单精度浮点数,因为在java里面,没小数点的默认是int,有小数点的默认是 double

char的默认值是’u0000’,不是空格
u0000代表的应该是nul,一个控制字符,表示没有值,不可见,输出控制台是空,但不是真正的空格,因为真正的空格的unicode编码是’u0020’
错题:
char和short位长都是16
0xffff是65535 short是-32768~32767
int a=10; int b=10; 那a==b成立,不算是两个不同的对象
*==是会双目运算提升的

类方法调用:类.方法名

第三章 Java语句(没咋讲)

switch(<不能是long>)
方法的调用必须用实例

第四章 类和对象

局部变量和实例变量的区别:

判断是否在方法内部,局部变量可以屏蔽实例变量
对一个实例的实例变量值的改变不会影响另一个实例的实例变量值

静态初始化块的作用只能是初始化类变量,不能有return,super,this
类变量:无论创建多少个实例变量,类变量都只有一个,不会随着改变(它是固定住的)
类方法不能被abstract修饰,抽象方法不能用static,final,private修饰
形参实参要赋值相容,传参不能缩窄
先初始化所有的实例变量,后执行构造方法中的代码
方法签名:方法名+形参表
方法重载:方法名相同但形参不同
静态初始化块和类方法都不能使用this
类方法访问类变量,类方法(所有类),但是在类方法中创建实例/接收实例,就可以通过实例访问实例变量或调用实例方法
void method(Sa0412_1 obj){
…} // 可以看成obj指向所传对象,这就是引用传递,但是方法的局部变量会在方法执行后消失,故obj会被垃圾回收

D)public static void main()实际上是main方法,里面的变量是局部变量,而局部变量需要初始化(且局部变量可以和成员变量重名。

ans:main()方法不能调用amethod方法,因为类方法不能调用实例方法/成员变量,必须通过创建实例调用

F)

static修饰的方法是类方法,先于任何实例存在。static修饰的方法在类加载的时候就已经存在了,实例是在创建时才在内存中生成。而this关键字,总是指向当前调用该方法的对象。
在方法中定义使用的this关键字,它的值是当前对象的应用,也就是说你只能用它来调用属于当前对象的方法或者使用this处理方法中的成员变量和局部变量重名的情况。static修饰的方法是属于类的,该方法的调用者可能是一个类,而不是对象。那么,如果使用的是类来调用而不是对象,则this就无法指向合适的对象,所以static修饰的方法中不能使用this。


AD)A形参次序不同,ok;B方法重载与返回值类型无关;C方法重载与参数名无关,与参数类型有关;D方法名称不同,ok

D)首先,编译不会出错,rg一定是在执行完getIt()方法后被回收的,方法返回实例。

第五章 字符串和包装类

当某一字节大于0x7f(127),将强制转换
字符串的第一次字符的位置序号为0
subString()截取范围:beginIndex~endIndex-1
equals(…)判断字符串内容是否相等
trim()去空:移去调用串前后两段空白字符
String是不可变的(源码里String类有final修饰符),所以数值一旦初始化后便不能更改,如果调用了实例方法处理,若值发生了变化,系统将返回一个新的String实例,否则返回当前调用串本身
System.out.println(Object)自动调用的toString方法

valueOf是类方法,可以通过类名直接调用 eg. String.valueOf(x) (类方法在类被加载的时候就被分配了入口地址,所以类方法不仅可以被类创建的任何对象调用执行,也可以直接通过类名调用)

StringBuffer:初始容量=str.length()+16
length()返回长度,capacity()返回容量
方法有:append( String) insert(int, String) delete(start,end-1) replace(start, end, String) reverse()
StringBuffer是可更改的,上述实例方法都不会产生新的StringBuffer类,只是对原来实例内容的修改
文字池中的文字是类装入初始化时创建的,代码执行过程中创建的String实例不加入文字池
当程序正文出现字符串文字时,运行系统会为其创建一个String实例
6+6+“xy”——12xy “xy”+6+6——xy66

装箱开箱:
装箱就是将基本数据类型转化为包装类型,那么拆箱就是将包装类型转化为基本数据类型。
自动装箱:或者叫隐式装箱,直接给Integer赋值,即Integer d=1,在编译的时候,会调用Integer.valueOf()方法完成装箱。


A)
theFile->program.java
fname->program
fname->program.txt
f->program.txt
但是theFile还是指向program.java

B)()是转义字符,若想输出 需要写成

public static String method(String str) {
		// 返回参数字符串中大写字母组成的倒序字符串
		if(str==null) return null;
		if(str=="") return str;
		int i=0;
		StringBuffer s=new StringBuffer();
		while(i='A'&&str.charAt(i)<='Z')
				s.append(str.charAt(i));
				i++;
		}
		return s.reverse().toString();
	}

reverse()是StringBuffer的方法
回顾:append(),insert(int, String),delete(start, end),replace(),reverse()都是StringBuffer的实例方法

class MyClass {
	public static String method(String str) {
		return str.replaceAll("(rn|r|n)","
"); } //str中的回车符(r)、换行符(n)或回车换行符(rn)替换成
,并返回替换后的结果。 }
public class Spheroid extends edu.Cc{   //edu.Cc 写清楚是在哪个包中调用的类
	public Spheroid(){}
	public Spheroid(int r){
	super(r);}
	public double getSurfaceArea(){
		return 4*Math.PI*getRadius()*getRadius();
	}
	public double getVolume(){
		return 4.0/3*Math.PI*getRadius()*getRadius()*getRadius();  //返回类型是double所以...
	}	
}	
	public boolean equals(Object sh){   //传入的是Object类,但Object可以转换成任何类
	Rectangle s = (Rectangle)sh;
	if(getArea() == s.getArea())return true;
    else
	return false;
	}	// 判断当前形状与参数形状的面积是否相等

第六章 继承和嵌入类

is-a关系:可以将子类类型变量赋值给超类类型变量,反之不可,若超类赋值子类,会导致子类的新成员没有定义,引发编程错误
从超类中继承的方法访问的仍然是超类中被隐藏的同名变量x

方法覆盖要求:
1.返回类型相同
2.覆盖方法访问级别高于被访问方法级别
3.覆盖方法不能比被覆盖方法抛出更多例外类型
与成员变量隐藏的区别:方法覆盖中 (超类).实例.方法 调用的还是子类中覆盖方法


例子:

class Sa0605{...}
class Sa0605_1 extends Sa0605{
	int j,k;
	Sa0605_1(){
		//这里隐含调用直接超类不带形参的构造方法 super();
		j=20;
	}
	Sa0605_1(int a){
		this();  //显式调用当前类中不带形参的构造方法
		k=a;
	}
}

构造方法从超类执行开始
超类中所有实例变量初始化完成,构造方法执行后,才开始子类的装入
超类子类初始化顺序:父类属性值–》》父类构造方法–》》创建父类对象–》》子类属性–》》子类构造方法–》》创建子类对象
局部内部类和匿名内部类只能访问final的局部变量
Object类方法:
Object的equals方法和==作用一样,判断是否是同一个对象
clone()产生一个内容完全相同的新对象,Object类本身没有实现Cloneable接口,所以对象的类必须实现Cloneable接口,clone方法返回类型是Object,所以在对象复制时需要类型转换

public class Parent {
    protected static String a = "static";
    final String b = "final";
    public static void staticMethod(){
        System.out.println("this is a static method");
    }
    public final void finalMethod(){
        System.out.println("this is a final method");
    }
}
public class Child extends Parent {
    @Test
    public void test(){
        System.out.println(a);
        System.out.println(b);
        staticMethod();
        finalMethod();
    }
}

输出的结果是这样的:
static
final
this is a static method
this is a final method
由此可见,只要是非私有的成员都是可以被继承的,并且也可以在子类对其进行覆盖。
用final定义的类不能有子类


D)子类默认super(),但是父类没有无参构造方法,于是报错
解决方法:1)在父类中加一个无参构造方法 2)子类添加super(参数)去显示的调用父类的带参构造方法 3)子类通过this去调用本类的其他构造方法 子类中一定要有一个去访问了父类的构造方法,否则父类数据就没有初始化

第七章 接口和包

接口中的方法都是public,abstract属性,可以省略
抽象方法不能是final的
一个接口能扩展一个接口,也可以扩展多个接口

第八章 数组

*long型不能转换成int
数组元素的访问可以是构造n个对象,每个a[i]指向一个类的对象

class MyClass {
	public static int[][] multiply(int[][] x, int[][] y) {
		// 矩阵相乘
		int m=x.length;
		int n=x[0].length;
		int l=y[0].length;
		int[][] z;
		z=new int[m][l];
		for(int i=0;i 
第九章 例外处理 

书本易错点:
不捕捉则声明
EOFExpextion 和 FileNotFoundException都是类IOExpection的子类
NullPointerExpection是一种不受检查的例外类型,所以可以充当覆盖方法的抛出声明
Exception是IOException的超类
自定义例外类型是Exception的子类,需要在定义的时候extends Exception

拓展:
受检查的异常和不受检查的异常区别:
受检查的异常用try—catch块代码处理,或者在main方法中用throws关键字声明抛出;不受检查的异常可以忽略或用throws声明。
Exception(环境影响造成)是所有被检查异常的基类
RuntimeException是不受检查的基类(+Error),通常由于糟糕的编程引起的,继承了Exception

throw和throws区别:
throw是语句抛出一个异常 eg. throw(异常对象); throw e;
throws是方法可能抛出的异常 so普通类不能抛出异常
throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则一定是抛出了异常。
写法注意!! throw new Exception && throws Exception

覆盖原则:
子类所抛出异常不能超过父类异常(超类),但可以抛出任何不受检查的异常,可以抛出父类异常的多个子类

父类捕捉到了子类的异常,e仍是子类异常名称

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/703492.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号