封装和继承作业

一、选择题

1.

使用权限修饰符(B)修饰的类的成员变量和成员方法,可以被当前包中所有类访问,也可以被它的子类(同一个包以及不同包中的子类)访问。(选择一项)

A

public

B.

protected

C.

默认

D.

private

2.

给出如下代码,如何使成员变量m被方法fun()直接访问( C)。(选择一项)

classTest {

privateintm;

publicstaticvoidfun() {

}

}

A

将private int m 改为protected int m

B.

将private int m 改为public int m

C.

将private int m 改为static int m

D.

将private int m 改为int m

3.

以下关于继承条件下构造方法执行过程的代码的执行结果是( A。(选择一项)

classPerson {

publicPerson() {

System.out.println(“execute Person()”);

}

}

classStudentextendsPerson {

publicStudent() {

System.out.println(“execute Student() “);

}

}

classPostGraduateextendsStudent {

publicPostGraduate() {

System.out.println(“execute PostGraduate()”);

}

}

publicclassTestInherit {

publicstaticvoidmain(String[] args) {

newPostGraduate();

}

}

A.

execute Person()

execute Student()

execute PostGraduate()

B.

execute PostGraduate()

C.

execute PostGraduate()

execute Student()

execute Person()

D.

没有结果输出

4.

以下关于thissuper关键字的说法错误的是( BD。(选择二项)

A.

this关键字指向当前对象自身,super关键字指向当前对象的直接父类

B.

在main方法中可以存在this或super关键字,但不能同时存在。

C.

this和super关键字都可以访问成员属性,成员方法和构造方法

D.

在一个类的构造方法中可以同时使用this和super来调用其他构造方法

5.

给出下面的代码段,在代码说明//assignment x=a,y=b处写入如下(D)个代码是正确的。(选择一项)

publicclassBase {

intw, x, y, z;

publicBase(inta,intb) {

x = a;

y = b;

}

publicBase(inta,intb,intc,intd) {

// assignment x=a,y=b

w = d;

z = c;

}

}

A

Base(a,b);

B.

x=a,y=b;

C.

this(a),this(b);

D.

this(a,b)

6.

以下Java程序编译运行后的输出结果是(A)。(选择一项)

classHelloA {

publicHelloA( ) {

System.out.println(“HelloA”);

}

{ System.out.println(“I’m A class”);

}

static{

System.out.println(“static A”);

}

}

publicclassHelloBextendsHelloA {

publicHelloB( ) {

System.out.println(“HelloB”);

}

{ System.out.println(“I’m B class”);

}

static{

System.out.println(“static B”);

}

publicstaticvoidmain(String[] args) {

newHelloB( );

}

}

A

static A

static B

I’m A class

HelloA

I’m B class

HelloB

C.

static A

I’m A class

HelloA

static B

I’m B class

HelloB

B.

static A

static B

I’m A class

I’m B class

HelloA

HelloB

D

static A

static B

HelloA

HelloB

I’m A class

I’m B class

7.

下列选项中关于Javasuper关键字的说法正确的是( AD)。(选择二项)

A

super关键字是在子类对象内部指代其父类对象的引用

B.

super关键字不仅可以指代子类的直接父类,还可以指代父类的父类

C.

子类通过super关键字只能调用父类的方法,而不能调用父类的属性

D.

子类通过super关键字可以调用父类的构造方法

二、判断题

  1. 使用public修饰的成员属性和方法可以被当前项目中所有包的所有类访问。( T )
  2. 类的方法通常设为public,而类的实例变量一般也设为public。(F )
  3. 与未加访问控制符的缺省情况相比,public和protected修饰符扩大了类及其属性和方法的被访问范围,private修饰符则缩小了这种范围。( T )
  4. 访问权限是private的变量,只能在本类和与本类同一个包中的其他类使用。( F )
  5. 如果定义一个类时没有使用extends,则它的父类是java.lang.Object。( T )
  6. 对子类实例化对象需要调用超类的构造函数进行初始化工作,完成对子类中的超类实例变量的初始化,则子类可以继承超类的构造函数。(F )
  7. 在Java中任何一个子类的构造方法都必须调用其父类的构造方法(包括隐式调用),并且调用父类的构造方法的语句必须是子类构造方法的第一条语句。( F)
  8. Java中的类不允许多重继承,一个类只能有有一个直接父类。(T)
  9. Object类有一个public方法是toString( ),一个对象通过调用该方法可以获得该对象的字符串表示。( T )
  10. 运算符“==”用于比较引用时,如果两个引用指向内存同一个对象,则返回true。( T )

三、简答题

1、private、默认、protected、public四个权限修饰符的作用.

 答:访问修饰符:可以修饰变量,方法,类

修饰变量:四种修饰符都能使用

修饰方法:四种修饰符都能使用

修饰类:2种 public,default

2、方法重载和方法重写(覆盖)的区别。.

  (1)方法重载:存在一个类中

方法名必须相同

参数列表不同(参数个数,类型,顺序不同)

与返回值无关

(2)方法重写:存在子父类中,子类把父类的方法重写一遍

返回值,方法名,参数列表必须一致

子类的访问修饰符要大于等于父类的访问修饰符

3、java.lang.Object类的六个常用方法的声明并说明其作用。

 (1)Object类有一个默认构造方法pubilcObject(),在构造子类实例时,都会先调用这个默认构造 方法。

(2) equals()方法:用于测试某个对象是否同另一个对象相等。它在Object类中的实现是判断两个 对象是否指向同一块内存区域。

(3)toString():返回该对象的字符串表示。Object类中的toString()方法会打印出类名和对象的内 存位置。几乎每个类都会覆盖该方法,以便打印对该对象当前状态的表示。

(4) finalize

protected void finalize()

 throws Throwable

  当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重 写finalize方法,以配置系统资源或执行其他清除。

(5)wait

    public final void wait()

throws InterruptedException

 导致当前的线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法。换句话说, 此方法的行为就好像它仅执行wait(0)调用一样。

(6)notify

    public final void notify()

  唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中 一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个wait方法, 在对象的监视器上等待。

4、继承条件下子类构造方法的执行过程

(1)子类的构造过程中必须调用其基类的构造方法。

 (2)子类可以在自己的构造方法中使用super(argument_list)调用基类的构造方法

  a、使用this(argument_list)调用本类的另外构造方法。

   b、如果调用super,必须写在子类构造方法的第一行。

  (3)如果子类的构造方法中没有显示的调用基类的构造方法,则系统默认调用基类的无参数构造 方法。

  (4)如果子类构造方法中既没有显示调用基类构造方法,而基类又没有无参数的构造方法,则编 译出错。

5、super关键字的作用和使用

     super子类可以通过它调用父类的方法 写在构造方法的第一行

6、==和equals()的联系和区别

 (1)基本数据类型

  也称原始数据类型。byte,short,char,int,long,float,double,boolean他们之间的比较,应用双等 号(==),比较的是他们的值。

 (2)复合数据类型(类)

  当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个 new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类 都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的 初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如 String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放 地址了。

对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较 还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号 (==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。

四、编程题

1. 使用面向对象的思想,编写自定义描述狗的信息。设定属性包括:品种,年龄,心情,名字;方法包括:叫,跑。

要求:

1) 设置属性的私有访问权限,通过公有的get,set方法实现对属性的访问

2) 限定心情只能有“心情好”和“心情不好”两种情况,如果无效输入进行提示,默认设置“心情好”。

3) 设置构造函数实现对属性赋值

4) 叫和跑的方法,需要根据心情好坏,描述不同的行为方式。

5) 编写测试类,测试狗类的对象及相关方法(测试数据信息自定义)

 class Dog {    private String type;    private int age;    private String feeling="心情好";    private String name;    public Dog(String name,String type,int age,String feeling){        this.setAge(age);;        this.setFeeling(feeling);        this.setType(type);        this.setName(name);    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getType() {        return type;    }    public void setType(String type) {        this.type = type;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getFeeling() {        return feeling;    }    public void setFeeling(String feeling) {        if(feeling.equals("心情好") || feeling.equals("心情不好")){            this.feeling = feeling;            System.out.println("输入信息正确,这只狗狗"+feeling);        }else{            System.out.println("输入信息错误,这只狗狗今天"+this.feeling);        }    }    public void shout(){        System.out.println("名字叫"+this.name+"的"+this.type+"呜呜的叫");    }    public void run(){        System.out.println("名字叫"+this.name+"的"+this.type+"快乐的奔跑");    }}public class Test1 {    public static void main(String[] args) {        Dog d=new Dog("旺财","泰迪",12,"不知道") ;        d.shout();        d.run();        System.out.println("=============================================");        Dog g=new Dog("大黄","阿拉斯加",8,"心情不好");        g.shout();        g.run();    }}

2. 以面向对象的思想,编写自定义类描述IT从业者。设定属性包括:姓名,年龄,技术方向,工作年限, 工作单位和职务;方法包括:工作

要求:

1) 设置属性的私有访问权限,通过公有的get,set方法实现对属性的访问

2) 限定IT从业人员必须年满15岁,无效信息需提示,并设置默认年龄为15。

3) 限定“技术方向”是只读属性

4) 工作方法通过输入参数,接收工作单位和职务,输出个人工作信息

5) 编写测试类,测试IT从业者类的对象及相关方法(测试数据信息自定义)

 class IT {    private String name;    private int age;    private String tend;    private int workAge;    private String workPlace;    private String job;    // 无参构造器    public IT() {        super();        // TODO Auto-generated constructor stub(指的是自动生成的构造函数)    }    // 有参构造器    public IT(String name, int age, String tend, int workAge, String workPlace, String job) {        super();        this.name = name;        this.age = age;        this.tend = tend;        this.workAge = workAge;        this.workPlace = workPlace;        this.job = job;    }    // get,set方法    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        if (age <= 15) {            this.age = 15;            System.out.println("年龄无效,默认值是15");        } else {            this.age = age;        }    }    public String getTend() {        return tend;    }    public void setTend(String tend) {        this.tend = tend;    }    public int getWorkAge() {        return workAge;    }    public void setWorkAge(int workAge) {        this.workAge = workAge;    }    public String getWorkPlace() {        return workPlace;    }    public void setWorkPlace(String workPlace) {        this.workPlace = workPlace;    }    public String getJob() {        return job;    }    public void setJob(String job) {        this.job = job;    }    // 工作方法    public void work() {        System.out.println("姓名:" +name);        System.out.println("年龄:" + age);        System.out.println("技术方向: " + tend);        System.out.println("工作年限: " + workAge);        System.out.println("工作单位: " + workPlace);        System.out.println("职务: " + job);    }}public class Test2 {    public static void main(String[] args) {        IT t = new IT("wade", 35, "数据库维护", 10, "腾讯实业", "数据库维护工程师");        t.work();        System.out.println("--------------------");        IT t1 = new IT();        t1.setName("阿杰");        t1.setAge(6);        t1.setTend("Java开发");        t1.setWorkAge(1);        t1.setWorkPlace("鼎盛科技");        t1.setJob("Java开发工程师");        t1.work();    }}

五、可选题

1. 以面向对象的思想,编写自定义类描述图书信息。设定属性包括:书名,作者,出版社名,价格;方法包括:信息介绍

要求:

1) 设置属性的私有访问权限,通过公有的get,set方法实现对属性的访问

2) 限定介格必须大于10,如果无效进行提示

3) 限定作者,书名境外为只读属性

4) 设计构造方法实现对属性赋值

5) 信息介绍方法描述图书所有信息

6) 编写测试类,测试图书类的对象及相关方法(测试数据信息自定)

 class BookInformation {    private String name;    private String author;    private String publish;    private double price;    public String getName() {        return name;    }    public String getAuthor() {        return author;    }    public String getPublish() {        return publish;    }    public double getPrice() {        return price;    }    public void setName(String name) {        this.name = name;    }    public void setAuthor(String author) {        this.author = author;    }    public void setPublish(String publish) {        this.publish = publish;    }    public void setPrice(double price) {        this.price = price;    }    //书信息介绍    public void introduce() {        System.out.println("书名:" + getName());        System.out.println("作者:" + getAuthor());        System.out.println("出版社:" + getPublish());        System.out.println("价格:" + getPrice() + "元");    }}    public class Test3 {        public static void main(String[] args) {            BookInformation b1 = new BookInformation();            b1.setName("鹿鼎记");            b1.setAuthor("金庸");            b1.setPublish("人民出版社");            b1.setPrice(120);            b1.introduce();            System.out.println("======================");            BookInformation b2 = new BookInformation();            b2.setName("绝代双骄");            b2.setAuthor("古龙");            b2.setPublish("中国长安出版社");            b2.setPrice(55);            b2.introduce();        }    }

2. 某公司要开发名为”我爱购物狂”的购物网站,请使用面向对象的思想设计描述商品信息

要求:

1) 分析商品类别和商品详细信息属性和方法,设计商品类别类和商品详细信息类

2) 在商品详细信息类中通过属性描述该商品所属类别

3) 设置属性的私有访问权限,通过公有的get,set方法实现对属性的访问

4) 编写测试类,测试商品类别类和商品详细信息类的对象及相关方法(测试数据信息自定)

5) 创建包info—存放商品类别类和商品详细信息类,创建包test—存放测试类

参考分析思路:

商品类别类:

属性:类别编号,类别名称

商品详细信息类:

属性:商品编号,商品名称,所属类别,商品数量(大于0),商品价格(大于0),

方法:盘点的方法,描述商品信息。内容包括商品名称,商品数量,商品价格,现在商品总价以及所属类别信息

//商品类别类 class GoodsType {    private String typeName;    private long typeNum;    public String getTypeName() {        return typeName;    }    public void setTypeName(String typeName) {        this.typeName = typeName;    }    public long getTypeNum() {        return typeNum;    }    public void setTypeNum(long typeNum) {        this.typeNum = typeNum;    }}//商品详细信息类 class GoodsInfo {    GoodsType gt=new GoodsType();    private String goodsName;    private double price;    private int inventory;    public GoodsInfo(GoodsType gt,String goodsName,double price,int inventory){        if(inventory>0 ){            this.inventory=inventory;        }else{            System.out.println("库存数量异常,请联系管理员");        }        this.gt=gt;        this.goodsName=goodsName;        this.price=price;    }    public GoodsType getGt() {        return gt;    }    public void setGt(GoodsType gt) {        this.gt = gt;    }    public String getGoodsName() {        return goodsName;    }    public void setGoodsName(String goodsName) {        this.goodsName = goodsName;    }    public double getPrice() {        return price;    }    public void setPrice(double price) {        this.price = price;    }    public int getInventory() {        return inventory;    }    public void setInventory(int inventory) {        this.inventory = inventory;    }    public void print(){        System.out.println("商品名称: "+this.goodsName);        System.out.println("所属类别: "+this.gt.getTypeName());        System.out.println("库存数量: "+this.inventory);        System.out.println("商品售价: "+this.price);        System.out.println("商品总价: "+this.price*this.inventory);    }}public class Test4 {    public static void main(String[] args) {        GoodsType gt=new GoodsType();        gt.setTypeName("洗发水");        GoodsInfo g=new GoodsInfo(gt,"潘婷洗发水400ml",40.5,16);        g.print();        System.out.println("##################################");        gt.setTypeName("洗发水");        GoodsInfo i=new GoodsInfo(gt,"蜂花洗发水250ml",11.1,0);        i.print();    }}