• three


    一)学习总结

    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();
    }
    }
    不能通过编译,父类中已经有含参方法,继承了爷爷类,所以应该用super继承

    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() {
    super("Hello.Grandparent.");
    System.out.println("Parent Created");

    }
    

    }
    class Child extends Parent {
    public Child() {
    System.out.println("Child Created");
    }
    }
    public class Test{
    public static void main(String args[]) {
    Child c = new Child();
    }
    }
    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();
    }
    }
    没有为类型 Animal 定义方法 sleep();
    类型不匹配:不能从 Animal 转换为 Dog
    程序有错误,,,

    然后改写了

    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 = (Dog) animal;
    dog.sleep();
    Animal animal2 = new Animal();
    if(animal2 instanceof Dog)
    {
    dog = (Dog)animal2;
    dog.shout();
    }
    }
    }
    animal是子类Dog的向上转型对象,向上转型对象不能操作子类新增加的成员变量
    父类对象定义为子类对象称为向下转型,对于向下转型,需要强制转型,
    即必须明确指明要转型的子类类型: 格式:子类名称 子类对象 =(子类)父类实例;

    animal2是一个新定义的父类对象,即父类引用的对象是父类本身。父类对象不能确定dog是自己的子类。需要使用instanceof关键字避免此错误。

    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

    System.out.println(per);默认调用父类Object 的toString方法。及运行两次相同程序,所以他运行程序一样

    (2)那么,程序的运行结果到底是什么呢?利用eclipse打开println(per)方法的源码,查看该方法中又调用了哪些方法,能否解释本例的运行结果?
    然后不知道源码知道在上边有源码,不过不太会用
    源码就是指编写的最原始程序的代码。运行的软件是要经过编写的,程序员编写程序的过程中需要他们的“语言”。音乐家用 五线谱,建筑师用图纸,那程序员的工作的语言就是“源码”了。
    人们平时使用软件时就是程序把“源码”翻译成我们可直观的形式表现出来供我们使用的。 [1]
    任何一个网站页面,换成源码就是一堆按一定格式书写的文字和符号,但我们的浏览器帮我们翻译成眼前的模样了。

    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 ;
    }

    重新运行程序,程序的执行结果是什么?说明什么问题?
    package text;
    class Person {
    private String name ;
    private int age ;
    public Person(String name,int age){
    this.name = name ;
    this.age = age ;
    }

    public String toString(){
    return "姓名:" + this.name + ",年龄:" + this.age ;
    }
    }
    public class text{
    public static void main(String args[]){
    Person per = new Person("张三",20) ;
    System.out.println(per);
    System.out.println(per.toString()) ;
    }
    }
    姓名:张三,年龄:20
    姓名:张三,年龄:20
    说明在Person类中完成了对父类Object的toString类的重写。

    4.汽车租赁公司,出租汽车种类有客车、货车和皮卡三种,每辆汽车除了具有编号、名称、租金三个基本属性之外,客车有载客量,货车有载货量,皮卡则同时具有载客量和载货量。
    用面向对象编程思想分析上述问题,将其表示成合适的类、抽象类或接口,说明设计思路。现在要创建一个可租车列表,应当如何创建?
    (1)定义一个抽象类,具有编号、名称、租金三个属性;
    对每个属性分别定义get,set方法。
    (2)定义两个接口:载货量、载客量;
    (3)定义三个子类继承抽象类,客车类实现载客量接口,火车类实现载货量接口,皮卡类实现载客量和载货量接口。

    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();
        }
    }
    

    :接口中方法,默认是public abstract 所以在子类实现抽象方法时,应该用public修饰

    interface Animal{    
        void breathe();
        void run();
        void eat();
    }
    class Dog implements Animal{
        public void breathe(){
            System.out.println("I'm breathing");
        }
        public void run()
        {
            
        }
        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]
    任何一个网站页面,换成源码就是一堆按一定格式书写的文字和符号,但我们的浏览器帮我们翻译成眼前的模样了。

    多态性是指同名的不同方法在程序中共享,即为同一个方法定义几个版本,运行时根据不同情况执行不同的版本。
    一个名字,多个方法
    多态性的实现:
    覆盖实现多态:(子类重写父类中的方法)
    重载实现多态(同一个类中的同名方法)
    相同的一条语句在不同的运行环境中可以产生不同的运行结果。

    覆盖实现多态:

    子类方法的返回类型、参数、方法名称要和父类的返回类型、参数、方法名称完全一样,否则编译出错。
    被覆盖的方法不能为private
    子类方法不能缩小父类方法的访问权限。
    覆盖后的方法不能比被覆盖的方法产生更多的例外,即抛出更多的异常。
    根据调用对象区分调用的方法
    重载实现多态:

    方法名相同
    方法的参数类型,个数,顺序至少有一项不同
    根据形参来决定调用的是哪个方法

    接口与类的不同在于:

    (1) 没有变量的声明,但可以定义常量。

    (2) 只有方法的声明,没有方法的实现。

    接口只是一个特殊的类,只包含全局常量和抽象方法,
    接口的抽象方法可以不加abstract。
    抽象类的抽象方法必须有abstract关键字。
    一个类只能继承一个父类,但是可以同时实现多个接口。
    一个接口可以同时继承多个接口(extends),以实现接口的多继承。
    接口和抽象类一样,都必须依靠子类。
    一个抽象类可以实现多个接口,但是一个接口不能继承一个抽象类。

    接口的定义:
    [public] interface 接口名称 [extends 父接口列表]
    {
    //抽象方法和全局常量
    }
    public指明任意类均可使用这个接口,缺省时,表明只有与接口定义在同一个包中的类才可访问此
    extends是关键字,父接口列表表示一个接口可以有多个父接口,用逗号分开,而类只能有一个父类。子接口继承父接口中所有的常量和方法。
    接口中没有自身的构造方法。
    在接口中定义的常量必须是pubilc static final,这是系统默认的规定,所以常量也可以没有任何修饰符。
    接口中只有方法声明,而无方法实现,接口中声明的方法必须是public abstract,也是系统默认的规定。
    接口定义的完整格式:
    interface A{
    public static final String AUTHOR = "李兴华" ; // 定义全局常量
    public abstract void print() ; // 定义抽象方法
    public abstract String getInfo() ; // 定义抽象方法
    }
    接口定义的简化格式:

    interface A{
    String AUTHOR = "李兴华" ; // 定义全局常量
    void print() ; // 定义抽象方法
    String getInfo() ; // 定义抽象方法
    }
    接口的实现:
    格式:

    class 类名 implements 接口列表 { 类体 }
    (1)在类的声明中用implements子句来表示一个类使用某个接口,在类中可以使用接口中定义的常量,而且必须实现接口中定义的所有方法。
    (2)一个类可实现多个接口,在implements子句中用逗号分隔。
    注意:

    在类中实现接口所定义的方法时,方法的声明必须与接口中所定义的完全一致。
    在类中实现接口所定义的方法时,必须显式地使用public修饰符,否则将被系统警 告为缩小了接口中定义的方法的访问控制范围。
    抽象类可以不实现接口的抽象方法,而非抽象类必须实现接口中的所有方法。
    接口的继承:
    格式:
    interface 子接口 extends 父接口A,父接口B,…{
    }
    (1)某动物园有一饲养员小李, 每天需要给他所负责饲养的一只狮子、五只猴子和十只鸽子喂食。 请用一个程序来模拟他喂食的过程。
    (2)利用抽象类和对象多态重构(1)中的程序,Animal类采用抽象类, 合并Feeder类中的方法
    (3)第二次重构,修改feedAnimals方法,让它接收一个Animal数组
    程序设计思路:在动物类里写eat()方法,在狮子,鸽子,猴子类里继承Animal()里的方法,定义饲养员类里面写饲养员姓名的属性和构造方法,还要写一个Animal animal[];,测试类需要用数组接收实例化。
    问题1:刚开始题都没看懂。
    解决方案:让别人给我讲了一遍题啥意思。
    问题2:给我讲题的告诉我要在类里定义一个数组,但是我不会用
    解决方案:看了看别人的代码,因为真的没听懂类里定义的那个数组怎么用。
    5.宠物商店
    宠物种类有猫、狗,宠物信息包括:编号、种类、品种、单价、数量。
    要求实现以下功能:
    (1)展示所有宠物
    (2)购买宠物
    (3)展示购买清单:显示购买的宠物品种,数量,价格合计及购买宠物的总价钱
    程序设计思路:定义一个Pet类,实现猫狗和Pet的接口,还要定义一个宠物商店。

    6.设计一个动物声音“模拟器”,希望模拟器可以模拟许多动物的叫声。要求如下:
    (1)接口Animal:有2个抽象方法cry()和getAnimaName(),要求实现该接口的各种具体动物类给出自己的叫声和种类名称。
    (2)模拟器类Simulator:有一个playSound(Animal animal)方法。即参数animal可以调用实现Animal接口类重写的cry()方法播放具体动物的声音、调用重写的getAnimalName()方法显示动物种类的名称。
    (3)实现Animal接口的Dog类和Cat类
    (4)
    程序设计思路:定义一个接口Animal,里面写方法,在实现猫狗和Animal的接口,在测试类直接定义猫和狗的名字

    73.模拟物流快递系统
    (1)定义一个抽象类交通工具类Transportation,属性:编号,型号,运输负责人。方法:无参构造和含三个参数的构造方法,get和set方法,抽象方法transport()
    (2)定义一个专用运输车类JDTransportation继承交通工具类,继承父类构造方法,实现transport()方法,输出一个运输信息。
    (3)定义一个接口GPS实现对货物的定位。接口中有方法showCoordinate()跟踪货物的位置信息。
    (4)定义一个类Phone实现GPS接口
    (5)定义一个快递任务类SendTask,具有私有属性:快递单号、货物重量。方法:无参和含参构造方法,get和set方法,
    sendBefore()方法输出运输前的检查信息和快递单号。
    send(Transportation t,GPS tool)方法输出运货人、车辆编号、型号信息,该方法中调用transport方法输出运输信息,调用showCoordinate()方法输出货物位置坐标。
    sendAfter( Transportation t )方法输出货物运输完成后的信息。
    (6)定义一个测试类,创建一个快递任务类对象,一个交通工具类对象,一个GPS工具对象。模拟物流快递过程。输出运输前、运输中和运输后的信息。
    程序运行效果参考如下。
    程序设计思路:定义需要的类及类里的属性和构造方法,定义需要的接口。在测试类实现

  • 相关阅读:
    java 笔记(2) 接口作为引用数据类型
    linux 笔记(5)让vi或vim显示行数和不显示行数
    linux 笔记(4)Ubuntu 使用时vi编辑器时,不能使用backspace键来进行退格或者不能正常使用
    linux 笔记(3)sudo passwd 设置root用户的密码
    matlab笔记(1) 元胞结构cell2mat和num2cell
    linux 笔记(2) 目录直接强行删除rm -rf *(删除当前目录所有的内容)
    linux 笔记(1) ctrl+c,ctrl+z,ctrl+d
    C51单片机项目:红绿灯
    C51单片机项目:时钟
    java 笔记(1)在子类中,一定要访问父类的有参构造方法?
  • 原文地址:https://www.cnblogs.com/0000-beauty/p/8886724.html
Copyright © 2020-2023  润新知