java当中异常_多态相关测试

注:按Java规范书写程序代码,如果你认为程序有错误,请指出,并说明程序错误原因。

1.
写出程序结果
class Demo
{	
	public static void func()//throws Exception//此处应该声明异常//2步
	{
		try
		{
			throw  new Exception();//3步
		}
		finally
		{
			System.out.println("B");
		}
	}
	public static void main(String[] args)
	{
		try
		{
			func();//1步
			System.out.println("A");//第4步
		}
		catch(Exception e)//第5步
		{
			System.out.println("C");
		}
		System.out.println("D");//第6步
	}
}
执行结果:
编译失败:未声明异常
如果func函数上声明了该异常。结果是?B C D

如果func函数上加上了声明了该异常,执行过程是:
1,执行主函数的 第1步 ,
2,执行到第2步,
3,执行到第3步,抛出异常对象,执行finally里面的语句,输出B
4,因为第3步抛出异常对象,所以System.out.println("A");语句是执行不到的
5,执行第5步,处理异常,执行catch块里的语句
6,最后执行第6步


====================================================================
2.
写出程序结果	
class Test
{
	Test()
	{
		System.out.println("Test");//2步//5步
	}
}
class Demo extends Test
{
	Demo()
	{
		//super();//这里有隐式的super();语句,
		System.out.println("Demo");//3步
	}
	public static void main(String[] args)
	{
		new Demo();//1步
		new Test();//4步
	}
}

执行结果:
Test
Demo

Test

考的子类的实例化过程。
分析:继承当中的构造函数,在调用子类构造函数的时候,默认会先执行父类的构造函数,
	然后再执行子类的构造函数,即子类构造函数中的第一行默认都有隐式super();
	这也就导致了,当执行到Demo()方法的时候,会等待,会去先执行Test()构造方法,
	然后再回来执行Demo()方法。
      第4步,new父类对象,就直接走父类的构造方法。


====================================================================
3.
写出程序结果
interface A{}  
class B implements A
{
	public String func()
	{
		return "func";
	}
}
class Demo
{
	public static void main(String[] args)
	{
		A a=new B();
		System.out.println(a.func());
	}
}

执行结果:

编译失败:因为A接口中并未定义func方法。
分析:多态,父类引用执行子类对象,此时父类引用只能使用父类中已经定义的方法、成员,
	无法访问子类中特有的成员方法、成员,而func()方法是子类中特有的方法,所以
	父类引用不能使用该方法,父类引用要想使用子类中特有的成员方法、变量必须强壮之后
	才能使用-----B a1 = (B)a;这样a1就能调用子类方法了

====================================================================
4.
写出程序结果	
class Fu
{
	boolean show(char a)
	{
		System.out.println(a);
		return true;
	}
}
class Demo extends Fu
{
	public static void main(String[] args)
	{
		int i=0;
		Fu f=new Demo();//1步//show方法不是构造方法,所以show在执行的时候看子类的show方法,子类重写了父类方法,执行子类show方法
		Demo d=new Demo();//2步
		for(f.show('A'); f.show('B')&&(i<2);f.show('C'))//3步//4步
		{
			i++;
			d.show('D');
		}	
	}
	boolean show(char a)
	{
		System.out.println(a);
		return false;
	}
}
执行结果:
A B
分析:
1,多态,父类引用执行子类对象,new子类对象自动时,默认初始化成员----注意:创建对象的时候,只默认初始化成员变量、构造方法,不包括普通方法,构造方法是new对象的时候自动调用,但是普通方法是什么使用调用,什么时候才执行
2,子类,new对象
3,f.show('A');f是父类引用指向了子类对象,子类中重写了show方法,所以执行子类中的show方法。输出打印‘A’,并返回false
4,f.show('B');和第三步分析的一样,也是执行子类当中的show方法,所以输出打印‘B’,并返回false
   f.show('B')&&(i<2),&&右边的就不用看了,左边返回的是false,那么整体这个条件表达式的结果就是false,所以不符合执行for循环条件,执行结束!




====================================================================
5.
写出程序结果	
interface A{}
class B implements A
{
	public String test()
	{
		return "yes";
	}
}
class Demo
{
	static A get()
	{
		return new B();
	}
	public static void main(String[] args)
	{
		A a=get();
		System.out.println(a.test());
	}
}
编译失败,因为A接口中没有定义test方法。

分析:
多态,父类引用执行子类对象,所以也就是说a只能调用父类中的方法,(补充:父类中的方法是所有表现形态子类中的公共部分的抽取)
	不能调用子类Demo中特有的方法,要想调用子类中特有的方法必须强制类型转换 Demo c = (Demo)a;
====================================================================
6.
写出程序结果:   
class Super
{
	int i=0;
	public Super(String a)
	{
		System.out.println("A");
		i=1;	
	}
	public Super()
	{
		System.out.println("B");
		i+=2;
	}
}
class Demo extends Super
{
	public Demo(String a)
	{
		//super();
		System.out.println("C");
		i=5;				
	}
	public static void main(String[] args)
	{
		int i=4;
		Super d=new Demo("A");
		System.out.println(d.i);
	}
}
执行结果:B C 5
考察:继承中的多态


====================================================================
7.
interface Inter
{
	void show(int a,int b);
	void func();
}
class Demo
{
	public static void main(String[] args)
	{
		//补足代码;调用两个函数,要求用匿名内部类
		/*Inter in = new Inter()
		{
			public void show(int a,int b)
			{
			
			}
			public void func()
			{
			
			}
		};

		in.show(4,5);
		in.func();
		*/    //注释部分为不足代码部分
		
	}
}


====================================================================
8.
写出程序结果
class TD
{
	int y=6;
	class Inner//内部类
	{
		static int y=3;//定义了静态方法  
		void show()
		{
			System.out.println(y);
		}
	}
}
class TC
{
	public static void main(String[] args)
	{
		TD.Inner ti=new TD().new Inner();
		ti.show();
	}
}
编译失败,非静态内部类中不可以定义静态成员。

内部类中如果定义了静态成员,该内部类必须被静态修饰。



====================================================================
9.
选择题,写出错误答案错误的原因,用单行注释的方式。
class Demo
{
	 int show(int a,int b){return 0;}
}
下面那些函数可以存在于Demo的子类中。	
A.public int show(int a,int b){return 0;}//可以,覆盖。	
B.private int show(int a,int b){return 0;}//不可以,权限不够。
C.private int show(int a,long b){return 0;}//可以,和父类不是一个函数。没有覆盖,相当于重载。
D.public short show(int a,int b){return 0;}//不可以,因为该函数不可以和给定函数出现在同一类中,或者子父类中。既不符合重写,也不符合重载
E.static int show(int a,int b){return 0;}//不可以,静态只能覆盖静态。


====================================================================
10.
写出this关键字的含义,final有哪些特点?
this:代表本类对象,哪个对象调用this所在函数,this就代表哪个对象。

final:
1,修饰类,变量(成员变量,静态变量,局部变量),函数。
2,修饰的类不可以被继承。
3,修饰的函数不可以被覆盖。
4,修饰的变量是一个常量,只能赋值一次。
5,内部类只能访问局部当中的final修饰变量





====================================================================
11.
写出程序结果:  
class Fu
{
	int num=4;
	void show()
	{
		System.out.println("showFu");
	}
}
class Zi extends Fu
{
	int num=5;
	void show()
	{
		System.out.println("showZi");
	}
}
class T
{
	public static void main(String[] args)
	{
		Fu f=new Zi();
		Zi z=new Zi();
		System.out.println(f.num); //变量步存在覆盖,是跟着类走的 
		System.out.println(z.num); //变量不存在覆盖,是跟着类走的
		f.show(); //父类引用指向子类对象,执行子类show,子类对象中的方法覆盖父类中的show方法,(记住:只有继承中的构造方法,当子类重写父类方法,多态的表现才会先执行父类后子类的 )
		z.show(); //调用子类中的show方法,覆盖了父类的show方法
	}
}

4
5
showZi
showZi




====================================================================
12.
interface A
{
	void show();
}
interface B
{
	void add(int a,int b);
}
class C implements A,B//子类必须重写接口中的所有方法

{	private int a,b;
	private int sum;
	public int add(int a ,int b){//必须是void类型,重写因为是
		this.a  = a;
		this.b  = b;
		sum = a+b;
	return sum;
	}
	public void show(){
		System.out.println(sum);
	}

}
class D
{
	public static void main(String[] args)
	{
		C c=new C();
		c.add(4,2);
		c.show();//通过该函数打印以上两个数的和。
	}
}
分析:C类实现了A、B接口,所以必须重写里面所有的方法,所以要有add方法,show方法,
	因为add方法使用了a、b值之后,值仍然在,所以定义成成员变量,而不是局部变量
	再定义一个sum变量,记录两个值的和,show方法中直接打印sum值


====================================================================
13.
写出程序结果	
class Demo
{
	public static void main(String[] args)
	{
		try
		{
			showExce(); //1步抛出异常
			System.out.println("A");//上面第一步抛出异常,这条语句不执行
		}
		catch(Exception e)//3步,
		{
			System.out.println("B");//4步
		}
		finally
		{
			System.out.println("C");//5步
		}
		System.out.println("D");//6步
	}
	public static void showExce()throws Exception//2步抛异常
	{
		throw new Exception();
	}
}

// B C D

====================================================================
14.
写出程序结果
class Super
{
	int i=0;	
	public Super(String s)
	{
		i=1;	
	}
	//当自己已经创建了有参的构造函数时,java就不提供空参的构造函数了
}
class Demo extends Super
{
	public Demo(String s)
	{
		//super();
		i=2;			
	}
	public static void main(String[] args)
	{
		Demo d=new Demo("yes");
		System.out.println(d.i);
	}
}
//编译失败,因为父类中缺少空参数的构造函数。
//或者子类应该通过super语句指定要调用的父类中的构造函数。



====================================================================
15.
写出程序结果
class Super
{
	public int get(){return 4;}
}
class Demo15 extends Super
{	
	public long get(){return 5;}			
	public static void main(String[] args)
	{
		Super s=new Demo15();
		System.out.println(s.get());
	}
}

分析:
编译失败,因为子类父类中的get方法没有覆盖。但是子类调用时候不能明确返回的值是什么类型。
所以这样的函数不可以存在子父类中。

====================================================================
16.
写出程序结果:
class Demo
{	
	public static void func()
	{
		try
		{	//showExce(); // a
			throw  new Exception();//发生异常//b
			System.out.println("A");//该语句无法执行到,编译失败//c
		}
		catch(Exception e)
		{
			System.out.println("B");
		}
	}
	public static void main(String[] args)
	{
		try
		{
			func();
		}
		catch(Exception e)
		{
			System.out.println("C");
		}
		System.out.println("D");
	}
	/*
	public static void showExce()throws Exception//d
	{
		throw new Exception();
	}
	*/
}
//编译失败。 因为打印“A”的输出语句执行不到。

记住:throw单独存在,下面不要定义语句,因为执行不到。
	这就是异常类封装与不封装的差别,请对比13题,

分析:
如果func函数中的try当中写的不是throw new Exception();而是showshowExce();
(我们把throw new Exception 封装到showExce这个方法里面)而showExce是封装的异常,
也就是说在a处调用了d,而4处声明了异常,声明就代表说可能会抛出异常,当然也可能不会抛出异常,
所以c这条语句是会执行到的,这就是异常封装与不封装的区别



====================================================================
17.
class Demo
{	
	public void func()
	{
		//位置1;
		new  Inner();
		
	}
	class Inner{}
	public static void main(String[] args)
	{
		Demo d=new Demo();
		// 位置2 
		new Inner();//不可以,因为主函数是静态的。如果访问inner需要被static修饰。
	}
}

A.在位置1写 new Inner();//ok
B.在位置2写 new Inner();		
C.在位置2写 new d.Inner();//错误,格式错误。	new new Demo().Inner();	
D.在位置2写 new Demo.Inner();//错误,因为inner不是静态的。

====================================================================
18.
写出程序结果
class Exc0 extends Exception{}
class Exc1 extends Exc0{}

class Demo
{
	public static void main(String[] args)
	{
		try
		{
			throw new Exc1();
		}		
		catch(Exception e)		
		{
			System.out.println("Exception");
		}
		catch(Exc0 e)
		{
			System.out.println("Exc0");
		}
	}
}

//编译失败。
	多个catch时,父类的catch要放在下面。

====================================================================
19.

interface Test//Test类型的对象,可以调用func 方法
{
	void func();
}
class Demo
{
	public static void main(String[] args)
	{
		//补足代码;(匿名内部类)
		
		new Demo().show(new Test()
		{
			public void func(){}
		});
		
	}
	void show(Test t)//Demo new出的对象可以调用show方法
	{
		t.func();//根据该行代码,思路,先new Demo对象调用show方法,而传的参数是Test接口类型对象
			//但是接口Test是不能实例化对象的,所以创建Test的子类,让子类实例化对象
	}
}

====================================================================
20.
写出程序结果	
class Test
{ 
	public static String output=""; //共享数据,即每个涉及到的output的操作都有效
	public static void foo(int i)
	{ 
		try
		{ 
			if(i==1)//第一次传0进来,条件不满足,//第二次传1进来,条件满足
				throw new Exception(); 	//所以该语句不执行//所以语句执行,抛异常
			output+="1"; //output变成1//上面抛异常,该语句执行不到
		} 
		catch(Exception e)//第一次没有抛出异常,不执行catch块//上面抛异常,执行catch块
		{ 
			output+="2"; //第二次执行
			return; //第二次执行,返回,下面的finally执行,其他的就不执行了
		} 
		finally//第一次执行//第二次执行
		{ 
			output+="3"; 
		} 
		output+="4";//第一次执行//第二次不会执行,因为上面已经返回
	}
	public static void main(String args[])
	{ 
		foo(0);//调用foo方法,传0进去
		System.out.println(output);//134---4
		foo(1); //调用foo方法,传1进来
		System.out.println(output); //134 23----3
	}
} 

分析:
	注意output是字符串类型,后面的改变都会追加到末尾

====================================================================
21.
建立一个图形接口,声明一个面积函数。圆形和矩形都实现这个接口,并得出两个图形的面积。
注:体现面向对象的特征,对数值进行判断。用异常处理。不合法的数值要出现“这个数值是非法的”提示,不再进行运算。




====================================================================
22.
补足compare函数内的代码,不许添加其他函数。
class Circle
{
	private static double pi=3.14;
	private double radius;
	public Circle(double r)
	{
		radius=r;
	}
	public static double compare(Circle[] cir)
	{
		//程序代码//其实就是在求数组中的最大值。
		
		int max = 0;//double max = cir[0].radius;

		for(int x=1; x<cir.length; x++)
		{
			if(cir[x].radius>cir[max].radius)
				max = x;
		}

		return cir[max].radius;
	}
}
class TC
{
	public static void main(String[] args)
	{
		Circle cir[]=new Circle[3];//创建了一个类类型数组。
		cir[0]=new Circle(1.0);
		cir[1]=new Circle(2.0);
		cir[2]=new Circle(4.0);
		System.out.println("最大的半径值是:"+Circle.compare(cir));
	}
}
====================================================================
23.
写出程序结果	
public class Demo
{     
	private static int j = 0; 
	private static boolean methodB(int k)
	{
		j += k; 
		return true; 
	}
	public static void methodA(int  i)
	{ 
        	boolean b;   
		b = i < 10 | methodB (4); //左边执行完为true,右边执行完j变成4
		b = i < 10 || methodB (8); //左边执行完true,右边不执行
	}
	public static void main (String args[] )
	{
		methodA (0); 
		System.out.println(j); //最后输出结果为4
	} 
}

====================================================================
24.
假如我们在开发一个系统时需要对员工进行建模,员工包含 3 个属性:
姓名、工号以及工资。经理也是员工,除了含有员工的属性外,另为还有一个
奖金属性。请使用继承的思想设计出员工类和经理类。要求类中提供必要的方
法进行属性访问。 



====================================================================
25.
在一个类中编写一个方法,这个方法搜索一个字符数组中是否存在某个字符,
如果存在,则返回这个字符在字符数组中第一次出现的位置(序号从0开始计算),
否则,返回-1。要搜索的字符数组和字符都以参数形式传递传递给该方法,
如果传入的数组为null,应抛出IllegalArgumentException异常。
在类的main方法中以各种可能出现的情况测试验证该方法编写得是否正确,
例如,字符不存在,字符存在,传入的数组为null等。
getIndex(null,'a');


public int getIndex(char[] arr,char key)
{
	if(arr==null)
		throw new IllegalArgumentException("数组为null");
	for(int x=0; x<arr.length; x++)
	{
		if(arr[x]==key)
		return x;
	}
	return -1;
}



====================================================================
26.
补足compare函数内的代码,不许添加其他函数。
class Circle
{	
	private double radius;
	public Circle(double r)
	{
		radius=r;
	}
	public Circle compare(Circle cir)
	{
		//程序代码
		/*
		if(this.radius>cir.radius)
			return this;
		return cir;
		*/


		return (this.radius>cir.radius)?this: cir;
		
	}
}
class TC
{
	public static void main(String[] args)
	{
		Circle cir1=new Circle(1.0);
		Circle cir2=new Circle(2.0);
		Circle cir;
		cir=cir1.compare(cir2);
		if(cir1==cir)
			System.out.println("圆1的半径比较大");
		else
			System.out.println("圆2的半径比较大");
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值