实验二 Java面向对象高级语法实验1

实验二 Java面向对象高级语法实验1
一、实验学时
4学时
二、实验目的
(一)掌握一些特殊的修饰类成员的修饰符,抽象方法与抽象类的关系;
(二)掌握如何声明和实现一个或多个接口;
(三)要认识内部类,如何定义内部类,如何访问内部类。

三、预习要求
熟悉静态变量、静态方法、实例变量、实例方法之间的关系;了解抽象类与抽象方法的概念,以及接口和内部类的概念等。

四、实验内容
(一)观察下列程序的输出结果,并分析静态变量和实例变量是如何访问的?
class Example05_1 {
int a = 1;
static int b = 2;
}
class Example05_1Demo {
public static void main(String args[]) {
System.out.println(“b=” + Example05_1.b);
Example05_1.b *= 2;
Example05_1 o1 = new Example05_1 ();
o1.a = 10;
System.out.println(“o1.a=”+ o1.a);
System.out.println(“b=”+ o1.b);
Example05_1 o2=new Example05_1 ();
System.out.println(“o2.a=” + o2.a);
System.out.println(“b=”+ o2.b);
}
}
其中在类Example05_1中定义了两个成员变量a、b,其中变量b有static修饰,所以变量b为静态变量,如果想访问静态变量b,通过类名来访问Example05_1.b即可。如果想访问实例变量a,就要通过对象实例来访问o1.a或o2.a。静态变量b是在各对象实例间共享,而实例变量a是每个对象实例都独有的。

(二)设计一个人员类(Person),其中包含一个方法pay,代表人员的工资支出。再从Person类派生出教师类(Teacher)和大学生类(CollegeStudent)其中:
教师:工资支出=基本工资+授课时数*30
大学生:奖学金支出
将人员类定义为抽象类,pay为抽象方法,设计程序实现多态性。

(三)分析下面程序,使用System.out.println() 分别实现sleep()和message()方法,并增加main方法打印输出结果,掌握接口的概念与使用方法。
interface Sittable{
void sit();
}
interface Lie{
void sleep();
}
interface HealthCare{
void massage();
}
class Chair implements Sittable{
public void sit(){System.out.println(“This is sit method”);}
}
/interface Sofa extends Sittable,Lie //接口可以实现多重继承,用逗号相隔。
{
}
/
class Sofa extends Chair implements Lie,HealthCare//一个类既可以从父类中继承同时又可以实现多个接口。
{
public void sleep(){System.out.println(“This is sleep method”);}
public void massage(){System.out.println(“This is massage method”);}
}

(四)根据实验输出结果完善程序,掌握如何在外部类外访问内部类
class Outer
{
class Inner
{
int i=50;
}
}

public class InnerClassTest
{
public static void main(String[] args)
{
Outer.Inner on1=new Outer().new Inner();
System.out.println(“i is :”+on1.i);

}

}

实验输出结果如下:
i is :50

扩展:将class Inner{int i=50;}改成静态内部类static class Inner{int i=50;}之后,访问方式有什么变化吗?
有变化
原访问方式会报错对于类型 Outer.Inner,这是非法外层实例指定

(五)设计一个银行帐户类,成员变量包括账号、储户姓名、开户时间、身份证号码、存款余额等帐户信息,成员方法包括存款、取款操作。
package sample;
//设计一个银行帐户类,成员变量包括账号、储户姓名、开户时间、身份证号码、存款余额等帐户信息,成员方法包括存款、取款操作。
class BankAccount{
private int sum,year,month,day;
private String Account,Name,IDnum;
public void deposit(int k) {
sum+=k;
}
public int withdraw(int n) {
if(sum>=n) {
sum-=n;
return n;
}
else {
sum=0;
return sum;
}
}
int getSum() {
return sum;
}
}
public class Test3 {
public static void main(String[] args) {
BankAccount p=new BankAccount();
p.deposit(300);
System.out.println(“存款后余额”+p.getSum());
p.withdraw(30);
System.out.println(“取款后余额”+p.getSum());
}
}

五、实验注意事项
(一)实例变量或者类变量在定义初始化时,都不能超前引用;实例方法既可以使用实例变量,又可以使用静态变量;而静态方法只能使用静态变量,不能直接使用实例变量。
(二)抽象类不能被直接实例化;抽象方法只需声明,而无需实现,定义了抽象方法的类必须是用abstract修饰的抽象类。
(三)在子类中可以使用接口中定义的常量,而且必须实现接口中定义的所有方法,否则子类就变为抽象类了。
(四)利用接口可以实现多重继承,即一个类可以实现多个接口,在implements子句中用逗号分隔。
(五)在创建匿名内部类同时必须创建匿名内部类对象,否则以后将不能创建匿名内部类对象。
六、思考题
(一)内部类主要分为哪几种?请简单描述每一类。
四类
对象成员内部类:在一个类的内部被声明,可以访问外部类的任何成员;在创建时,需要先创建外部类对象,然后以外部类对象为标识来创建内部类对象;

静态成员内部类:在一个类的内部被声明,可以访问外部类的任何成员;在创建时,不需要先创建外部类,可直接创建该内部类对象,创建时需指明该内部类属于哪个外部类

局部内部类:是定义在方法体或者更小语句块中的类;不能为它声明访问控制符,也不能含有static成员。

匿名内部类:没有名字的类,无构造方法和访问控制符。常用于扩展一个现有的类,或者实现一个接口。

(二)关键字static可以修饰哪些类的组成部分?
类的数据,方法,内部类。
(三)抽象方法有什么特点?抽象方法的方法体在何处定义?定义抽象方法有什么好处?
特点:不提供实现,且定义了抽象方法的类必须定义为抽象类。
在何处定义:抽象方法在抽象类的内部定义。
好处:定义抽象方法可以实现多态。
(四)final修饰符可以用来修饰什么?被final修饰符修饰后有何特点?
方法:被修饰的方法无法被改写
类:被修饰的类无法被继承
变量、参数:被修饰后无法被修改
对象:被修饰的对象内容可以修改,但引用不可变。
(五)创建接口使用什么关键字?接口可以有父接口吗?试书写语句创建—个名为MyInterface的接口,它是继承了MySuperInterface1和MySuperInterface2两个接口的子接口。之后再写一个具体类实现MyInterface接口。
创建接口使用的关键字为:interface;
接口可以有父接口;
package sample;
interface MySuperInterface1{

}
interface MySuperInterface2{

}
interface MyInterface extends MySuperInterface1,MySuperInterface2{
void myprint(final String s);
}
class fn implements MyInterface{
public void myprint(final String s) {
// TODO 自动生成的方法存根
System.out.println(s);
}
}
public class Test4 {
public static void main(String[] args) {
fn t=new fn();
t.myprint(“Hello World”);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谁的BUG最难改

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值