继承的概念和实现
- 继承背后的思想就是基于已存在的类来构建新类
- 当从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求
- 约定:
- 从其它类导出的类叫做子类。
- 被导出的类叫做父类
- 在Java中,除了Object类之外,所有类都是子类,都只有唯一的父类
继承在OOP(面向对象)中不可或缺
创建一个类时,总是在继承
继承的意义:
- 代码的重用
- 体现不同抽象层次
父子类关系:
- 父类更抽象,更一般
- 子类更具体,更特殊
在Java语言中,用extends关键字来表示一个类继承了另外一个
public class Teacher extends Person{
//其余代码省略
}
package jicheng.yang.java;
class Person
{
String name;
String address;
public void Eat(){
System.out.println("人吃饭");
}
public void Drink(){
System.out.println("人喝水");
}
public void printfInfo(){
System.out.println("name="+name);
}
}
class Student extends Person
{
int score;
public void GoToSchool(){
System.out.println("去上学");
}
public void printfScore(){
System.out.println("score="+score);
}
}
public class Test {
public static void main(String[] args) {
Person p = new Person();
p.name = "人";
p.Eat();
p.printfInfo();
Student s = new Student();
s.name = "学生";
s.score = 60;
s.printfInfo();
s.printfScore();
s.GoToSchool();
}
}
执行结果:
super关键字
super关键字特点
- super和this关键字的特点类似:super代表的是父类对象的引用
- 当子父类的成员出现同名时,可以通过super来区分
- 子类的构造方法中,通过super关键字调用父类的构造方法
public class Teacher extends Person{
public Teacher(String name,String address)
{
super(name,address);
}
}
强调注意:
当构造一个子类对象的时候,一定会先调用父类的构造方法来构造父类的对象。
调用父类构造方法的语句必须是子类构造方法中的第一条指令。
应用:
public Person(String name,String address){ //初始化父类
this.name = name;
this.address = address;
System.out.println("父类构造方法被调用");
}
public Student(String name,String address){ //实例子类构造方法时调用
super(name,address); //传参去调用父类的构造方法
System.out.println("子类构造方法被调用");
}
Student s = new Student("xu","北京3326"); //初始化实例子类时,调用子类Student构造方法,在通过子类Student构造方法去调用父类构造方法,初始化父类
package jicheng.yang.java;
class Person
{
String name;
String address;
public Person(String name,String address){
this.name = name;
this.address = address;
System.out.println("父类构造方法被调用");
}
public Person(String name){
this.name = name;
}
public void Eat(){
System.out.println("人吃饭");
}
public void Drink(){
System.out.println("人喝水");
}
public void printfInfo(){
System.out.println("name="+name);
}
}
class Student extends Person
{
public Student(String name,String address){
super(name,address);
System.out.println("子类构造方法被调用");
}
int score;
public void GoToSchool(){
System.out.println("去上学");
}
public void printfScore(){
System.out.println("score="+score);
}
}
public class Test {
public static void main(String[] args) {
Student s = new Student("xu","北京3326");
}
}
执行结果:
子类调用父类方法:
public void Eat()
{
super.Eat();
System.out.println("eat");
}
package jicheng.yang.java;
class Person
{
String name;
String address;
public Person(String name,String address){
this.name = name;
this.address = address;
System.out.println("父类构造方法被调用");
}
public Person(String name){
this.name = name;
}
public void Eat(){
System.out.println("人吃饭");
}
public void Drink(){
System.out.println("人喝水");
}
public void printfInfo(){
System.out.println("name="+name);
}
}
class Student extends Person
{
public Student(String name,String address){
super(name,address);
System.out.println("子类构造方法被调用");
}
int score;
public void GoToSchool(){
System.out.println("去上学");
}
public void printfScore(){
System.out.println("score="+score);
}
public void Eat()
{
super.Eat();
System.out.println("eat");
}
}
public class Test {
public static void main(String[] args) {
Student s = new Student("xu","北京3326");
s.Eat();
}
}
执行结果:
关于私有化:
- private方法,private成员属性,都不可被子类继承。
- private成员属性,可以通过继承的public方法访问到。
方法重写-Override
什么是方法重写:
方法重写是指子类可以根据需要对从父类继承来的方法进行改写,是多态机制的前奏
方法重写注意:
- 重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值
- 重写方法不能比被重写方法有更严格的访问权限
- 父类中的私有方法,不能被重写
- 在子类重写的方法中,继续调用父类被重写的方法可以通过super.函数名获取
package jicheng.yang.java;
class Person
{
String name;
String address;
public void printfInfo(){
System.out.println("name="+name);
}
public void printfAddr(){
System.out.println("address="+address);
}
}
class Student extends Person
{
int score;
public void printfInfo(){
super.printfInfo();
System.out.println("子类name="+name);
}
}
public class Test {
public static void main(String[] args) {
Student s = new Student();
s.name = "张";
s.printfInfo();
}
}
执行结果:
Object类常见方法
- Java中,所有类都直接或间接继承自Java.lang.Object类,可以说Object是Java中所有类的祖先即根类。
- Java中任何类都继承了Object类中的方法。
主要方法有:
toString();
equals();
hashcode();
clone();
getClass();
finalize();
toString()
package jicheng.yang.java;
class Person
{
String name;
String address;
public void printfInfo(){
System.out.println("name="+name);
}
public void printfAddr(){
System.out.println("address="+address);
}
}
public class Test {
public static void main(String[] args) {
Person p = new Person();
p.name = "张";
System.out.println(p.toString());
}
}
执行结果:
包名.类名.类的虚拟地址
方法重写后的使用:
package jicheng.yang.java;
class Person
{
String name;
String address;
public String toString() {
return "person meaage:"+name+address;
}
}
public class Test {
public static void main(String[] args) {
Person p = new Person();
p.name = "张";
p.address = "北京1108";
System.out.println(p.toString());
}
}
执行结果:
equals()
方法重写后的使用:
package jicheng.yang.java;
class Person
{
String name;
String address;
public boolean equals(Object arg0) {
Person p = (Person)arg0;
if(this.name == p.name && this.address == p.address){
return true;
}else{
return false;
}
}
}
public class Test {
public static void main(String[] args) {
Person p = new Person();
p.name = "张";
p.address = "北京1108";
Person p2 = new Person();
p2.name = "张";
p2.address = "北京1108";
System.out.println(p.equals(p2));
}
}
执行结果: