Person类中已经定义过一些结构如属性,方法,Student新创建的类里也有这些结构,那么Student类呢能不能复用Person类里的结构,就会使代码简单很多。就可以使用继承性实现。
package com.csdn.day;
public class Person {
String name;
int age;
public Person(){
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
}
package com.csdn.day;
public class Student {
String name;
int age;
String major;
public Student(){
}
public Student(String name, int age,String major){
this.name = name;
this.age = age;
this.major = major;
}
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
public void study(){
System.out.println("学习");
}
}
public class Student extends Person{
/*String name;
int age;*/ //Person中定义过的不写了
String major;
public Student(){
}
public Student(String name, int age,String major){
this.name = name;
this.age = age;
this.major = major;
}
/* public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}*/
public void study(){
System.out.println("学习");
}
}
class A extends B{}
A 子类 派生类 subclass
B 父类 超类 superclass
一旦子类A继承父类B以后,子类A中就获取了父类B中声明的结构,如属性,方法私有的结构因为封装性的影响,使得子类不能直接调用符类的结构。
私有的属性也继承了,只不过外界不能轻易调用,需要通过get,set处理;私有方法也获取到了,验证在其他方法中调用私有方法,然后让对象调用那个“其他方法”,发现私有方法也执行了
子类继承父类之后,还可以声明自己特有的属性或方法,来实现功能的扩展
如果没有显式地声明一个类的父类的话,则此类继承于java.lang.Object类。
在IDEA中,选中类名,快捷键 ctrl + h ,Eclipse ,ctrl + t ,可以看到当前类以及父子类结构
所有的Java类,除java.lang.Object外,都直接或间接的继承于java.lang.Object类。
意味着,所有的java类具有Object类声明的功能。
从父类中继承过来的方法不能满足子类需求,子类可以对父类中继承过来的方法进行改造,这为重写或覆盖。程序执行时,子类方法将覆盖父类的方法。
重写以后,创建子类对象去调用子父类中的同名同参的方法时,实际执行的是子类重写父类的方法。父类对象调用同名方法,执行的是父类中的方法。
方法重载Overload, java的类中函数名相同,参数个数,类型不一样的函数之间可以构成重载。注意,是否构成重载和方法的修饰符,形参列表名,方法体,返回值都无关,只和参数个数,类型有关。
方法重写Override,父类方法的实现不能够满足子类的需求,子类可以对父类继承过来的方法重新实现。
特点:
方法名,参数列表必须完全一致;
子类方法的访问修饰符可以和父类不同,但有限制,其修饰符要比父类的范围大;特殊情况,子类不能重写父类中声明为private权限的方法。
返回值类型也可以不同,限制是,子类的返回值类型须是父类返回值类型或其子类型。如果父类被重写的方法的返回值类型是void,子类重写的方法的返回值类型只能是void;若父类返回值类型是基本数据类型,如double,则子类重写方法的返回值类型必须是相同的基本数据类型,必须也是double
子类和父类中同名同参的方法,若要是重写的话,那么是非static的,声明为static的话,方法就不归为重写方法了。static在权限修饰符和返回值类型之间