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

  • 相关阅读:
    重要网址(工具的使用)
    navicat的使用(测试库和正式库同步)以及用plsql改表字段属性
    linux
    linux一些基本命令
    LINUX的一些基本概念和操作
    LINUX简介
    Redis系统管理
    Redis之数据类型
    Redis的简介与安装
    论文阅读笔记(二十七)【AAAI2019】:A Bottom-Up Clustering Approach to Unsupervised Person Re-Identification
  • 原文地址:https://www.cnblogs.com/-lyf/p/8886475.html
Copyright © 2011-2022 走看看