面向对象(二)
1. 继承
子类继承父类,拥有父类中属性和行为的特征。
实现继承,前提条件必须满足 “子类 is a 父类”的关系。
例:猫是一个动物,狗是一个动物
这里用一个简单的小例子来说明一下:
一个学校需要招收两个老师,一个是JAVA老师,一个是android老师。这两个类显然有个共同的父类老师:
package com.lianxi02;
public class Teacher {
private String name;
private int age;
private String xl;
public Teacher() {
}
public Teacher(String name, int age, String xl) {
this.name = name;
this.age = age;
this.xl = xl;
}
JavaTeacher
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getXl() {
return xl;
}
public void setXl(String xl) {
this.xl = xl;
}
public String jieShao(){
String str="";
str+="面试官,您好,我是"+name+"\r\n";
str+="今年"+age+"\r\n";
str+="学历"+xl+"\r\n";
return str;
}
public String shiJiang(){
String str="";
return str;
}
}
接下来我们先建立Java老师和android老师的子类
package com.lianxi02;
public class JavaTeacher extends Teacher{
public JavaTeacher() {
}
public JavaTeacher(String name, int age, String xl) {
//在子类构造方法中调用父类的构造
super(name, age, xl);
}
@Override
public String shiJiang() {
String str="";
str+="今天试讲的内容是《面向对象基础》\r\n";
str+="请打开idea编写一个java类\r\n";
str+="试讲结束";
return str;
}
}
school
main
package com.lianxi02;
public class AndroidTeacher extends Teacher{
public AndroidTeacher() {
}
public AndroidTeacher(String name, int age, String xl) {
super(name, age, xl);
}
@Override
public String shiJiang() {
String str="";
str+="今天试讲的内容是:Android中的四大天王\r\n";
str+="试讲结束";
return str;
}
}
之后我们建立学校类来使用我们实现的方法:
package com.lianxi02;
public class School {
public void testTeacher(Teacher tea){
String str="";
str+=tea.jieShao();
str+=tea.shiJiang();
System.out.println(str);
}
}
最后我们使用main函数来创造对象来调用类函数:
package com.lianxi02;
public class Main {
public static void main(String[] args) {
School school=new School();
JavaTeacher javaTeacher=
new JavaTeacher("张三",28,"本科");
school.testTeacher(javaTeacher);
AndroidTeacher androidTeacher=
new AndroidTeacher("李四",34,"博士");
school.testTeacher(androidTeacher);
}
}
重写:在继承关系中,子类中出现与父类中方法签名完全一致的方法,访问修饰符高于父类、返回值类型一致、方法名相同、参数列表相同;构造方法、静态方法、终态方法和本地方法不能被覆盖,私有的方法也不能覆盖。
2.多态
一个父类表现为多个子类的能力,老师分别表现为JavaTeacher和AndroidTeacher
实现多态的前提:
- 在继承关系中子类覆盖父类中的方法
- 父类引用指向子类对象
Teacher tea=new JavaTeacher();
Teacher t=new AndroidTeacher();
在编写程序的过程中,发现类中的代码过多,把不同作用的方法,放在不同类中, 如果多个类中存在相同的内容,则提取父类,把相同的内容放在父类中,必须满足"is-a"的关系
3.重载和重写
重载和重写都是多态的表现形式
重载:静态多态,一个类中出现两个及两个以上的同名方法,参数列表不同(参数的个数、参数的类型 和类型的顺序,跟返回值类型和修饰符无关,任何都可以被重载
重写:动态多态,在继承关系中,子类中出现与父类中签名完全一样的方法,修饰符高于等于父类、返回值类型相同、参数列表相同、声明异常的类型一致。以下方法不能被重写:
- 私有方法
- 构造方法
- static修饰的静态方法
- final修饰的方法
- 本地方法
4.super和this
super:在继承关系中,子类中使用的父类对象
this:在本类中自己的对象
作为对象使用:
- this:表示本类对象,this.xxx() 调用本类中的方法
- super:表示父类对象,super.xxx() 调用父类中的方法
作为构造方法使用:
- this():本类构造方法中调用其他构造方法,必须是第一句
- super():子类构造中调用父类的构造方法,必须是第一句
注意:this()和super()不能同时出现在构造方法 如果子类中没有现实的写明构造方法,则默认调用父类空参构造;如果父类中没有空参构造,必须在子类通过super()的形式显示的写明。