1.什么是继承?为什么需要继承?继承到什么?
我们在编写一个类的时候,所有的学生(无论大小中)都可以是一种类型的,即定义为一个简单的Student类
代码:
//所有一般类学生的定义
public class Student {
public String name;
public void setName(String name){
this.name = name;
}
public void study(){
System.out.println(name+"在学习");
}
}
但这个系统给某个大学使用时,就会出现问题——我们需要再定义一个大学生类,可以肯定的是,大学生中也有学习的方法,学分,名字属性,但具体的学习方法却是和一般学生是不一样的,所以我们就没必要再定义一个大学生类把这些代码再敲一遍,那么我们就可以定义一个学生类,让它继承Student类,因为不管什么学生都有study()这样一个方法。
代码示例:
public class UNStudent extends Student{
}
OK,通过extends 关键字,我们就免去了重写代码的麻烦,在UNStudent中就自动继承到了它的父类中的方法和属性。
代码示例:public class Test {
public static void main(String[] args){
UNStudent stu1 = new UNStudent();
stu1.setName("我是大学生");
stu1.study();
}
代码执行结果: 我是大学生在学习
2.自动转型与强制转型
在上面定义的两个类中,大学生类就是子类(扩展类) ,学生类就是父类(基类,超类)。
自动转型的意思:
就是子类对象的类型可以自动转成父类类型
代码示例: Student stu2 = new UNStudent();
stu2.setName("张三");
stu2本身类型是UNStudent类,但被声明为了Student类。
这个时候如果在UNStudent没有方法的重写,那么stu2所调用到的方法就只有父类中的内容。
如果子类重写了父类的方法,则子类类型的对象会调用自己重写之后的方法。
转型以后仍然可以调用到UNStudent类中特有的方法。
//强制转型:强制将父类类型的变量转成子类类型
//强制转型可能会出现逻辑错误!!!
//对象的强制转型,一定是在前面某个地方使用了自动转型
UNStudent stu3 = (UNStudent)stu2;
此时将父类转变成子类,肯定会有一部分产生丢失。
强制转型语法 某一个子类 变量名= ( 某一个子类) 被声明属于父类的对象
3.对于子类特有的方法的调用
例如大学生要考四级,而普通学生不要考。可以定义:
public class UNStudent extends Student{
public void cet4(){
System.out.println(name+"在考试四级");
}
}
主类中可以:UNStudent stu1 = new UNStudent();
stu1.setName("吴杨");
stu1.cet4();
程序运行结果:吴杨在考试四级
但需要特别注意的是:当子类类型转变为父类类型时,通过父类类型的引用,只能调用已在父类中定义的方法,不能调用子类自己的方法,在java中子类只能继承一个父类,即单根继承
4.对于子类重写后的方法的调用
大学生虽然有学习方法,但与一般学生的学习方法应该是不一样的,我们有必要在UNStudent中对继承来的方法进行重写,保持方法的定义不变,但方法内部与父类不同。
例:
大学生类重写父类的方法
重写是指子类重新实现父类的方法,只能是方法体不一样
public void study(){
System.out.println(name+"是大学生,实行的是学分制学习");
}
5.方法重载与重写的理解,区别
重载是指在一个类中,同样的方法,但有不同的参数
public void study(){
System.out.println(name+"是大学生,实行的是学分制学习");
}
再加一个方法就是重载
public void study(s){
System.out.println(name+"是大学生,实行的是学分制学习");
}
重写
6.多态的理解
多态是指相同类型的对象调用相同的方法时,由于继承和重写机制,得到的结果不一定相同,只有运行时才知道是什么东西。
代码如下:再写一个ComStudent类:
public class ComStudent extends Student{
public void study(){
System.out.println("计算机专业学生,名字"+ getName());
}
}
public static void main(String [] args){
Student us=new UNStudent();
us.setName("是电气专业大学生");
Student cs=new ComStudent();
cs.setName("我是大学生");
Teacher tc=new Teacher();
//传入两个学生对象
tc.teacStu(us,cs);
}
这时,由于在UNStudent,ComStudent中,对方法study()的重写内容不同,所以最后肯定输出了不同的结果
我们在编写一个类的时候,所有的学生(无论大小中)都可以是一种类型的,即定义为一个简单的Student类
代码:
//所有一般类学生的定义
public class Student {
public String name;
public void setName(String name){
this.name = name;
}
public void study(){
System.out.println(name+"在学习");
}
}
但这个系统给某个大学使用时,就会出现问题——我们需要再定义一个大学生类,可以肯定的是,大学生中也有学习的方法,学分,名字属性,但具体的学习方法却是和一般学生是不一样的,所以我们就没必要再定义一个大学生类把这些代码再敲一遍,那么我们就可以定义一个学生类,让它继承Student类,因为不管什么学生都有study()这样一个方法。
代码示例:
public class UNStudent extends Student{
}
OK,通过extends 关键字,我们就免去了重写代码的麻烦,在UNStudent中就自动继承到了它的父类中的方法和属性。
代码示例:public class Test {
public static void main(String[] args){
UNStudent stu1 = new UNStudent();
stu1.setName("我是大学生");
stu1.study();
}
代码执行结果: 我是大学生在学习
2.自动转型与强制转型
在上面定义的两个类中,大学生类就是子类(扩展类) ,学生类就是父类(基类,超类)。
自动转型的意思:
就是子类对象的类型可以自动转成父类类型
代码示例: Student stu2 = new UNStudent();
stu2.setName("张三");
stu2本身类型是UNStudent类,但被声明为了Student类。
这个时候如果在UNStudent没有方法的重写,那么stu2所调用到的方法就只有父类中的内容。
如果子类重写了父类的方法,则子类类型的对象会调用自己重写之后的方法。
转型以后仍然可以调用到UNStudent类中特有的方法。
//强制转型:强制将父类类型的变量转成子类类型
//强制转型可能会出现逻辑错误!!!
//对象的强制转型,一定是在前面某个地方使用了自动转型
UNStudent stu3 = (UNStudent)stu2;
此时将父类转变成子类,肯定会有一部分产生丢失。
强制转型语法 某一个子类 变量名= ( 某一个子类) 被声明属于父类的对象
3.对于子类特有的方法的调用
例如大学生要考四级,而普通学生不要考。可以定义:
public class UNStudent extends Student{
public void cet4(){
System.out.println(name+"在考试四级");
}
}
主类中可以:UNStudent stu1 = new UNStudent();
stu1.setName("吴杨");
stu1.cet4();
程序运行结果:吴杨在考试四级
但需要特别注意的是:当子类类型转变为父类类型时,通过父类类型的引用,只能调用已在父类中定义的方法,不能调用子类自己的方法,在java中子类只能继承一个父类,即单根继承
4.对于子类重写后的方法的调用
大学生虽然有学习方法,但与一般学生的学习方法应该是不一样的,我们有必要在UNStudent中对继承来的方法进行重写,保持方法的定义不变,但方法内部与父类不同。
例:
大学生类重写父类的方法
重写是指子类重新实现父类的方法,只能是方法体不一样
public void study(){
System.out.println(name+"是大学生,实行的是学分制学习");
}
5.方法重载与重写的理解,区别
重载是指在一个类中,同样的方法,但有不同的参数
public void study(){
System.out.println(name+"是大学生,实行的是学分制学习");
}
再加一个方法就是重载
public void study(s){
System.out.println(name+"是大学生,实行的是学分制学习");
}
重写
6.多态的理解
多态是指相同类型的对象调用相同的方法时,由于继承和重写机制,得到的结果不一定相同,只有运行时才知道是什么东西。
代码如下:再写一个ComStudent类:
public class ComStudent extends Student{
public void study(){
System.out.println("计算机专业学生,名字"+ getName());
}
}
public static void main(String [] args){
Student us=new UNStudent();
us.setName("是电气专业大学生");
Student cs=new ComStudent();
cs.setName("我是大学生");
Teacher tc=new Teacher();
//传入两个学生对象
tc.teacStu(us,cs);
}
这时,由于在UNStudent,ComStudent中,对方法study()的重写内容不同,所以最后肯定输出了不同的结果