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工具对象。模拟物流快递过程。输出运输前、运输中和运输后的信息。
程序运行效果参考如下。
程序设计思路:定义需要的类及类里的属性和构造方法,定义需要的接口。在测试类实现

原文地址:https://www.cnblogs.com/0000-beauty/p/8886724.html