Java学习之继承
继承概述:Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的技术,新类的定义可以增加新的数据或新的功能,也可以使用父类的功能,但不能选择性的继承父类。Java不支持多重继承,单继承使Java的继承关系很简单,一个类只能有一个父类,易于管理程序,同时一个类可以实现多个接口,从而克服单继承的缺点。在面向对象的程序设计中继承是不可或缺的的一部分。通过继承可以快速创建新的类,实现代码的重用,提高程序的可维护性,节省大量创建类的时间,提高开发效率和开发质量。
继承思想很简单,在生活中表现为包含关系(就如电脑包括笔记本电脑,台式机电脑和平板电脑等等)但功能很强大,可以重用已经存在的类的字段和方法,提高了代码的重用性和程序的扩展性,继承所表达的是一种对象之间的相交关系,他使某类对象可以继承另一类对象的数据成员和成员方法,被继承的类叫做基类,父类或超类(object类),继承的类叫做派生类或子类,这样一来清晰的表达了每一项共同特征所适应的概念范围。
继承类的语法格式:
public class 类名(子类,派生类)extends 类名(父类,基类,超类) { }
除了object类没有父类以外,其他没个类都有一个并且只有一个直接的父类,称为Java的单继承。
需要注意的是构造方法不会被子类继承(所有属性和所有普通方法都被继承),但可以从子类中调用父类的构造方法,且在Java中子类继承父类后,总类必须要调用父类中的某一个构造方法,因为构造方法是用来实例化该类的对象的。
public class People{
//定义两个私有字段,代表People对象的两个属性
private String name
int age;
//定义一个带参的构造方法,用来初始化字段
public People(String name,int age){
this.name=name;
this.age=age;
}
//如果属性的访问修饰符不是public,则必须要给属性提供public的get和set方法
public String getName(){ //获得name属性的值
return name;
}
public void setName(String name){ //设置属性name的值
this.name=name;
}
public float getAge(){
return age;
}
public void setAge(int age){
this.age=age;
}
public class Man extends People{
//Man子类中增加一个字段,代表性别
public String sex;
//Man子类有一个构造方法
public Man (String name, int age,String sex){
super(name,age); //调用父类的构造方法
thisl.sex=sex; //初始化子类中新增加的属性
}
//Man类中增加一个方法
public void eat(){
system.out.println("吃饭")
}}
补充:Java中继承不存在循环继承
&&访问修饰符的使用范围:
访问修饰符 同类中 同包不同类中 不同包中 不同包但是有继承关系的子类中
private 可以 不可以 不可以 不可以
默认的 可以 可以 不可以 不可以
protected 可以 可以 不可以 可以
public 可以 可以 可以 可以
继承的优点:1.继承过来的字段可以向其他字段一样被直接使用。2.在子类中可以声明一个与父类中同名的新的字段,从而隐藏父类中的字段(不推荐使用)。3.可以在子类中声明一个父类中没有的新的字段和新的方法。4.从父类继承过来的方法可以直接使用。5.可以在子类中编写一个调用父类构造方法的子类构造方法,既可以隐式的实现,也可以通过关键字super来实现。
重写和隐藏父类方法:
子类继承了父类中的所有成员及方法,在某些情况下,子类中该方法所表示的行为与其父类中所表示的行为不完全相同,例如:在父类动物中定义了跑这个方法,而在子类中跑的方法是不同的。
重写的条件:1.必须要存在继承关系;
2.子类在重写方式时,子类方法的访问修饰符要大于或者等于父类方法的访问修饰符;
3.子类在重写方式时,子类方法的返回值类型,方法名,参数都必须要和父类的一致;
4.子类方法的具体实现要和父类的不同。
调用重写的方法,根据new关键字后的类名来决定,如果类名是子类,则优先调用子类的方法,如果子类中不存在,才会调用父类中的方法。
class A {
public void sayHello( ){
system.out.println("Hello,everyone!");
}
public void sayBye( ){
system.out.println("Goodbye,everyone!");
}
class B extends A{
public void sayHello( ){
system.out.println("大家好!");
}
public class Test1{
public static void main (String [ ] args){
B b=new B;
b.sayHello();
b.sayBye();
}}