多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,这个类就是父类,那么多个子类无需再定义这些属性和行为,只要继承那一个包含所需属性或者方法的类即可,大大减少了程序的冗余代码;
其中多个需要调用该方法的类可以称为子类,涵盖所需属性和方法类称为父类、超类(superclass)或者基类,其中,在Java中有个超类Object,Java中的所有类都直接或者间接地继承Object类。
类与类之间的继承为单继承,一个子类只能继承自一个父类;
注:Object为一个特例,单继承只发生在类的extends中。
子类默认继承父类中的除私有属性和方法外的,所有属性和方法;
子类在继承父类的属性和方法外,也可以拥有自己特有的属性和方法。
子类可以继承父类中的除私有属性或者方法以外的所有属性和方法,子类默认继承父类中的所以方法,其中也包含父类中已经写好的方法,如果子类想要调用该方法,可以对父类方法进行重写。
继承的优点:继承的代码演示:1.提高了代码的复用性;
2.是多态的前提(使类与类之间产生了关系)。
//Person_父类
public class Person {
private int num = 15;
int number = 100;
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
}
//父类可以派生出多个子类,但是子类只能继承一个父类(类之间为单继承)
//Student子类
public class Student extends Person {
//Student子类中没有任何方法,但是他的实现类却可以调用父类中的方法
}
//Teacher子类
public class Teacher extends Person {
int num2 = 15;
//子类也可以有自己的属性和方法
public void function(){
//子类不能访问父类中私有的成员变量
// System.out.println(num);
System.out.println(num2);
System.out.println(number); //可以调用父类中非私有属性
}
}
/*
* 定义测试类:子类默认继承父类中除私有私有属性和方法外的所有属性和方法
*/
public class PersonTest {
public static void main(String[] args) {
Student s = new Student();
s.eat(); //子类可以调用父类中的方法
s.sleep();
Teacher t = new Teacher();
t.eat();
t.sleep();
t.function();//子类也可以调用自己的方法
}
}
super关键字:
当父类中子类中定义的属性重名时,就需要使用super关键字来区分;super关键字和this关键字的使用方式相同,但是super关键字是用来指代父类对象的。
public class Teacher extends Person {
int number = 200;
//子类成员方法
public void function(){
//如果子类成员变量的名与父类成中变量名一样,就近原则
// System.out.println("Fu number="+number); //200
//我就想访问父类中的成员变量,怎么办?用super
System.out.println(super.number);//此时访问的就是父类的成员变量 100
}
}
super关键字的使用:
注意:【super.父类成员方法】,表示调用父类的成员方法
【super.父类成员变量名】,表示调用父类的成员变量
【super()】,表示访问父类中的无参构造
【super( 参数列表)】, 表示访问父类中的有参构造
注:super 关键字和 this关键字 不能一起使用!
1.父类中的成员变量是非私有的,子类中可以直接访问。
2.若父类中的成员变量私有了,子类是不能直接访问的。通常编码时,我们遵循封装的原则,使用private修饰成员变量,子类访问父类中的私有属性时可以使用父类中提供公共的getXxx方法和setXxx方法。
3.构造方法的名字是与类名一致的。所有子类是无法继承父类构造方法的。
注:构造方法的作用是初始化成员变量的。
子类的初始化过程中,必须先执行父类的初始化动作。
子类的构造方法中默认有一个super() , 表示调用父类的构造方法,父类成员变量初始化后,才可以给子类使用。在每次创建子类对象时,都会先初始化父类构造方法,再创建其子类对象本身。
在子类构造方法中的第一行默认有 super() ,给父类进行初始化的;
在子类构造方法中可以手动调用父类其他重载的构造方法 ;
格式: super(参数列表);
super 是写在子类的构造方法的第一行。
针对子类中的方法名和父类中的方法名相同的情况。
重写发生在具有继承关系的两个类中!
重写的条件:返回值类型、方法名和参数列表都相同。
注意重写和重载的区别:重写,发生在具有继承关系的子类中,子类中的方法必须和父类中的方法名、参数列表以及返回值类型都相同;
重载,发生在类中,重载的类必须保证方法名相同,参数列表不同,但是重载和返回值类型无关,不能以返回值类型来判断方法的重载。
重写的代码演示://父类
public class Father {
public void show(){
System.out.println("我是父类Father");
}
public void method(){
System.out.println("我是父类method");
}
}
//子类
public class Son extends Father {
public void show2(){
System.out.println("我是子类Father");
}
public void method(){
System.out.println("我是子类method");
}
}
//测试
public class SonTest {
public static void main(String[] args) {
Son s = new Son();
s.show();//调用父类方法
s.show2();//调用子类方法
System.out.println("===================");
//方法重写:子类中出现了与父类中的一模一样的方法
//子类重写了父类的方法
s.method();
}
}
欢迎关注微信公众号:小红的成长日记,一起学Java!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)