Java学习之面向对象三

Posted Vanguard

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
    }
}

 


















以上是关于Java学习之面向对象三的主要内容,如果未能解决你的问题,请参考以下文章

java学习之面向对象

Java学习之面向对象一

java基础学习之面向对象

java学习之面向对象

探索java敏捷学习之道

Java学习之面向对象四