JAVA继承和接口
题目:
学生类具有姓名属性、学习等方法,大学生也是学生的一种,除了姓名之外还有年龄比较大这个属性,当然大学生也有学习等方法,只不过大学生的学习方式不再跟小学中学一样了,所以大学生的学习方法跟学生类是不一样的,继承学生类之后需要对学习这个方法进行改写。
首先,我们需要写出一个学生类,具有姓名这个属性,学习这个方法,为了接下来实验结果的直观,我们将学习这个方法标识(方法签名):学生姓名+“正在学习”:
public class Student /*extends Object*/{
public String name;
public void setName(String n){
name = n;
}
public String getName(){
return name;
}
public void study(){
System.out.println(name+"正在学习");//方法签名
}
}
然后写一个大学生类继承学生类同时新写入一个printName类,调用父类Student的getName方法,同时重写父类study方法并标识(方法签名):
public class UNStudent extends Student{
private int age;
public UNStudent(){
//super(a);
System.out.println("UNStudent");
}
public void printName(){
System.out.println("名字:"+getName()+" 年龄:"+age);
}
public void study(){
System.out.println("大学生"+name+"正在学习");
}
}
主函数部分就是创建子类UNStudent对象然后调用两个方法:
public class Manage {
public static void main(String[] args) {
UNStudent un = new UNStudent();
un.setName("hyn");
un.study();
un.printName();
}
}
运行结果如下:
以上是比叫简单的继承测试,接下来我会对继承的一些细节和实际实验过程中我们可能会遇到一些问题做出解释:
1、 extends Object 所有类都默认带有一个,可不写。Object类是类层次结构的根,java中所有的类都继承自这个类。例如,当我们在申明Student类时加上去这个语句,并没有报错:
public classStudent extends Object
2、 继承
1)关键字:extends
2)格式:public class 子类(派生类) extends 父类(基类,超类){}
3)子类会继承父类中所有的属性和方法,但私有属性和方法不能直接调用(可用get()方法间接调用)
4)一个类只能继承一个类,不能继承多个,但是能多层次继承
3、 方法重写(覆盖)
1)发生在有继承关系的两个类之间
2)返回值类型,方法名,参数类型(个数,顺序)跟原方法完全一样
4、 继承中的构造方法
1)子类一定要调用一次父类的构造方法,父类中无参构造方法默认被调用
2)如果父类中构造方法已被人为改写(例如添加参数)就必须在子类构造方法里带同样的参数,同时在创建对象时也应该加 入相应参数,例如我在Student类加入构造函数:
public Student(inta){
System.out.println("Student");
}
UNStudent的构造函数就会报错:
这时我们只需要改成这样就不会报错了:
public UNStudent(inta){
super(a);
System.out.println("UNStudent");
}
同时主函数在创建对象的时候,因为UNStudent的构造函数带有参数,所以创建对象必须带有参数:
UNStudent un = newUNStudent(10);
这样最后结果就是一样的了。
3)关于super():
当我们的父类没有写构造方法时,系统会默认替我们自动生成一个没有带任何参数的构造方法,当该父类被继承之后,系统也会在子类的构造函数(可能是系统默认自动生成也可能是人为写的)的第一行加一个super(),也就是说系统在构造子类对象的同时会先构造父类对象,但是当我们的父类对象是自己写的且带有参数的时候,系统没有办法帮我们生成一个super(),我们必须手动输入super(参数1,参数2……),这些参数可以是具体的数字或字母也可以是一个由子类构造函数参数或者属性所代表的字母或字符串。
此时的运行结果可以直观看出程序执行过程:
5、 继承中的转型
1) 自动转型格式:
UNStudent un1 = new UNStudent();
Student un=un1;
2) 强制转型
将一个父类类型的对象自动转型为子类(该父类类型必须 是子类型自动转换而来的)
格式:
UNStudent un1 = new UNStudent();
Student un=un1;
un.setName("hyn");
un.study();
UNStudent unst = (UNStudent)un;
unst.study();
unst.printName();
3) 转型的结果
6、 子类在继承父类的时候,不能减小方法的可访问范围
范围从大到小:
public > 默认(无) > protected> private
7、接口
在父类和子类的关系中可以看出,父类是子类的抽象类,换句话说,子类在父类的基础上添加或者修改一些属性或者方法。而当父类非常抽象的时候,或者说当我们仅仅知道这个类的对象应该干什么,而具体怎么去做我们都还不清楚的时候,我们可以定义这样一个特殊类,它只有方法的定义,没有方法体,如果一个类中的所有方法都没有方法体,这个类我们叫做接口。
1) 接口的格式
public interface Student {//定义接口用interface而不是class
//常量
//接口中的属性默认是 public static final,且只能是该格式
public static final String NAME = "名字啊";
//抽象方法
//接口中的抽象方法默认是public abstract,且只能是该格式
public abstract void study();
}
2) 接口中的方法都是抽象方法所以没有构造函数,不能创建对象。我们定义接口是给子类来扩展的,当然接口同样是一种 数据类型。
3) 接口的实现
//继承接口:关键字implements
//public class 子类 extends 父类 implements 接口类,接口类,,{}
//继承接口一定要重写接口中所有的抽象方法
public class IntStudent implements Student{
//重写方法一定要去掉abstract
public void study(){
System.out.println("子类重写接口中的方法!");
}
}
4) 因为接口中方法默认public,所以即使接口里没有写public,实现的时候一定要加上pbulic
5)接口的使用以及结果演示