继承与接口
相关知识点
由继承得到的类称为子类,被继承的类称为父类(超类)
,Java不支持多重继承
,即子类只能有一个父类。人们习惯地称子类与父类的关系是is-a关系。如果子类和父类在同一个包中,那么,子类自然地继承了父类中不是private的成员变量作为子类的成员变量,并且也自然地继承了父类中不是private的方法作为子类的方法,继承的成员变量或方法的访问权限保持不变。
子类和父类不在同一个包中时
,父类中的private和友好访问权限
的成员变量不会被子类继承
。也就是说,子类只继承父类中的
protected和public访问权限的成员变量作为子类的成员变量;同样,子类只继承父类中的protected和public访问权限的方法作为子类的方法。
子类声明的成员变量的名字和从父类继承来的成员变量的名字相同时,将隐藏所继承的成员变量。方法重写(overRide)
是指:子类中定义一个方法,这个方法的类型和父类的方法的类型一致或者是父类的方法的类型的子类型,并且这个方法的名字
、参数个数
、参数的类型
和父类的方法完全相同
。
子类如此定义的方法称为子类重写的方法。子类继承的方法所操作的成员变量一定是被子类继承或隐藏的成员变量。
重写方法既可以操作继承的成员变量、调用继承的方法,也可以操作子类新声明的成员变量、调用新定义的其他方法,但无法操作被子类隐藏的成员变量和方法。
class People { //人
protected double height, weight; //保护权限的两个变量
public void speakHellow() { //公共的方法
}
public void averageHeight() {
}
public void averageWeight() {
}
}
class ChinesePeople extends People{ //继承了人
@Override
public void speakHellow() { //重写父类的方法
System.out.println("你好");
}
@Override
public void averageHeight() {
System.out.println("平均身高");
}
@Override
public void averageWeight() {
System.out.println("平均体重");
}
public void Kongfu(){ //新增的方法
System.out.println("佛山无影脚");
}
}
要注意的是
,子类可以通过super关键字来调用父类的方法,再有子类在重写方法是,不可以将实例方法更改为类方法,反之同样不可以
相关知识点2
子类一旦隐藏了继承的成员变量,那么子类创建的对象就不再拥有该变量,该变量将归关键字super
所拥有;同样,子类一旦重写了继承的方法,就覆盖(隐藏)了继承的方法,那么子类创建的对象就不能调用被覆盖(隐藏)的方法,该方法的调用由关键super
负责。
因此,如果在子类中想使用被子类隐藏的成员变量或覆盖的方法
,就需要使用关键字super。
例如super.x、super.play()就是访问和调用被子类隐藏的成员变量x和方法play()。
相关知识点3
假设B是A的子类或间接子类,当用子类B创建一个对象,并把这个对象的引用放到
A类声明的对象中时,例如:
A a;
a=new B();
或
A a;
B b=new B();
a=b;
那么就称对象是于类对象b的上转型对象
。上转型对象不能操作子类声明定义的成员变量(失掉了这部分属性),不能使用子类定义的方法(失掉了一些行为)。上转型对象可以操作子类继承的成员变量和隐藏的成员变量,也可以使用子类继承的或重写的方法
。上转型对象操作子类继承或重写的方法时,就是通知对应的子类对象去调用这些方法。
因此,如果子类重写了父类的某个方法后,对象的上转型对象调用这个方法时,一定是调用了这个重写的方法。上转型对象不能操作子类新增的方法和成员变量
。可以将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了子类的所有属性和功能
abstract class Geometr {
public abstract double getArea();
}
class Rect extends Geometr {
double width;
double height;
Rect(double width, double height) { //构造方法
this.width = width;
this.height = height;
}
@Override
public double getArea() { //重写父类的方法
return width * height;
}
}
public class Example_2 {
public static void main(String[] args) {
Geometr geometr = new Rect(5,5); //上装型对象
System.out.println(geometr.getArea());
}
}
相关知识点4
接口体中有常量的声明(没有变量)和抽象方法声明,而且接口体中所有的常量的访问权限一定都是public(允许省略public、final修饰符),所有的抽象方法的访问权限一定都是public(允许省略public、abstract修饰符)。类实现接口,以便绑定接口中的方法。一个类可以实现多个接口,类通过使用关键字implements声明
自己实现一个或多个接口。如果一个非抽象类实现了某个接口
,那么这个类必须重写该接口的所有方法
。
interface ComputerAverage{
double getAverage(double d[]); //省略了public abstract
}
class SingerCompete implements ComputerAverage{
@Override
public double getAverage(double d[]) {
return 0;
}
}
相关知识点5
在设计程序时,经常会使用接口,其原因是:接口只关心操作,但不关心这些操作具体实现的细节
,可以使程序的设计者把主要精力放在程序的设计上,而不必拘泥于细节的实现(细节留给接口的实现者),即避免设计者把大量的时间和精力花费在具体的算法上。
使用接口进行程序设计的核心技术之一是使用接口回调
,即将实现接口的类的对象的引用放到接口变量
中,那么这个接口变量就可以调用类实现的接口方法。面向接口编程,是指当设计某种重要的类时,不让该类面向具体的类,而是面向接口,即
所设计类中的重要数据是接口声明的变量,而不是具体类声明的对象。
interface WeatherState{
void showWeather();
}
class WeatherReport{
WeatherState weatherState; //接口变量
public void setWeatherState(WeatherState weatherState) {
this.weatherState = weatherState;
}
public void show(){
weatherState.showWeather();
}
}
class cloud implements WeatherState{
@Override
public void showWeather() {
System.out.println("今天多云");
}
}
class sun implements WeatherState{
@Override
public void showWeather() {
System.out.println("今天太阳");
}
}
public class Example_4 {
public static void main(String[] args) {
WeatherReport weatherReport = new WeatherReport();
weatherReport.setWeatherState(new cloud()); //接口回调
weatherReport.show();
weatherReport.setWeatherState(new sun()); //接口回调
weatherReport.show();
}
}
人机界面
人机界面是计算机中实现用户与计算机通信的软件和硬件部分的总称.人机界面也称为用户接口或用户界面,从计算机用户界面的发展过程来看,人机界面的发展分为以下四个阶段
- 控制面板式用户界面
- 字符用户界面
- 图形用户界面
- 新一代用户界面
CET4P210
- pitch
- connect
- perform
- vital
- pilot
- scold