第三次作业

(一)学习总结#

1.阅读下面程序,分析是否能编译通过?如果不能,说明原因。应该如何修改?程序的运行结果是什么?为什么子类的构造方法在运行之前,必须调用父 类的构造方法?能不能反过来?##

class Grandparent {
    public Grandparent() {
        System.out.println("GrandParent Created.");
    }
    public Grandparent(String string) {
        System.out.println("GrandParent Created.String:" + string);
    }
}class Parent extends Grandparent {
    public Parent() {        
        System.out.println("Parent Created");
        super("Hello.Grandparent.");
    }
}class Child extends Parent {
    public Child() {
        System.out.println("Child Created");
    }
}
public class Test{
    public static void main(String args[]) {
        Child c = new Child();
    }
}

不能通过编译,因为不能在调用父类的构造方法之前,运行子类的构造方法。
运行的结果为

GrandParent Created.String:Hello.Grandparent.
Parent Created
Child Created

构造方法继承原则
1.子类无条件地继承父类的不含参数的构造方法。
2.若子类没有定义自己的构造方法,它将继承父类无参数的构造方法作为自己的构造方法。
3.若子类定义了自己的构造方法,它先执行继承自父类的无参数构造方法,再执行自己的构造方法。
4.对父类含参数的构造方法,子类可以通过在定义自己的构造方法中使用super关键字来调用它,但这个调用语句必须是子类构造方法的第一个可执行语句。
5.子类构造方法没有显式调用父类构造方法,而父类又没有无参构造方法时,则编译出错。

1.如果子类没有定义构造方法,则调用父类的无参数的构造方法,. 
2.如果子类定义了构造方法,且其第一行没有super,则不论子类构造方法是有参数还是无参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。  若子类构造方法中第一行是有参数或无参数的super,则直接转到对应的有参或无参父类构造方法中,而不再是首先执行无参构造方法;  
3.如果某个构造方法调用类中的其他的构造方法,则可以用this(参数),切该语句放在构造方法的第一条

2.阅读下面程序,分析程序中存在哪些错误,说明原因,应如何改正?正确程序的运行结果是什么?##

class Animal{
  void shout(){
      System.out.println("动物叫!");
  }
}class Dog extends Animal{
      public void shout(){  
          System.out.println("汪汪......!");  
     }
      public void sleep() {
       System.out.println("狗狗睡觉......");
      } 
}public class Test{
    public static void main(String args[]) {
        Animal animal = new Dog(); 
        animal.shout();
        animal.sleep();
        Dog dog = animal;
        dog.sleep(); 
        Animal animal2 = new Animal();
        dog = (Dog)animal2;
        dog.shout();
    }
}

错误:

1.父类对象定义为子类对象称为向下转型,对于向下转型,需要强制转型,即必须明确指明要转型的子类类型: 格式:子类名称 子类对象 =(子类)父类实例;
animal是子类Dog的上转型对象,上转型对象不能操作子类新增加的成员变量,不能使用子类新增的方法。
2.animal是一个新定义的父类对象,即父类引用的对象是父类本身。父类对象不能确定dog是自己的子类,需要使用instanceof关键字避免此错误。

修改方法:

class Animal{
	  void shout(){
	      System.out.println("动物叫!");
	  }
	}
	class Dog extends Animal{
	      public void shout(){  
	          System.out.println("汪汪......!");  
	     }
	      public void sleep() {
	       System.out.println("狗狗睡觉......");
	      } 
	}
	public class animals{
	    public static void main(String args[]) {
	        Animal animal = new Dog(); 
	        animal.shout();
	        Dog dog = (Dog)animal;
	        dog.sleep(); 
	        Animal animal2 = new Animal();
	        dog = (Dog)animal2;
	        dog.shout();
	    }
}

运行结果:

汪汪......!
狗狗睡觉......

3.运行下列程序##

class Person { 
   private String name ; 
   private int age ; 
   public Person(String name,int age){ 
         this.name = name ; 
         this.age = age ; 
   } 
}public class Test{  
      public static void main(String args[]){ 
             Person per = new Person("张三",20) ; 
             System.out.println(per);
             System.out.println(per.toString()) ; 
  } 
}

(1)程序的运行结果如下,说明什么问题?

Person@166afb3
Person@166afb3

因为没有进行toString方法重写,所以输出对象和输出对象的toString方法的结果相同

(2)那么,程序的运行结果到底是什么呢?利用eclipse打开println(per)方法的源码,查看该方法中又调用了哪些方法,能否解释本例的运行结果?

public void println(Object x) 
{ String s = String.valueOf(x);
 synchronized (this) { 
print(s); 
newLine(); 
}
 } 
valueOf(x) //if the argument is null, then a string equal to "null";
 otherwise, the value of obj.toString() is returned.

(3)在Person类中增加如下方法

public String toString(){ 
        return "姓名:" + this.name + ",年龄:" + this.age ; 
 } 

重新运行程序,程序的执行结果是什么?说明什么问题?
可参考教材P229
输出结果:
姓名:张三,年龄:20
姓名:张三,年龄:20
说明pbject类中的toString方法输出的是对象的引用,只有通过重写toString方法才可以输出具体的内容

4.汽车租赁公司,出租汽车种类有客车、货车和皮卡三种,每辆汽车除了具有编号、名称、租金三个基本属性之外,客车有载客量,货车有载货量,皮卡则同时具有载客量和载货量。用面向对象编程思想分析上述问题,将其表示成合适的类、抽象类或接口,说明设计思路。现在要创建一个可租车列表,应当如何创建##

定义一个抽象类,具有编号、名称和租金属性,定义两个接口,分别定义载客量和载货量属性,定义客车类继承抽象类和实现载客量接口,火车类继承抽象类和载货量接口,皮卡类继承抽象类和两个接口

5.阅读下面程序,分析代码是否能编译通过,如果不能,说明原因,并进行改正。如果能,列出运行结果##

    interface Animal{    
        void breathe();
        void run();
        void eat();
    }
    class Dog implements Animal{
        public void breathe(){
            System.out.println("I'm breathing");
        }
        void eat(){
            System.out.println("I'm eating");
        }
    }
    public class Test{
        public static void main(String[] args){
            Dog dog = new Dog();
            dog.breathe();
            dog.eat();
        }
}

不能通过编译。
1.在类的声明中用implements子句来表示一个类使用某个接口,在类中可以使用接口中定义的常量,而且必须实现接口中定义的所有方法。
2.在类中实现接口所定义的方法时,必须显式地使用public修饰符,否则将被系统警告为缩小了接口中定义的方法的访问控制范围。
修改:
1.在Dog类中添加public void run()

Public void run(){
    Syste.out.println(“I’m running”);
}

2.在void eat前边加public
修改代码如下

 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 eating");
        }
		public void run() {
			// TODO Auto-generated method stub
			System.out.println("I'm running");
		}
    }
    public class text11{
        public static void main(String[] args){
            Dog dog = new Dog();
            dog.breathe();
            dog.eat();
            dog.run();
        }
}

运行结果如下:

6.总结##

1继承概念和设计:
*在Java中,所有类都直接或间接的继承java.lang.Object类,没有extends,默认父类为Object。
*一个子类只能有一个父类,单继承,但一个父类可以有多个子类.
*类继承具有传递性
*子类不能继承访问权限为private的成员变量和方法
2.构造方法的继承原则:
*子类无条件地继承父类的不含参数的构造方法。
*若子类没有定义自己的构造方法,它将继承父类无参数的构造方法作为自己的构造方法。
*若子类定义了自己的构造方法,它先执行继承自父类的无参数构造方法,再执行自己的构造方法。
*对父类含参数的构造方法,子类可以通过在定义自己的构造方法中使用super关键字来调用它,但这个调用语句必须是子类构造方法的第一个可执行语句。
*子类构造方法没有显式调用父类构造方法,而父类又没有无参构造方法时,则编译出错。
3.super键字和final关键字
(1)super
*访问的父类中的成员变量和成员方法
super.变量名
super.方法([参数表])
*调用父类的构造方法
super([参数表])
(2)final
*定义的类没有子类
*声明的方法不能被子类覆盖
*声明的变量即为常量(声明的时候给出具体内容)
4.上转型对象
向上转型:子类对象——>父类对象;
格式:父类名称 父类对象=子类实例
向下转型:父类对象——>子类对象;
格式:子类名称 子类对象=父类实例
5.抽象类和接口
(1)抽象类
*不能用final关键字
*可以有抽象方法,也可以没有
*不能使用new运算符创建该类对象,只能产生其子类,由子类创建对象。
*抽象类的子类必须实现父类的所有抽象方法
(2)接口
*在类中实现接口所定义的方法时,方法的声明必须与接口中所定义的一样
*抽象类可以不实现接口的抽象方法,而非抽象类必须实现接口中的所有方法

(二)实验总结#

实验四:##

1.基本思路:
(1)定义Bank类,输入属性;
(2)使用静态方法welcome()方法,借助输出语句将“欢迎来到建设银行”及基本操作“1.开户;2.存款;3.取款;4.退出;请选择您需要的服务选项”。
(3)通过构造方法实现。

2基本思路:
(1)定义员工类,具有姓名、年龄、性别属性,并具有构造方法和显示数据方法。
(2)定义管理层类,继承员工类,有自己的属性职务和年薪
(3)定义职员类,继承员工类,并有自己的属性所属部门和月薪。
(4)定义一个测试类,进行测试。

实验五##

1宠物商店;
基本思路:
(1)在Pet类中,实现接口,声明宠物基本属性信息
(2)创建Cat类和Dog类,并完成get(),set()方法;
(3)在Shop类中实现(1)展示所有宠物;(2)购买宠物;(3)展示购买清单

(三)代码托管#

https://gitee.com/hebau_java_cs16/shiyansiwu/tree/master

posted @ 2018-04-19 21:51  <柚子  阅读(291)  评论(0编辑  收藏  举报