【练习题】JAVA课后练习题总结

【练习题】JAVA课后练习题总结,第1张

【练习题】JAVA课后练习题总结

文章目录
    • 第1章 Java开发入门
      • 一、填空题
      • 二、选择题
      • 三、问答题
      • 四、编程题
    • 第2章 Java编程基础
      • 一、填空题
      • 二、判断题
      • 三、选择题
      • 四、程序分析题
        • 代码一:
        • 代码二:
        • 代码三:
        • 代码四:
      • 五、简答题
      • 六、编程题
    • 第3章 面向对象(上)
      • 一、填空题
      • 二、判断题
      • 三、选择题
      • 四、程序分析题
        • 代码一:
        • 代码二:
        • 代码三:
      • 五、简答题
      • 六、编程题
    • 第4章 面向对象(下)
      • 一、填空题
      • 二、判断题
      • 三、选择题
      • 四、分析题
        • 代码一:
        • 代码二:
        • 代码三:
        • 代码四:
      • 五、简答题
      • 六、编程题
    • 第5章 多线程
      • 一、填空题
      • 二、判断题
      • 三、选择题
      • 四、程序分析题
        • 代码一:
        • 代码二:
        • 代码三:
        • 代码四:
      • 五、简答题
      • 六、编程题

第1章 Java开发入门 一、填空题

1、Java的三大体系分别是 Java EE、 Java SE、 Java ME。

2、Java程序的运行环境简称之为 JER。

3、编译Java程序需要使用javac命令。

4、javac.exe和java.exe两个可执行程序存放在JDK安装目录的bin目录下。

5、path环境变量用来存储Java的编译和运行工具所在的路径,而classpath环境变量则用来保存保存Java虚拟机要运行的“.class”文件路径。

二、选择题

1、以下选项中,哪些属于JDK工具?(多选)【ABCD】

​ A、Java编译器 B、Java运行工具 C、Java文档生成工具 D、Java打包工具

2、Java属于以下哪种语言?【C】

​ A、机器语言 B、 汇编语言 C、高级语言 D、以上都不对

3、下面哪种类型的文件可以在Java虚拟机中运行?【B】

​ A、.java B、.jre C、.exe D、.class

4、安装好JDK后,在其bin目录下有许多exe可执行文件,其中java.exe命令的作用是以下哪一种? 【B】

​ A、Java文档制作工具 B、Java解释器 C、Java编译器 D、Java启动器

5、如果jdk的安装路径为:d:jdk,若想在命令窗口中任何当前路径下,都可以直接使用javac和java命令,需要将环境变量path设置为以下哪个选项?【B】

​ A.d:jdk; B.d :jdkbin; C.d:jrebin; D.d:jre;

三、问答题

1、简述Java的特点。

面向对象、跨平台性、健壮性、安全性、可移植性、多线程性、动态性等

2、简述JRE与JDK的区别。

JRE(Java Runtime Environment,Java运行时环境),它相当于 *** 作系统部分,提供了Java程序运行时所需要的基本条件和许多Java基础类,例如,IO类、GUI控件类、网络类等。JRE是提供给普通用户使用的,如果你只想运行别人开发好的Java程序,那么,你的计算机上必须且只需安装JRE。

JDK(Java Development Kit,Java开发工具包),它包含编译工具、解释工具、文档制作工具、打包工具多种与开发相关的工具,是提供给Java开发人员使用的。初学者学习和使用Java语言时,首先必须下载和安装JDK。JDK中已经包含了JRE部分,初学者安装JDK后不必再去下载和安装JRE了。 
四、编程题

使用记事本编写一个HelloWorld程序,在dos命令行窗口编译运行。请按照题目的要求编写程序并给出运行结果。

public class HelloWorld {
	public static void main(String[] args) {
		System.out.println("这是第一个Java程序!");
	}
}
第2章 Java编程基础 一、填空题

1、Java中的程序代码都必须在一个类中定义,类使用class关键字来定义。

2、布尔常量即布尔类型的两个值,分别是false和true。

3、Java中的注释可分为三种类型,分别是单行注释、多行注释、文档注释。

4、Java中的变量可分为两种数据类型,分别是基本数据类型和引用数据类型。

5、在Java中,byte类型数据占1个字节,short类型数据占2个字节,int类型数据占4个字节,long类型数据占8个字节。

6、在逻辑运算符中,运算符&和&&用于表示逻辑与,|和||表示逻辑或。

7、若x = 2,则表达式 ( x + + )/3 的值是0。

8、若int a =2; a+=3;执行后,变量a的值为5。

9、若int []a={12,45,34,46,23}; ,则a[2]= 34。

10、若int a[3][2]={{123,345},{34,56},{34,56}},则a[2][1]=56。

二、判断题

1、Java语言不区分大小写。【×】

2、0xC5表示的是一个十六进制整数。【√】

3、continue 语句只用于循环语句中,它的作用是跳出循环。【×】

4、“//”中可以嵌套“//”注释,但不能嵌套“//”注释。【√】

5、-5%3的运算结果是2。【×】

三、选择题

1、以下选项中,哪些属于合法的标识符?(多选)【AD】

​ A、Hello_World B、class C、123username D、username123

2、关于方法重载的描述,以下选项中哪些是正确的?(多选)【AD】

​ A、方法名必须一致 B、返回值类型必须不同

​ C、参数个数必须一致 D、参数的个数或类型不一致

3、以下关于变量的说法错误的是? 【C】

​ A、变量名必须是一个有效的标识符

​ B、变量在定义时可以没有初始值

​ C、变量一旦被定义,在程序中的任何位置都可以被访问

​ D、在程序中,可以将一个byte类型的值赋给一个int类型的变量,不需要特殊声明

4、以下选项中,switch语句判断条件可以接收的数据类型有哪些? (多选) 【ACD】

​ A、int B、byte C、char D、short

5、假设int x = 2,三元表达式 x>0?x+1:5 的运行结果是以下哪一个? 【C】

​ A、0 B、2 C、3 D、5

6、下面的运算符中,用于执行除法运算是哪个? 【A】

​ A、/ B、 C、% D、*

7、下列语句哪些属于循环语句?(多选) 【AC】

​ A、for语句 B、if语句 C、while语句 D、switch语句

8、下面哪种写法可以实现访问数组arr的第1个元素? 【A】

​ A、arr[0] B、arr(0) C、arr[1] D、arr(1)

9、以下哪个选项可以正确创建一个长度为3的二维数组? 【B】

​ A、 new int [2][3]; B、 new int[3][];

​ C、 new int[][3]; D、 以上答案皆不对

10、请先阅读下面的代码。

int x = 1;
int y = 2;
if (x % 2 == 0) {
	y++;
} else {
	y--;
}
System.out.println("y=" + y);

上面一段程序运行结束时,变量y的值为下列哪一项?【A】

​ A、1 B、2 C、3 D、switch语句

四、程序分析题

阅读下面的程序,分析代码是否能够编译通过,如果能编译通过,请列出运行的结果。否则请说明编译失败的原因。

代码一:
public class Test01 {
	public static void main(String[] args) {
		byte b = 3;
		b = b + 4;
		System.out.println("b=" + b);
	}
}
编译不能通过。b是byte类型的,4是int类型的,byte+int存储在byte会报错。因为byte取值范围没有int类型大,存不下int类型的值,因此编译不通过
代码二:
public class Test02 {
	public static void main(String[] args){
		int x = 12; 
		{
			int y = 96;  
			System.out.println("x is " + x); 
			System.out.println("y is " + y);
		}
		y = x; 
		System.out.println("x is " + x);      
	}
}
编译不能通过,这是因为y是在最里层的代码块中定义的一个变量,只有在那个代码块中才可使用,在使用y = x;语句时已经超过了y变量的作用域,所以编译无法通过。
代码三:
public class Test03 {
	public static void main(String args[]) {
		int x = 4, j = 0;
		switch (x) {
		case 1:
			j++;
		case 2:
			j++;
		case 3:
			j++;
		case 4:
			j++;
		case 5:
			j++;
		default:
			j++;
		}
		System.out.println(j);
	}
}
打印结果为:3
代码四:
public class Test04 {
	public static void main(String args[]) {
		int n = 9;
		while (n > 6) {
			System.out.println(n);
			n--;
		}
	}
}
打印结果为:	9
            8
            7
五、简答题

1、请列举Java语言中的八种基本数据类型,并说明每种数据类型所占用的空间大小。

Java语言的八种基本数据类型有:

byte字节型,占一个字节。

short短整型,占两个字节。

int整型,占4个字节。

long长整型,占8个字节。

float单精度浮点型,占4个字节。

double双精度浮点型,占8个字节。

char字符型,占两个字节。

boolean型,表示逻辑值,有true和false两个值,分别占一个字节。

2、简述&&与&的区别并举例说明。

如果使用“&”在表达式之间进行连接,那么无论任何情况,“&”两边的表达式都会参与计算。

如果&两边都是数字,会进行逻辑与的计算。

如果使用“&&”进行连接,当“&&”左边的表达式为false,则不会执行其右边的表达式。 

3、什么是方法重载?

方法重载指的是在一个类中可以声明多个同名的方法,而方法中参数的个数或者数据类型不一致。

调用这些同名的方法时,JVM会根据实际参数的不同绑定到不同的方法。
六、编程题

1、请编写程序,实现计算“1+3+5+7+…+99”的值。

提示:

  • 使用循环语句实现自然数1~99的遍历。

  • 在遍历过程中,通过条件判断当前遍历的数是否为奇数,如果是就累加,否则不加。

public class Test01 {
	public static void main(String[] args) {
		int sum = 0;
		for (int i = 1; i < 100; i++) {
			if (i % 2 != 0)
				sum += i;
		}
		System.out.println(sum);
	}
}

2、已知函数

请设计一个方法实现上面的函数,根据传入的值x的不同,返回对应的y值。

提示:

  • 定义一个static修饰符修饰的方法,方法接收一个int类型的参数x,返回值为int类型。

  • 在方法中使用if…else if…else 语句针对x的值进行三种情况的判断。

  • 根据判断结果分别执行不同的表达式,并将结果赋予变量y。

  • 在方法的最后返回y的值。

  • 在main方法中调用设计好的方法,传入一个int型的值,将方法的返回值打印。

public class Test02 {
	public static void main(String args[]) {
		int y = function(0);
		System.out.println(y);
	}
	public static int function(int x) {
		int y;
		if (x > 0) {
			y = x + 3;
		} else if (x == 0) {
			y = 0;
		} else {
			y = x * x - 1;
		}
		return y;
	}
}

3、请编写程序,实现对数组{25,24,12,76,101,96,28} 的排序。

  提示:使用冒泡排序算法。
	public class Test03 {
	public static void main(String[] args) {
		int[] arr = { 25, 24, 12, 76, 101, 96, 28 };
		for (int i = 0; i < arr.length - 1; i++) {
			// 定义内层循环
			for (int j = 0; j < arr.length - i - 1; j++) {
				if (arr[j] > arr[j + 1]) { // 比较相邻元素
					// 下面的三行代码用于交换两个元素
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " "); // 打印元素和空格
		}
	}
}
第3章 面向对象(上) 一、填空题

1、 面向对象的三大特征是封装、继承和多态。

2、 在Java中,可以使用关键字new来创建类的实例对象。

3、 定义在类中的变量被称为成员变量,定义在方法中的变量被称为局部变量

4、 面向对象程序设计的重点是类的设计,类是用来创建对象的模板。

5、 在非静态成员方法中,可以使用关键字this访问类的其它非静态成员。

6、 当一个对象被当成垃圾从内存中释放时,它的finalize()方法会被自动调用。

7、 被static关键字修饰的成员变量被称为静态变量,它可以被该类所有的实例对象共享。

8、 在一个类中,除了可以定义属性、方法,还可以定义类,这样的类被称为内部类。

9、在Java中,提供了一个javadoc命令,用于将程序中的文档注释提取出来,生成HTML格式的帮助文档。

10、所谓类的封装是指在定义一个类时,将类中的属性私有化,即使用private关键字来修饰。

二、判断题

1、在定义一个类的时候,如果类的成员被private所修饰,该成员不能在类的外部被直接访问。【√】

2、Java中的每个类都至少有一个构造方法,一个类中如果没有定义构造方法,系统会自动为这个类创建一个默认的构造方法。【√】

3、声明构造方法时,不能使用private关键字修饰。【×】

4、类中static修饰的变量或方法,可以使用类名或对象的引用变量访问。【√】

5、方法内部类中不能访问外部类的成员变量。【×】

三、选择题

1、类的定义必须包含在以下哪种符号之间?【B】

​ A、方括号[] B、花括号{} C、双引号“” D、圆括号()

2、下面哪一个是正确的类的声明? 【D】

​ A、 public void HH{…} B、 public class Move(){…}

​ C、 public class void number{} D、 public class Car{…}

3、在以下什么情况下,构造方法会被调用?【B】

​ A、 类定义时 B、 创建对象时 C、 调用对象方法时 D、 使用对象的变量时

4、下面对于构造方法的描述,正确有哪些?(多选)【ABC】

​ A、方法名必须和类名相同

​ B、方法名的前面没有返回值类型的声明

​ C、在方法中不能使用return语句返回一个值

​ D、当定义了带参数的构造方法,系统默认的不带参数的构造方法依然存在

5、使用this调用类的构造方法,下面的说法正确的是?(多选)【ABCD】

​ A、使用this调用构造方法的格式为this([参数1,参数2…])

​ B、只能在构造方法中使用this调用其它的构造方法

​ C、使用this调用其它构造方法的语句必须放在第一行

​ D、不能在一个类的两个构造方法中使用this互相调用

6、下面哪些可以使用static关键字修饰?(多选)【ACD】

A、 成员变量   B、局部变量   C、成员方法   D、成员内部类

7、关于内部类,下面说法正确的是?(多选)【ABCD】

​ A、成员内部类是外部类的一个成员,可以访问外部类的其它成员

​ B、外部类可以访问成员内部类的成员

​ C、方法内部类只能在其定义的当前方法中进行实例化

​ D、静态内部类中可以定义静态成员,也可以定义非静态成员

8、下面对于单例设计模式的描述,正确的是?(多选)【ABCD】

​ A、类中定义一个无参的构造方法,并且声明为私有

​ B、在内部创建一个该类的实例对象,使用静态变量引用该实例对象

​ C、使用private修饰静态变量,禁止外界直接访问

​ D、定义静态方法返回该类实例

9、请先阅读下面的代码

public class Test {
    public Test(){
    	System.out.println("构造方法一被调用了");
    }
    public Test(int x){
    	this();
    	System.out.println("构造方法二被调用了");
    }
    public Test(boolean b){
    	this(1);
    	System.out.println("构造方法三被调用了");
  }
    public static void main(String[] args) {
		Test test = new Test(true);
	}
}

上面程序的运行结果为下列哪一项?【D】

​ A、构造方法一被调用了 B、构造方法二被调用了

​ C、构造方法三被调用了 D、以上三个选项之和

10、Outer类中定义了一个成员内部类Inner,需要在main()方法中创建Inner类实例对象,以下四种方式哪一种是正确的?【D】

​ A、 Inner in = new Inner() B、Inner in = new Outer.Inner();

​ C、 Outer.Inner in = new Outer.Inner(); D、Outer.Inner in = new Outer().new Inner();

四、程序分析题

阅读下面的程序,分析代码是否能够编译通过,如果能编译通过,请列出运行的结果。否则请说明编译失败的原因。

代码一:
class A {
	private int secret = 5;
}
public class Test1 {
	public static void main(String[] args) {
		A a = new A();
		System.out.println(a.secret++);
	}
}
程序不能编译通过,因为在类A中的成员变量secret用private修饰,所以在类Test1中无法访问。
代码二:
public class Test2 {
	int x = 50;
	static int y =200 ;
	public static void method() {
		System.out.println(x+y);
	}
	public static void main(String[] args) {
		Test2.method();
	}
}
程序不能编译通过,因为在静态方法method()中不能访问非静态成员变量x。
代码三:
public class Outer {
	public String  name="Outer";
	private class Inner {
		String name="inner";
		void showName(){
		System.out.println(name);
		}
	}
	public static void main(String[] args) {
		Inner inner = new Outer().new Inner();
		System.out.println(inner.name);
	}
}
运行的结果为:“inner”。
五、简答题

1、构造方法和普通的成员方法有什么区别?

构造方法是类的一个特殊成员,它会在类实例化对象时被自动调用。

而普通方法只有在使用的时候才会被调用。

在定义构造方法时要求方法名与类名相同、在方法名的前面没有返回值类型的声明、在方法中不能使用return语句返回一个值

2、单例设计模式具备哪些特点?

单例模式可以保证在整个程序运行期间针对该类只存在一个实例对象。
六、编程题

1、请按照以下要求设计一个学生类Student,并进行测试。

要求如下:

1)Student类中包含姓名、成绩两个属性

2)分别给这两个属性定义两个方法,一个方法用于设置值,另一个方法用于获取值.

3)Student类中定义一个无参的构造方法和一个接收两个参数的构造方法,两个参数分别为姓名和成绩属性赋值

4)在测试类中创建两个Student对象,一个使用无参的构造方法,然后调用方法给姓名和成绩赋值,一个使用有参的构造方法,在构造方法中给姓名和成绩赋值

class Student {
	private String name;
	private double grade;
	public Student() {
	}
	public Student(String name, double grade) {
		this.name = name;
		this.grade = grade;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getGrade() {
		return grade;
	}
	public void setGrade(double grade) {
		this.grade = grade;
	}
}
public class Test01 {
	public static void main(String[] args) {
		Student stu1 = new Student();
		stu1.setName("zhangsan");
		stu1.setGrade(99);
		Student stu2 = new Student("lisi", 100);
	}
}

2、定义一个Father和Child类,并进行测试。

要求如下:

1)Father类为外部类,类中定义一个私有的String类型的属性name,name的值为“zhangjun”。

2)Child类为Father类的内部类,其中定义一个introFather()方法,方法中调用Father类的name属性。

3)定义一个测试类Test,在Test类的main()方法中,创建Child对象,并调用introFather ()方法。

class Father {
	private String name = "zhangjun";
	class Child {
		public void introFather() {
			System.out.println("My Father's name is " + name);
		}
	}
}
public class Test02 {
	public static void main(String[] args) {
		Father.Child child = new Father().new Child();
		child.introFather();
	}
}
第4章 面向对象(下) 一、填空题

1、在Java语言中,允许使用已存在的类作为基础创建新的类,这种技术我们称为继承。

2、一个类如果实现一个接口,那么它就需要实现接口中定义的全部方法,否则该类就必须定义成抽象类。

3、在程序开发中,要想将一个包中的类导入到当前程序中,可以使用import关键字。

4、一个类可以从其它的类派生出来,派生出来的类称为子类,用于派生的类称为父类或者基类。

5、 JDK中定义了大量的异常类,这些类都是Exception类的子类或者间接子类。

6、定义一个Java类时,如果前面加使用final关键字修饰,那么该类不可以被继承。

7、如果子类想使用父类中的成员,可以通过关键字super引用父类的成员。

8、在Java语言中,所有的类都直接或间接继承自Object类。

9、异常的捕获通常由try、catch两部分组成,try代码块用来存放可能发生异常,catch代码块用来处理产生的异常。

10、在Java语言中,要想是将一个已编译的类打包成jar文件,可以使用的命令是jar –cvf,要想在命令行窗口运行jar文件,可以使用的命令是java –jar。

二、判断题

1、抽象方法必须定义在抽象类中,所以抽象类中的方法都是抽象方法。【×】

2、Java中被final关键字修饰的变量,不能被重新赋值。【√】

3、不存在继承关系的情况下,也可以实现方法重写。【×】

4、package声明语句应当为Java源文件中的第一条语句。【√】

5、接口中只能定义常量和抽象方法。【√】

三、选择题

1、在类的继承关系中,需要遵循以下哪个继承原则?【B】

A、多重  B、单一  C、双重  D、不能继承

2、在Java语言中,以下哪个关键字用于在方法上声明抛出异常?【D】

A.try   B.catch   C.throws   D.throw

3、关于super关键字以下说法哪些是正确的?(多选)【ABC】

A、super关键字可以调用父类的构造方法

B、super关键字可以调用父类的普通方法

C、super与this不能同时存在于同一个构造方法中

D、super与this可以同时存在于同一个构造方法中

4、以下说法哪些是正确的?(多选)【ABCD】

​ A、Java语言中允许一个类实现多个接口

​ B、Java语言中不允许一个类继承多个类

​ C、Java语言中允许一个类同时继承一个类并实现一个接口

​ D、Java语言中允许一个接口继承一个接口

5、类中的一个成员方法被下面哪个修饰符修饰,该方法只能在本类被访问?【C】

​ A、public B、 protected C、 private D、default

6、关于抽象类的说法哪些是正确的?(多选)【ABC】

​ A、抽象类中可以有非抽象方法。

​ B、如果父类是抽象类,则子类必须重写父类所有的抽象方法。

​ C、不能用抽象类去创建对象。

​ D、接口和抽象类是同一个概念。

7、在Java中,要想让一个类继承另一个类,可以使用以下哪个关键字?【C】

​ A、inherits B、implements C、extends D、modifies

8、System类位于以下哪个包中?【D】

​ A、java.io B、java.util C、java.awt D、java.lang

9、已知类的继承关系如下:

class Employee; 

class Manager extends Employeer; 

class Director extends Employee; 

则以下语句能通过编译的有哪些?【A】

​ A、 Employee e=new Manager(); B、 Director d=new Manager();

​ C、 Director d=new Employee(); D、Manager m=new Director();

10、编译运行下面的程序,结果是什么?【B】

public class A {
	public static void main(String[] args) {
		B b = new B();
		b.test();
	}
	void test() {
		System.out.print("A");
	}
}
class B extends A {
	void test() {
		super.test();
		System.out.print("B");
	}
}

A、产生编译错误 B、代码可以编译运行,并输出结果AB

C、代码可以编译运行,但没有输出 D、编译没有错误,但会产生运行时异常

四、分析题

阅读下面的程序,分析代码是否能编译通过,如果能编译通过,请列出运行的结果。如果不能编译通过,请说明原因。

代码一:
public class Test01 {
	public static void main(String[] args) {
		try {
			int x = 2 / 0;
			System.out.println(x);
		} catch (Exception e) {
			System.out.println("进入catch代码块");
		} finally {
			System.out.println("进入finally代码块");
		}
	}
}
程序编译能通过,这是因为int x = 2 / 0; System.out.println(x);这两条语句使用了try块,捕获了程序因为除以0而产生的异常情况,之后程序会继续向下执行,输出“进入catch代码块”,“进入finally代码块”。
代码二:
final class Animal {
	public final void shout() {
		// 程序代码
	}
}
class Dog extends Animal {
	public void shout() {
		// 程序代码
	}
}
class Test02 {
	public static void main(String[] args) {
		Dog dog=new Dog();
	}
}
程序编译不通过,这是因为在程序中使用了final关键字修饰Animal类,使得Animal类不能被继承。shout()方法中同样使用了final关键字,使得该方法不能被重写。
代码三:
class Animal {
	void shout() {
		System.out.println("动物叫!");
	}
}
class Dog extends Animal {
	void shout() {
		super.shout();
		System.out.println("汪汪……");
	}
}
public class Test03 {
	public static void main(String[] args) {
		Animal animal = new Dog();
		animal.shout();
		
	}
}
程序编译能通过,输出结果为“动物叫!”和“汪汪……”,因为在程序中调用shout()方法时,首先会通过super.shout()调用父类的方法说出“动物叫!”之后再输出“汪汪……”
代码四:
interface Animal {
	void breathe();  
	void run();
	void eat(){};
}
class Dog implements Animal {  
	public void breathe() {
    System.out.println("I’m breathing")
	}
	public void eat() {
    System.out.println("I’m eathing")
	}
}
public class test04 {
    public static void main(String [] args) {
      Dog dog = new Dog();
      dog.breathe();
      dog.eat();
	}
}
程序编译不通过,因为接口中定义的方法不能有方法体,所以定义的eat()方法是错误的。接口中的方法必须在子类中全部实现,由于run()方法在子类中并没有重新实现,所以这也是错误的。
五、简答题

1、什么是方法重写?

在继承关系中,子类的方法与父类的某一方法具有相同的方法名、返回类型和参数列表,则称子类的该方法重写(覆盖)父类的方法。

2、什么是多态?

多态意味着一个对象有着多种形态,可以在特定的情况下,表现不同的状态,从而对应着不同的属性和方法。简单的说,多态就是使用父类类型的变量引用子类对象,根据被引用子类对象的特性,程序会得到不同的运行效果。

3、抽象类和接口的区别?

在Java中,使用abstract关键字修饰的类称之为抽象类。抽象类是不能被实例化的,通常需要写一个子类来继承抽象类,同时实例化子类来获得该类的对象。抽象类通常用于表示一种抽象的概念。
接口可以说是一种特殊的抽象类,接口中只能定义常量和抽象方法。由于接口的特殊性,在定义时需要使用interface关键字。
六、编程题

请按照题目的要求编写程序并给出运行结果。

1、 设计一个学生类Student和它的一个子类Undergraduate,要求如下:

1) Student类有name(姓名)、和age(年龄)属性,一个包含两个参数的构造方法,用于给name和age属性赋值,一个show()方法打印Student的属性信息

2) 本科生类Undergraduate增加一个degree(学位)属性。有一个包含三个参数的构造方法,前两个参数用于给继承的name和age属性赋值,第三个参数给degree专业赋值,一个show()方法用于打印Undergraduate的属性信息

3) 在测试类中分别创建Student对象和Undergraduate对象,调用它们的show()。

class Student {
	public String name;
	public int age;
	public Student(String name,int age){
		this.name=name;
		this.age=age;
	}
	public void show(){
		System.out.println("name: "+name+" age: "+age);
	}
}
class UnderGraduate extends Student{
	public String degree;
	public UnderGraduate(String name,int age,String degree){
		super(name, age);
		this.degree=degree;
	}
	public void show(){
		System.out.println("name: "+name+" age: "+age+" degree: "+degree);
	}
}
public class Test01{
	public static void main(String[] args) {
		Student student = new Student("zhangsan", 16);
		student.show();
		UnderGraduate underGraduate = new UnderGraduate("lisi", 20, "bechalor");
		underGraduate.show();
	}
}

2、设计一个Shape接口和它的两个实现类Square和Circle,要求如下:

1)Shape接口中有一个抽象方法area(),方法接收有一个double类型的参数,返回一个double类型的结果

2)Square和Circle中实现了Shape接口的area()抽象方法,分别求正方形和圆形的面积并返回

在测试类中创建Square和Circle对象,计算边长为2的正方形面积和半径为3的圆形面积

interface Shape {
	double area(double givenValue);
}
class Square implements Shape{
	public double area(double sideLength) {
      return sideLength*sideLength;
	}
} 
class Circle implements Shape{
	public double area(double r) {
       return Math.PI*r*r;
	}
}
public class Test02 {
	public static void main(String[] args) {
		Shape square = new Square();
		Shape circle = new Circle();
		System.out.println(square.area(2));
		System.out.println(circle.area(3));
	}
}

3、自定义一个异常类NoThisSoundException和Player类,在Player的play()方法中使用自定义异常,要求入下:

1) NoThisSongException继承Exception类,类中有一个无参和一个接收一个String类型参数的构造方法,构造方法中都使用super关键字调用父类的构造方法。

2) Player类中定义一个play(int index)方法,方法接收一个int类型的参数,表示播放歌曲的索引,当index>10时,paly()方法用throw关键字抛出NoThisSongException异常,创建异常对象时,调用有参的构造方法,传入“您播放的歌曲不存在”。

3) 在测试类中创建Player对象,并调用play()方法测试自定义的NoThisSongException异常,使用try…catch语句捕获异常,调用NoThisSongException的getMessage()方法打印出异常信息。

class NoThisSongException extends Exception{
	public NoThisSongException(){
		super();
	}
	public NoThisSongException(String message){
		super(message);
	}
}
class Player{
	public void play(int index)throws NoThisSongException{
		if(index>10){
			throw new NoThisSongException("您播放的歌曲不存在");
		}
		System.out.println("正在播放歌曲");
	}
}
public class Test03 {
	public static void main(String[] args) {
		Player player = new Player();
		try {
             player.play(13);
		} catch (NoThisSongException e) {
			System.out.println("异常信息为: "+e.getMessage());
		}
	}
}
第5章 多线程 一、填空题

1、一个应用程序中有多条并发执行的线索,每条线索都被称作一个线程,它们会交替执行,彼此

间可以进行通信。

2、在实现多线程的程序时有两种方式,一是通过继Thread承类,二是通过实现Runnable接口。

3、yield()方法只能让相同优先级或者更高优先级、处于就绪状态的线程获得运行的机会。

4、在Java语言中,同步方法需要用到关键字synchronized,对于同步方法而言无需指定同步锁,它的同步

锁是方法所在的对象,也就是this(关键字)。

5、在多任务系统中,每个独立执行的程序称之为进程,也就是“正在运行的程序”。

6、线程的整个生命周期分为五个阶段,分别是新建状态(New)、就绪状态(Runnable)、运行状态(Running)、阻塞状态(Blocked)、和死亡状态(Terminated)。

7、线程的优先级用1~10之间的整数来表示,其中10代表优先级最高,1代表优先级最低。

8、在Thread类中,提供了一个start()方法,该方法用于开启一个新线程,当新线程启动后,系统会自动调用run()方法。

9、要想解决线程间的通信问题,可以使用wait()、notify()、notifyAll()方法。

10、要将某个线程设置为后台线程,需要调用该线程的setDaemon(true)方法,该方法必须在start()方法之前调用。

二、判断题

1、当我们创建一个线程对象时,该对象表示的线程就立即开始运行。【×】

2、如果前台线程全部死亡,后台线程也会自动死亡。【√】

3、同步代码块中的锁对象可以是任意类型的对象。【√】

4、静态方法不能使用synchronized关键字来修饰。【×】

5、线程结束等待或者阻塞状态后,会进入运行状态。【×】

三、选择题

1、Thread类位于下列哪个包中?【B】

​ A、java.io B、java.lang C、java.util D、java.awt

2、关于线程的创建过程,下面四种说法正确的有哪些?(多选)【AC】

​ A、定义Thread类的子类,重写Thread类的run()方法,创建该子类的实例对象,调用对象的start()方法

​ B、定义Thread类的子类,重写Thread类的run()方法,创建该子类的实例对象,调用对象的run()方法

​ C、定义一个实现Runnable 接口的类并实现run()方法,创建该类实例对象,将其作为参数传递给Thread类的构造方法来创建Thread对象,调用Thread对象的start()方法

​ D、定义一个实现Runnable 接口的类并实现run()方法,创建该类对象,然后调用run()方法

3、对于通过实现Runnable接口创建线程,下面说法正确的有哪些?(多选)【ABC】

​ A、适合多个相同程序代码的线程去处理同一个资源的情况

​ B、把线程同程序代码、数据有效的分离,很好的体现了面向对象的设计思想

​ C、可以避免由于Java的单继承带来的局限性

​ D、编写简单,可以不通过Thread类直接创建线程

4、对于线程的生命周期,下面四种说法正确的有哪些?(多选) 【BC】

​ A、调用了线程的start()方法,该线程就进入运行状态

​ B、线程的run()方法运行结束或被未catch的InterruptedException等异常终结,那么该线程进入死亡状态

​ C、线程进入死亡状态,但是该线程对象仍然是一个Thread对象,在没有被垃圾回收器回收之前仍可以像引用其它对象一样引用它

​ D、线程进入死亡状态后,调用它的start()方法仍然可以重新启动

5、对于死锁的描述,下面四种说法正确有哪些?(多选)【ABD】

​ A、当两个线程互相等待对方释放同步锁时会发生死锁

​ B、Java虚拟机没有检测和处理死锁的措施

​ C、一旦出现死锁,程序会发生异常

​ D、处于死锁状态的线程处于阻塞状态,无法继续运行

6、下面四个选项中,哪些是线程进入阻塞状态的原因?(多选)【ABC】

​ A、线程试图获取某个对象的同步锁,而该锁被其它线程持有

​ B、线程调用了另一个线程的join()方法

​ C、当线程调用了一个阻塞式的IO方法

​ D、线程调用了setDaemon(boolean b)方法

7、线程调用sleep()方法后,该线程将进入以下哪种状态?【C】

​ A、就绪状态 B、运行状态

​ C、阻塞状态 D、死亡状态

8、在以下哪种情况下,线程进入就绪状态?【D】

​ A、线程调用了sleep()方法时 B、线程调用了join()方法

​ C、线程调用了yield()方法时 D、线程调用了notify()方法

9、下面四个选项中,对线程同步的目的描述正确的有哪些?(多选)【AB】

​ A、锁定资源,使同一时刻只有一个线程去访问它,防止多个线程 *** 作同一个资源引发错误

​ B、提高线程的执行效率

​ C、让线程独占一个资源

​ D、让多个线程同时使用一个资源

10、对于wait()方法,下面说法正确的是?(多选)【ABCD】

​ A、wait()方法的调用者是同步锁对象

​ B、wait()方法使线程进入等待状态

​ C、调用同一锁对象的notify()或notifyAll()方法可以唤醒调用wait()方法等待的线程

​ D、调用wait()方法的线程会释放同步锁对象

四、程序分析题

阅读下面的程序,分析代码是否能编译通过,如果能编译通过,请列出运行的结果。如果不能编译通过,请说明原因。

代码一:
class RunHandler {
	public void run(){
    System.out.println("run");
}
}
public class Test {
     public static void main(String [] args) {
    Thread t = new Thread(new RunHandler());
    t.start();
    } 
}
程序不能编译通过,因为RunHandler类没有实现Runnable接口,因此RunHandler的实例对象不能作为参数传递给Thread的构造方法。
代码二:
public class A extends Thread{
	protected void run() {
        	System.out.println("this is run()");
        	}
     public static void main(String[] args) {
		A a = new A();
		a.start();
	}
}
程序不能编译通过,因为Thread的子类A重写的run()方法的访问级别不能低于父类run()方法的。访问级别
代码三:
public class Test{
	private Object obj=new Object();
	public synchronized void a(){
		try {
			obj.wait();
			System.out.println("waiting");
		} catch (InterruptedException e) {
			System.out.println("Exception");
		}
	}
	public static void main(String[] args) {
		new Test().a();
	}
}
程序不能编译通过,因为同步方法中调用wait()方法的对象必须为同步锁对象。
代码四:

为了使下面的程序能够输出“Thread is running”,请在在空格处填上相应的代码。

public class B implements Runnable {
	public static void main(String[] args) {
		Thread t = new Thread(new B());
		_____``````//此处填空
	}
	public void run() {
		System.out.println("Thread is running");
	}
	public void go() {
		start(1);
	}
	public void start(int i) {
	}
}
加上 t.start();
五、简答题

1、 java中有几种方法可以实现一个线程?请举例说明。

一种是继承java.lang包下的Thread类,覆写Thread类的run()方法,在run()方法中实现运行在线程上的代码。
new Thread() {
    public void run(){}
}.start();

另一种就是实现java.lang.Runnable接口,同样是在run()方法中实现运行在线程上的代码。
new Thread(new Runnable(){
     public void run(){}
}).start()

2、sleep() 和 wait() 有什么区别?

调用sleep()方法,正在执行的线程主动让出CPU去执行其他线程,在sleep()方法指定的时间过后,CPU才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep()方法并不会释放锁,即使当前线程使用sleep()方法让出了CPU,但其它被同步锁挡住了的线程也无法得到执行。wait()在一个已经进入了同步锁的线程内进行调用,让当前线程暂时让出同步锁,以便其它正在等待此锁的线程可以得到同步锁并运行。当其它线程调用了notify()方法后,调用wait()方法的线程就会解除wait状态,当再次获得同步锁后,程序可以继续向下执行。
六、编程题

请按照题目的要求编写程序并给出运行结果。

1、通过继承Thread类的方式创建两个线程,在Thread构造方法中指定线程的名字,并将这两个线程的名字打印出来。

public class MyThread extends Thread{
	public MyThread(String name) {
         super(name);       
	}
	public void run() {
        System.out.println(this.getName());
	}
	public static void main(String[] args) {
		new MyThread("Thread1").start();
		new MyThread("Thread2").start();
	}
}   

2、通过实现Runnable接口的方式创建一个新线程,要求main线程打印100此次“main”,新线程打印50次“new”。

public class MyRunnable implements Runnable {
	public void run() {
		for (int i = 0; i < 50; i++) {
			System.out.println("new");
		}
	}
	public static void main(String[] args) {
		new Thread(new MyRunnable()).start();
		for (int i = 0; i < 100; i++) {
			System.out.println("main");
		}
	}
}

3、模拟传智播客的三个老师同时分发80份学习笔记,每个老师相当于一个线程。

public class Test01 {
	public static void main(String[] args) {
		Teacher t = new Teacher();
		new Thread(t, "老师1").start();
		new Thread(t, "老师2").start();
		new Thread(t, "老师3").start();
	}
}
class Teacher implements Runnable {
	private int notes = 80;
	public void run() {
		while (true) {
            dispatchNotes(); // 调用售票方法
			if (notes <= 0) {
				break;
			}
		}
	}
	private synchronized void dispatchNotes() {
		if (notes > 0) {
			try {
				Thread.sleep(10); // 经过的线程休眠10毫秒
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName() + "---发出的笔记" + notes--);
		}
	}
}

4、编写10个线程,第一个线程从1加到10,第二个线程从11加到20…第十个线程从91加到100,最后再把十个线程结果相加。

public class Accumulator extends Thread {
	private int stratNum;
	public static int sum;
	public Accumulator(int startNum) {
		this.stratNum = startNum;
	}
	public static synchronized void add(int num) {
		sum += num;
	}
	public void run() {
		int sum = 0;
		for (int i = 0; i < 10; i++) {
			sum += stratNum + i;
		}
		add(sum);
	}
	public static void main(String[] args) throws Exception {
		Thread[] threadList = new Thread[10];
		for (int i = 0; i < 10; i++) {
			threadList[i] = new Accumulator(10 * i + 1);
			threadList[i].start();
		}
		for (int i = 0; i < 10; i++) {
			threadList[i].join();
		}
		System.out.println("Sum is : " + sum);
	}
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5437581.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存