概述
面向对象(二)综合作业
基础知识:
- 编写程序测试子类能从父类继承哪些成员变量和方法。
-
子类继承父类的成员变量:当子类继承了某个类之后,便可以使用父类中的成员变量,但是并不是完全继承父类的所有成员变量。具体的原则如下:
- 能够继承父类的public和protected成员变量;不能够继承父类的private成员变量;
- 对于父类的包访问权限成员变量,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
- 对于子类可以继承的父类成员变量,如果在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。
-
子类继承父类的方法: 同样地,子类也并不是完全继承父类的所有方法。
- 能够继承父类的public和protected成员方法;不能够继承父类的private成员方法;
- 对于父类的包访问权限成员方法,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
- 对于子类可以继承的父类成员方法,如果在子类中出现了同名称的成员方法,则称为覆盖,即子类的成员方法会覆盖掉父类的同名成员方法。如果要在子类中访问父类中同名成员方法,需要使用super关键字来进行引用。
-
注意:隐藏和覆盖是不同的。隐藏是针对成员变量和静态方法的,而覆盖是针对普通方法的。
package homework02; public class Person { // 名字 protected String name; // 编号 protected int id; // 工作环境 protected String environment; // 特长 protected String speciality; public Person(String name, int id, String environment, String speciality) { super(); this.name = name; this.id = id; this.environment = environment; this.speciality = speciality; } //工作地点 public void work() { System.out.println(name + "在" + environment + "工作" + '。'); } //工作能力 public void ability() { System.out.println(name + ",我会" + speciality + '。'); } //自我介绍 public void introduction() { System.out.println("大家好!我是" + id + "号" + name + '。'); } }
package homework02; public class Doctor extends Person { public Doctor(String name, int id, String environment, String speciality) { super(name, id, environment, speciality); } public void duty(){ System.out.println("治病救人是我的职责。"); } }
package homework02; public class Run { public static void main(String[] args) { // 医生张三 Doctor doctor = new Doctor("张三", 1, "医院", "诊断"); // 张三的自我介绍 doctor.introduction(); // 张三的工作地点 doctor.work(); // 张三的能力 doctor.ability(); // 张三的职责 doctor.duty(); } }
运行结果:
大家好!我是1号张三。 张三在医院工作。 张三,我会诊断。 治病救人是我的职责。
- 什么是重写(override)?为什么要重写,编写代码测试。
-
重写:如果子类对继承父类的方法不满意,是可以重写父类继承的方法的,当调用方法时会优先调用子类的方法。
-
语法规则:返回值类型,方法名,参数类型及个数都要与父类继承的方法相同。
package homework02; public class Doctor extends Person { public Doctor(String name, int id, String environment, String speciality) { super(name, id, environment, speciality); } //重写自我介绍 public void introduction() { System.out.println("大家好!我是一名医生"); } public void duty(){ System.out.println("治病救人是我的职责。"); } }
运行结果:
大家好!我是一名医生 张三在医院工作。 张三,我会诊断。 治病救人是我的职责。
- Super关键字的作用是什么?编写代码测试。
-
在对象的内部使用,可以代表父类对象
- 访问父类的属性 super.age
- 访问父类的方法 super.eat()
-
- 子类的构造的过程中必须调用其父类的构造方法
- super(parameter1,parameter2…)
package com.imooc; public class Animal{ public Animal() { System.out.println("Animal类执行了!!"); } }
package com.imooc; public class Dog extends Animal { public Dog() { //默认隐式的调用父类构造方法 //super();写与不写效果一样 /*要注意的是,如果是用在子类构造器中,则必须是子类构造器的第一个语句。 如果子类构造方法中既没有显示的调用父类的构造方法, 而父类又没有无参的构造方法,则编译出错。*/ System.out.println("Dog类执行了!!"); } }
package com.imooc; public class T { public static void main(String[] args) { Dog dog = new Dog(); } }
运行结果:
Animal类执行了!! Dog类执行了!!
-
第一种用法主要用来在子类中调用父类的同名成员变量或者方法;第二种主要用在子类
-
要注意的是,如果是用在子类构造器中,则必须是子类构造器的第一个语句。如果子类构造方法中既没有显示的调用父类的构造方法,而父类又没有无参的构造方法,则编译出错。
- Final关键字可以修饰类,方法,成员变量和局部变量,请编码测试。
final修饰类,则该类不允许被继承
final修饰方法,则该方法不允许被覆盖(重写)
final修饰属性,类的初始化属性必须有值或在构造方法中赋值(但只能选其一)。
final修饰变量,则该变量的值只能赋一次值,即为常量。 - 抽象方法的概念,什么是抽象类,为什么抽象类不能实例化,编码测试。
-
抽象方法:抽象方法指一些只有方法声明,而没有具体方法体的方法。抽象方法一般存在于抽象类或接口中。
-
应用场景:
- 在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法。
- 从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。
-
作用:限制规定子类必须实现某些方法,但不关注实现细节
-
使用规则:
- abstract定义抽象类
- abstract定义抽象方法,只有声明,不需要实现
- 包含抽象方法的类是抽象类
- 抽象类中可以包含普通的方法,也可以没有抽象方法
- 抽象类不能直接创建,可以定义引用变量
package com.imooc.my; //这就是一个抽象类 abstract class Telphone { //定义成抽象方法,来解决父类方法的不确定性。 //抽象方法在父类中不能实现,所以没有函数体。但在后续在继承时,要具体实现此方法。 abstract void call(); abstract void messages(); }
package com.imooc.my; public class CellPhone extends Telphone { @Override public void call() { // TODO Auto-generated method stub System.out.println("通过键盘来打电话"); } @Override public void message() { // TODO Auto-generated method stub System.out.println("通过键盘来发短信"); } }
package com.imooc.my; public class SmartPhone extends Telphone { @Override public void call() { // TODO Auto-generated method stub System.out.println("通过语音来打电话"); } @Override public void message() { // TODO Auto-generated method stub System.out.println("通过语音来发短信"); } }
package com.imooc.my; public class T { public static void main(String[] args) { // TODO Auto-generated method stub Telphone tel1 = new CellPhone(); tel1.call(); tel1.message(); Telphone tel2 = new SmartPhone(); tel2.call(); tel2.message(); } }
运行结果:
通过键盘来打电话 通过键盘来发短信 通过语音来打电话 通过语音来发短信
- 接口的概念及特点,编程测试。
-
接口概念:
类是一种具体实现体,而接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些类里方法的实现细节,它只规定这些类里必须提供某些方法。接口中全部是抽象方法。 -
接口定义的基本语法:
[修饰符](abstract隐式写着)interface 接口名[extends 父接口1,父接口2…]{ 零个到多个常量定义… 零个到多个抽象方法的定义… }
-
接口就是用来被继承、被实现的,修饰符一般建议用public
-
注意:接口中方法不能有方法体,同时方法的访问修饰符不能是 private 和 protected
常量:接口中的属性是常量,即使定义时不添加public static final修饰符,系统也会自动加上。
方法:接口中的方法只能是抽象方法,总是使用,即使定义时不添加public abstract修饰符,系统也会自动加上。 -
使用接口
一个类可以实现一个或多个接口,实现接口使用implements关键字。Java中一个类只能继承一个父类,是不够灵活的,通过实现多个接口可以做补充。
继承父类实现接口的语法为:[修饰符] class类名extends 父类implements接口1 ,接口2…{ 类体部分//如果继承了抽象类,需要实现继承的抽象方法;要实现接口中的抽象方法。 }
-
如果要继承父类,继承必须在实现接口之前
package com.imooc.my; public class SmartPhone extends Telphone implements IPlayGame { @Override public void call() { // TODO Auto-generated method stub System.out.println("通过语音来打电话"); } @Override public void message() { // TODO Auto-generated method stub System.out.println("通过语音来发短信"); } @Override public void playGame() { // TODO Auto-generated method stub System.out.println("电话具有玩游戏的功能"); } }
package com.imooc.my; public class Psp implements IPlayGame { @Override public void playGame() { // TODO Auto-generated method stub System.out.println("psp具有玩游戏的功能"); } }
package com.imooc.my; public class T { public static void main(String[] args) { //通过接口描述两个不同类型之间的共同特性 IPlayGame ip1 = new SmartPhone(); ip1.playGame(); IPlayGame ip2 = new Psp(); ip2.playGame(); } }
- 什么是多态,多态实现的三个必要条件是什么?编程测试。
- Object类。
- 匿名内部类
- 异常
- 访问控制
面向对象的内存分析:
参考第四章com.huaxin07.task01中的代码及008_案例分析图片,自己执行代码画图。(此图一般重要)
作业要求:所有代码在eclipse中测试通过,敲三遍,手写一遍,开学检查。
最后
以上就是殷勤鸭子为你收集整理的2019寒假java作业02的全部内容,希望文章能够帮你解决2019寒假java作业02所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复