(一)学习总结
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() {
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();
}
}
不能
(1).super 是调用父类的构造方法,当子类的构造方法中没有super关键字时,Java会默认加入super构造父类,且super关键字必须再子类构造方法的最前面才行,这是Java所要求的,
(2)
构造一个对象,先调用其构造方法,来初始化其成员函数和成员变量。
子类拥有父的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法得不到正确的初始化。
不能反过来调用也是这个原因,因为父类根本不知道子类有什么变量而且这样一来子类也得不到初始化的父类变量,程序会运行出错
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 = (Dog)animal;
dog.sleep();
Animal animal2 = new Animal();
if(animal2 instanceof dog)
{
dog = (Dog)animal2;
dog.shout();
}
}
}
animal.sleep();出错向上转型不能调用子类新定义的方法
Dog dog = animal; 向下转型需要强制类型转换,
Animal animal2 = new Animal();
dog = (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)程序的运行结果如下,说明什么问题?
两个输出的都是他的地址
(2).那么,程序的运行结果到底是什么呢?利用eclipse打开println(per)方法的源码,查看该方法中又调用了哪些方法,能否解释本例的运行结果?
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}
每一个对象都有自己的某些方法比如toString方法但是这个方法只是输出他的自己的地址并不是输出对象里面的东西
(3).
4.汽车租赁公司,出租汽车种类有客车、货车和皮卡三种,每辆汽车除了具有编号、名称、租金三个基本属性之外,客车有载客量,货车有载货量,皮卡则同时具有载客量和载货量。用面向对象编程思想分析上述问题,将其表示成合适的类、抽象类或接口,说明设计思路。现在要创建一个可租车列表,应当如何创建?
定义车类为接口类, 客车 货车 皮卡 为车的子类并且子类中有各个的载客量和载货量类中有基本属性,set get 还有构造方法,
他的设计思路跟宠物商店差不多 ,需要加一个商店类,用来租赁车,并输出租赁的结果
还有一个测试类,在测试类里面,实例化接口声明每一个对象形成一个数组在商店类里面,然后调用商店类实现购买,输出
5.阅读下面程序,分析代码是否能编译通过,如果不能,说明原因,并进行改正。如果能,列出运行结果
interface Animal{
void breathe();
void run();
void eat();
}
class Dog implements Animal{
public void breathe(){
System.out.println("I'm breathing");
}
public void eat(){
System.out.println("I'm eating");
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("I'm runing");
}
}
public class Test{
public static void main(String[] args){
Dog dog = new Dog();
dog.breathe();
dog.eat();
}
}
结果是不能, 接口里的方法在子类里面必须全部实现不让你会出错,而且一定要是加public
6.
面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。
静态方法是使用公共内存空间的,就是说所有对象都可以直接引用,不需要创建对象再使用该方法。
(二)实验总结
1.银行业务
设计思路:刚开始写的时候对静态代码款还不是很理解,所以写的比较模糊,后来看书改了改,实际上他就是一个模拟的过程,一个银行类包括他的的各种属性,方法,还有两个静态方法,测试类循环运行客户选择某个操作
2.员工部门
设计思路: 这个题主要的就是让你学会用继承的方法来写题会了就行,定义员工类,经理类和职员类继承员工类,并定义属于自己的属性这是并不需要转型操作
3. 平面体积
设计思路: 这个总共要定义九个类,两个抽象类六个圆啊球啊的类,还有测试类,对于球的类可以利用向上转型的原则来进行写题这样比较比较简单
4. 动物园饲养
设计思路: 多态我自己其实还是有一点蒙的,并不是很理解多态的使用方法,继承 重写 父类引用指向子类对象,三个主要因素
多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
5.宠物商店
设计思路: 这个题我想了一个晚上,在商店购买那里购买商品,因为是有商店类所以购买是要在商店里面进行的,所以在购买的时候我定义了一个跟Ptes同样大小的int数组,用来对应宠物数组,然后让用户输入每一个宠物买几个,当然要加入判断条件的,当商店里的动写好之后剩下的也就没有什么了
6.动物声音模拟器
设计思路: 定义接口类中有两个抽象方法cry和动物的名字,接口的两个子类dog和cat,模拟器类有接口的方法,测试类调用某个子类实现向上转型重写那两个方法
7.京东物流
设计思路: 这个题比较简单老师把所有的东西都给了,所有需要声明的类,还有他的某个方法需要传递某种参数都已经有了,
8. 部门改
设计思路:
这个题需要把之前的时期类去掉要用Java自带的对时间进行处理的Date类他的里面有自定义的方法可以直接调用比较方便,还有就是要注意输出的格式,SimpleDateFormat输入一个string类的字符串来规范时间格式,输入和输出都要按照这个 字符串的格式来
还有两个排序的接口Comparable 他要在进行排序的这个类上面进行实现他的接口,然后实现排序,虽然他是最常用的接口方法,但是前期可能用不到排序但是后期会用到所以个人比较喜欢第二种排序接口
Comparator接口不需要再进行排序的类上实现接口,可以重新声明定义它,它的扩展性能比较好
问题:
时间类刚开始用不是很熟悉走了好多弯路,不过不急慢慢的就知道了