zoukankan      html  css  js  c++  java
  • 第三次作业

    (一)学习总结#

    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

  • 相关阅读:
    背水一战 Windows 10 (26)
    背水一战 Windows 10 (25)
    背水一战 Windows 10 (24)
    背水一战 Windows 10 (23)
    背水一战 Windows 10 (22)
    背水一战 Windows 10 (21)
    背水一战 Windows 10 (20)
    背水一战 Windows 10 (19)
    背水一战 Windows 10 (18)
    背水一战 Windows 10 (17)
  • 原文地址:https://www.cnblogs.com/-lyf/p/8886475.html
Copyright © 2011-2022 走看看