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();
    }
}
时间: 2024-10-13 17:41:38

Java学习之面向对象三的相关文章

Java学习总结(三)——面向对象(上)

Java学习总结(三) -面向对象(上) 一.面向对象的概念及思考方式 面向对象的理解:是一种编程思想,他将对象作为解决问题的基本元素,利用对象与对象之间的相互作用来设计程序. 2.面向对象的思考方式:(1)首先确定问题域中的对象 (2)确定对象的特征与功能 (3)了解对象与对象之间的关系 例:设计一个五子棋游戏的对象:·黑白双方对象     ·绘制棋盘     ·输赢规则 二.类与对象 1.对象:用来描述客观事物的一个实体,由一组属性和行为构成. 2.类:(1)是一个模板,他描述一类对象的行为

java学习笔记(三)java中的修饰符abstract、static与final

一.四种访问级别的访问范围 访问级别 访问修饰符 同类 同包 子类 不同的包 公开 public 受保护 protected 默认 没有访问修饰符 私有的 private 二.使用abstract修饰符需要遵守的语法规则 1.抽象类中可以没有抽象方法,但是包含抽象方法的类必须定义为抽象类,即用abstract修饰: 2.抽象类跟抽象方法不能被final修饰符修饰: 3.抽象类中可以有非抽象方法,因为继承抽象类的子类必须重写父类中所有的抽象方法,因此抽象类中不能有抽象构造方法和抽象静态方法: 4.

JAVA学习之路三 编程英文汇总学习

JAVA学习中的每个章节中都有许多英文,不断熟悉工作英语也是提高编程能力很重要的一块,对于IT行业,英语才是通用语. 记在<JAVA语言程序设计>学习的第一章英文学习之后 .class file(.class文件)                       javac command(javac命令)          .java file(.java文件)            java Development Toolkit(JDK,java开发工具包)          assembl

学java教程之面向对象(三)

学编程吧学java教程之面向对象发布了,欢迎通过xuebiancheng8.com来访问 上面两次分析了类和对象,以及如何定义对象.下面来分析下如何使用对象 下面先定义一个类 public class Car{//定义类名单词首字母要大写,同时见明知意 String name; //定义了属性名字 int price;    //定义了价格 public void run(){   //定义了run方法 System.out.println("汽车在跑"); } public void

Java 学习札记(三)免安装版TomCat中tomcat6w.exe的运行

1.使用环境 很多时候我们用的是官网的解压免安装版的Tomcat,相比安装Tomcat除了少了安装步骤以外还少了tomcat6w.exe运行所需要的环境变量,所以一般Java开发免安装版的已经足够使用了,但是如果部署服务的时候我们不可能只运行startup.bat文件,我们需要新建一个服务并可以通过tomcat6w.exe启动和关闭服务. 2.无法运行tomcat6w.exe (1)提示错误: 运行tomcat6w.exe ,提示 指定的服务未安装 unable to open the serv

Java学习记录(补充三:面向对象的封装和继承)

面向对象的封装package day7; //面向对象的封装 public class Employee { String name = "zhangsan"; private int age; //多个方法重载 public Employee(){ } public Employee(String name,int age){ } public Employee(int age,String name){ } //可以在方法里修改不能访问的属性 public int getAge()

Java学习笔记(三):面向对象

1.继承 语法 class 父类{} class 子类 extends 父类{} 只能多层继承,不能多重继承,子类不能直接访问父类中的私有成员,可通过getter和setter方法获得 子类对象new实例化(时) 会默认先调用父类的构造方法,再调用子类的构造方法去实例化所以,若父类和子类构造方法里含有输出语句,会在new时都打印 实际上,子类构造里隐含了super();调用了父类构造 方法的覆写("方法重写") 子类覆写的方法不能拥有比父类方法更加严格的访问权限 (如:父类--publ

Java学习之面向对象一

1 面向对象 1.1     理解什么是面向过程.面向对象 面向过程与面向对象都是我们编程中,编写程序的一种思维方式. l  面向过程的程序设计方式,是遇到一件事时,思考"我该怎么做",然后一步步实现的过程. 例如:公司打扫卫生(擦玻璃.扫地.拖地.倒垃圾等),按照面向过程的程序设计方式会思考"打扫卫生我该怎么做,然后一件件的完成",最后把公司卫生打扫干净了. l  面向对象的程序设计方式,是遇到一件事时,思考"我该让谁来做",然后那个"

Java学习之面向对象(概念性质) &lt;好程序员特训营&gt;

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流! 1.面向对象:三个特征:封装,继承,多态 2.开发过程:其实就是找对象使用.没有对象,就创建一个对象 3.类和对象的关系. 现实生活中的对象:张三 李四. 想要描述:提取对象中共性内容.对具体的抽象. 描述时:这些对象的共性有:姓名,年龄,性别,学习java功能