前言
今天学习了Java中的继承和接口,在浏览博客时,发现了一些大佬写的概括性非常强的语言,所以我有部分进行了引用。
以下是我自己的一些总结和思考。
举例
狗狗有很多种,有菜狗、泰迪、拉布拉多、边牧、德牧和二哈等。
狗狗有性别、名字、颜色、年龄等属性,也有撒娇这一种方法。其中二哈和别的狗狗不一样,不会撒娇只会犯傻,所以二哈在继承狗狗类
之后需要对撒娇这个方法进行改写。
首先,我们需要写出一个狗狗类,具有性别、名字、颜色、年龄等属性,生活这个方法,为了接下来实验结果的直观,我们将学习这个方法标识(方法签名):几岁的什么颜色的什么狗+名字+“正在撒娇”:
public class Dog {
public int age;
public String color;
public String name;
public String type;
public int getAge() {
return age;
}
public String getColor() {
return color;
}
public String getName() {
return name;
}
public String getType() {
return type;
}
public void setAge(int age) {
this.age = age;
}
public void setColor(String color) {
this.color = color;
}
public void setName(String name) {
this.name = name;
}
public void setType(String type) {
this.type = type;
}
public void saJiao() {
System.out.println(age + "岁的" + color + "的" + type + name + "正在撒娇");
}
}
然后,写一个二哈类继承狗狗类同时新写入一个printName类,调用父类Dog的getName方法,同时重写父类saJiao方法并标识(方法签名):
public class ErHa extends Dog {
private int age;
private String color;
private String name;
private String type;
public ErHa() {
System.out.println("二哈");
}
public void printName() {
System.out.println("这是一只二哈");
}
public void sajiao() {
System.out.println(age + "岁的" + color + "的" + name + "正在犯傻,因为");
}
}
主函数部分就是创建子类ErHat对象然后调用方法:
import com.sun.deploy.net.MessageHeader;
import java.util.Scanner;
public class text {
public static void main(String[] args) {
ErHa baiChi = new ErHa();
String name;
int age;
String color;
System.out.println("请输入狗狗的名字");
Scanner sc = new Scanner(System.in);
name = sc.nextLine();
baiChi.setName(name);
System.out.println("请输入狗狗的年龄");
Scanner sc1 = new Scanner(System.in);
age=sc1.nextInt();
baiChi.setAge(age);
System.out.println("请输入狗狗的颜色");
Scanner sc2 = new Scanner(System.in);
color=sc2.nextLine();
baiChi.setColor(color);
baiChi.setType("二哈");
baiChi.saJiao();
baiChi.printName();
}
}
运行加测试结果如下:
总结
继承
1)关键字:extends
2)格式:public class 子类(派生类) extends 父类(基类,超类){}
3)子类会继承父类中所有的属性和方法,但私有属性和方法不能直接调用(可用get()方法间接调用)
4)一个类只能继承一个类,不能继承多个,但是能多层次继承
方法重写(覆盖)
1)发生在有继承关系的两个类之间
2)返回值类型,方法名,参数类型(个数,顺序)跟原方法完全一样
继承中的构造方法
1)子类一定要调用一次父类的构造方法,父类中无参构造方法默认被调用
2)如果父类中构造方法已被人为改写(例如添加参数)就必须在子类构造方法里带同样的参数,同时在创建对象时也应该加相应参数
关于super():
当我们的父类没有写构造方法时,系统会默认替我们自动生成一个没有带任何参数的构造方法,当该父类被继承之后,系统也会在子类的构造函数(可能是系统默认自动生成也可能是人为写的)的第一行加一个super(),也就是说系统在构造子类对象的同时会先构造父类对象,但是当我们的父类对象是自己写的且带有参数的时候,系统没有办法帮我们生成一个super(),我们必须手动输入super(参数1,参数2……),这些参数可以是具体的数字或字母也可以是一个由子类构造函数参数或者属性所代表的字母或字符串。
关于范围
子类在继承父类的时候,不能减小方法的可访问范围
接口
在父类和子类的关系中可以看出,父类是子类的抽象类,换句话说,子类在父类的基础上添加或者修改一些属性或者方法。而当父类非常抽象的时候,或者说当我们仅仅知道这个类的对象应该干什么,而具体怎么去做我们都还不清楚的时候,我们可以定义这样一个特殊类,它只有方法的定义,没有方法体,如果一个类中的所有方法都没有方法体,这个类我们叫做接口。
接口的格式
声明类的关键字是class,声明接口的关键字是interfaca
public interface Dog1 {//定义接口用interface而不是class
//常量
final a = 1;
//接口中的属性默认是 public static final,且只能是该格式
public static final String NAME = "名字";
//抽象方法
//接口中的抽象方法默认是public abstract,且只能是该格式
public abstract void saJiao();
}
接口中的方法都是抽象方法所以没有构造函数,不能创建对象。我们定义接口是给子类来扩展的,当然接口同样是一种 数据类型。
接口的实现
因为接口中方法默认public,所以即使接口里没有写public,实现的时候一定要加上pbulic
//继承接口:关键字implements
//public class 子类 extends 父类 implements 接口类,接口类{}
//继承接口一定要重写接口中所有的抽象方法
public class ErHa extends Dog implements Dog1{
//重写方法一定要去掉abstract
public void saJiao(){
System.out.println("子类重写接口中的方法!");
}
}
总结
以上是学习Java第六日的总结