zoukankan      html  css  js  c++  java
  • Java学习之面向对象三

    1、多态是什么,多态的前提条件是什么?

         多态就是父类引用变量指向子类对象;

         前提条件:必须有子父类关系或类实现接口关系;

    2、多态中成员访问的特点分别是什么?
         成员变量:

          当子父类中出现同名的成员变量,多态调用该变量时,

           编译时期:参考的是引用变量所属的类中是否有被调用的成员变量。没有编译失败;

          运行时期:也是调用引用型变量所属的类中的成员变量;

          简单记:运行编译看左边。
       成员方法(非静态方法)

           编译时期:参考引用变量所属的类,如果没有类中调用的方法,便以失败;

          运行时期:参考引用变量所指的对象所属的类,并运行对象所属类中的方法;

          简单记:编译看左边,运行看右边。
         静态方法

         编译时期:参考引用变量所属的类中是否有调用的静态方法;

         运行时期:参考引用变量所属的类中是否有调用的静态方法;

         简单记:编译运行都看左边;

         其实对于静态方法,是不需要对象的。直接用类名调用即可。


    3、什么是接口,它的特点是什么?

         接口是功能的集合,同样可以看做是一种数据类型,是比抽象类更为抽象的“类”;

         接口只描述应该具备的方法,并没有具体实现,具体的实现由接口的实现类来完成。这样就实现了功能 的定义与实现分离,优化了程序设计。

        一切事物均有功能,即一切事物皆有接口。

    4、接口的成员特点有哪些?

         1. 接口中可以定义变量,但是变量必须有固定的修饰符修饰 public static final,

       固定格式:public static final 数据类型 变量名 = 值;

            所以接口中的变量也称为常量,其值不能被改变。

            注意:修饰符 public static final 在接口变量定义中可以省略不写;

            但是,不写不等于没有;

            三个修饰符也可以选择性书写。

         2. 接口中可以定义方法,方法也有固定的修饰符,public abstract

             固定格式:public abstract 返回值类型 方法名();

             修饰符 public abstract,可以不写,也可以选择性书写

             但是,写与不写,都有

         3. 实现类实现接口,重写接口中全部的抽象方法,创建实现类对象

             实现类重写了一部分抽象方法,实现类还是一个抽象类

       4. 接口不可以创建对象 


    5、抽象类和接口的区别是什么?

         相同点:

         都位于继承的顶端,用于被其他类实现或继承;

         都不能实例化对象;

         都包含抽象放大,其子类都必须重写这些抽象方法。

         区别:

         抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码的重用性;接口只包含抽象方法;

       一个类只能继承一个直接父类(可能是父类),可以实现多个接口;接口弥补了Java的单继承;

         抽象类是这个事物中应该具备的内容,继承体系是is...a关系;

         接口是这个事物额外的功能,继承体系是一种 like...a关系。

         二者选用:

         优先选用接口,尽量少用抽象类;

       需要定义子类的行为,又要为子类提供共性功能时才选用抽象类。


    6、定义一个父类Animal eat方法 , 定义两个子类 Dog 特有方法keepHome , Cat 特有方法 catchMouse ;并且 重写eat方法
    测试类中写一个方法,参数列表有一个参数Animla类型,
    要求: 调用该方法分别传递Dog对象 和Cat 对象, 使用instanceof进行将转后调用eat,和他们的特有方法

    /**
     * Animal类
     * @author vanguard
     *
     */
    public abstract class Animal {
        public abstract void eat();
    }
    1 public class Dog extends Animal {
    2     public void eat() {
    3         System.out.println("狗吃狗粮");
    4     }
    5     public void keepHome() {
    6         System.out.println("狗看家");
    7     }
    8 }
    public class Cat extends Animal {
        public void eat() {
            System.out.println("猫吃猫粮");
        }
        public void catchMouse() {
            System.out.println("猫抓老鼠");
        }
    }
     1 /**
     2  * 测试类中写一个方法,参数列表有一个参数Animla类型
     3  * @author vanguard
     4  *
     5  */
     6 public class Test {
     7     public static void pet(Animal a) {
     8         if(a instanceof Dog) {
     9             Dog d = (Dog)a;
    10             d.eat();
    11             d.keepHome();
    12         }
    13         if(a instanceof Cat) {
    14             Cat c = (Cat)a;
    15             c.eat();
    16             c.catchMouse();
    17         }
    18     }
    19     public static void main(String[] args) {
    20         pet(new Dog());
    21         pet(new Cat());
    22     }
    23 }


    7.测试: 如果一个方法的返回值类型是父类,那么能否返回一个子类对象.(该父类不管是类,抽象类还是接口)

     

    public class Fu {
        public void show() {
            System.out.println("父类show方法");
        }
    }
    public class Zi extends Fu {
        public void show() {
            System.out.println("子类show方法");
        }
    }
    public class Test {
        public static Fu test(Zi z) {
            return z;
        }
        public static void main(String[] args) {
            Zi z = (Zi) test(new Zi());
        }
    }

    经过测试,如果一个方法的返回值类型是父类,那么能返回一个子类对象

     
    8.现有两种 OldPhone NewPhone; 两个类都有call() sendMessage() 方法(考虑向上抽取一个父类);
    已知接口IPlay中有一个方法 playGame(),NewPhone添加玩游戏的功能;
    要求: 分别测试OldPhone和NewPhone的两个方法,再测试新手机palyGame()的方法.

    /**
     * Phone的抽象类
     * 功能:
     * call
     * sendMessage
     * @author vanguard
     *
     */
    public abstract class Phone {
        public abstract void call();
        public abstract void sendMessage();
    }
    /**
     * 接口IPlay
     * 方法:playGame()
     * @author vanguard
     *
     */
    public interface IPlay {
        public abstract void playGame();
    }
    /**
     * OldPhone类继承Phone重写call()、sendMessage()
     * @author vanguard
     *
     */
    public class OldPhone extends Phone {
        public void call() {
            System.out.println("旧手机打电话");
        }
        public void sendMessage() {
            System.out.println("旧手机发信息");
        }
    }
    /**
     * NewPhone类继承Phone重写call()、sendMessage(),
     * 实现IPlay接口,重写PlayGame()
     * @author vanguard
     *
     */
    public class NewPhone extends Phone implements IPlay {
        public void call() {
            System.out.println("新手机打电话");
        }
        public void sendMessage() {
            System.out.println("新手机发信息");
        }
        public void playGame() {
            System.out.println("新手机玩游戏");
        }
    }
    /**
     * 测试类
     * 分别测试OldPhone和NewPhone的两个方法,再测试新手机palyGame()的方法.
     * @author vanguard
     *
     */
    public class Test {
        public static void main(String[] args) {
            OldPhone op = new OldPhone();
            op.call();
            op.sendMessage();
            
            NewPhone np = new NewPhone();
            np.call();
            np.sendMessage();
            np.playGame();
        }
    }


    9 .(完成下面的汽车案例)
    描述:汽车都具有跑的功能,普通的奥迪车也不例外,但是高端的奥迪车除了具有跑的功能外,还具有自动泊车和无人驾驶的功能!
    需求:定义普通奥迪车,高端奥迪车,实现描述中的功能并测试

    /**
     * 定义汽车的抽象类
     * @author vanguard
     *
     */
    public abstract class Car {
        public abstract void run();
    }
    /**
     * 其他功能的接口
     * 自动泊车
     * 自动驾驶
     * @author vanguard
     *
     */
    public interface OtherFunction {
        public abstract void parkAssist();
        public abstract void autopilot();
    }
    /**
     * 普通奥迪类
     * @author vanguard
     *
     */
    public class AudiCar extends Car {
        public void run() {
            System.out.println("普通奥迪车跑");
        }
    }
    /**
     * 高端奥迪类
     * @author vanguard
     *
     */
    public class HAudiCar extends Car implements OtherFunction {
        public void run() {
            System.out.println("高端奥迪车跑");
        }
        public void parkAssist() {
            System.out.println("自动泊车");
        }
        public void autopilot() {
            System.out.println("自动驾驶");
        }
    }
    /**
     * 测试类
     * @author vanguard
     *
     */
    public class Test {
        public static void main(String[] args) {
            AudiCar ac = new AudiCar();
            ac.run();
            
            HAudiCar hc = new HAudiCar();
            hc.run();
            hc.parkAssist();
            hc.autopilot();
        }
    }
  • 相关阅读:
    class 类添加属性
    Ajax请求数据data被JSON.stringify()的数据django解码过程
    Python之浏览器的前进或后退
    滚动条-智能等待-富文本
    Python之阶乘代码
    Python之用型号构成一个三角形代码
    C# Dictionary
    使用C#创建Windows服务
    sql取出每月最早的上报的数据
    mvc NPOI导入读取Excel文件
  • 原文地址:https://www.cnblogs.com/guodong-wang/p/7182980.html
Copyright © 2011-2022 走看看