子类继承父类的哪些成员
先写父类还是先写子类:
一般我们在开发中先编写多个自定义类,写完之后发现多个类之间存在相同的代码,此时可以抽取一个父类。
我们以后做开发,都是基于框架/组件来做的,我们是在别人的基础之上继续开发。
好比别人提供清水房,我们只需要在清水房的基础之上装修,就可以使用。
以后,我们定义新的类回去继承与框架中/组件中提供的父类。
--------------------------------------------
子类继承父类之后,可以拥有父类的某些状态和行为,(子类复用了父类的功能或状态)。
子类继承父类的哪些成员(根据访问修饰符来判断):
1:如果父类中的成员使用public修饰,子类无条件继承。
2:如果父类中的成员使用protected修饰,子类也继承,即使父类和子类不在同一个包中。
3:如果父类和子类在同一个包中,此时子类可以继承父类中 缺省修饰符的成员。
4:如果父类中的成员使用private修饰,子类打死也都继承不到。private只能在本类中访问。
5:父类的构造器,子类也不能继承,因为构造器必须和当前的类名相同。
-----------------------------------------------------------------------------------
方法重载和方法覆盖(方法)的区别:
方法重载:Overload
方法重写:Override
批判,本身二者一点关系都没有,仅仅只是因为名字很像。
--------------------------------------------
方法重载:Overload
作用:解决了一个类中,相同功能的方法不同的问题。
既然是相同的功能,那么方法的名字就应该相同。
规则:两同一不同
同类中,方法名相同,可能参数列表不同(参数类型、参数个数、参数循序)。
方法重写:Override
作用:解决子类继承父类之后,可能父类的某一个方法不满足子类的集体特征,此时需要重新在新类中定义
该方法,并重新写方法体;
规则:一同两小,一大;
一同:父类和子类的方法签名是相同的,所以。建议:直接拷贝父类中方法的定义到子类中,在重写的方法体,就OK了;
--------------------------------------------------------------------
Super关键字
需求,在类中的某一个方法中,去调用父类呗覆盖的方法;
此时的解决方法:使用super关键字:
this: 当前对象,谁调用this所在的方法,this就是哪一个对象。
super: 当前对象的父类对象。
------------------------------------------------------------------------
子类初始化过程:创建子类对象的过程:
在创建子类对象之前,会先创建父类对象,
调用子类构造器之前,在子类构造器中,会先调用父类的构造器,
默认调用的是父类无参数构造器....
1:如果父类不存在可以被子类访问的构造器,则不能存在于子类;
2:如果父类没有提供无参数构造器,子类必须显示通过super语句去调用父类带参数的构造器。
(必须先有父类对象,而后才有子类对象)
(必须先调用父类构造器,而后再调用子类构造器)
例子:
//父类
class Animal{
private String name;//私有 名字
private int age;//私有的字段名 年龄
Animal(String name,int age){
System.out.println("Animal构造器");
this.name = name;
this.age = age;
}
public String getName(){
return name + "," + age;
}
}
//子类
class Fish extends Animal{
private String color;
Fish(String name,int age,String color){
super(name,age);
this.color = color;
}
public void say(){
System.out.println(getName() + "," + this.color);
}
}
//子类初始化过程:创建子类对象的过程
public class EditPlus{
public static void main(String[] args){
Fish f = new Fish("Animal",5,"橙黄色");
f.say();
}
}