继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
extends的意思是"扩展"。子类是父类的扩展。(继承可以有传递性即孙子可以继承爷爷的属性和方法)
Java中类只有单继承,没有多继承。并且继承是类和类之间的操作。
一个父亲可以有多个儿子。
以下为代码实例:
首先定义一个Persons作为父类,并定义一些属性。
package com.xzc.oop;
public class Persons {//父类
String name = "xzc";//在同一个package下可以使用
public int height = 180;//公开属性任意情况都可以使用
private int age = 10;//此时private为父类私有的不能被继承 但是可以通过get/set方法进行取值和赋值
public void say(){
System.out.println("说了一句话");
}
public void getAge(){
System.out.println(this.age);
}
}
接下来定义子类Man并继承父类Persons
Man中除了继承来的属性和方法没有其余的。
package com.xzc.oop;
//Man is Persons
public class Man extends Persons{//Man继承了Persons Man为子类、派生类
}
最后调用继承成果,可以发现尽管Man中没有属性和方法,但是也可以调用出父类的属性和方法。
package com.xzc.oop;
import com.xzc.oop.Student;
public class Application {
public static void main(String[] args) {
Man man = new Man();
man.say();//虽然Man类中什么也没有 但是继承了Persons类的参数和方法所以方法也可以被调用
//说了一句话
System.out.println(man.name);//xzc
System.out.println(man.height);//180
//System.out.println(man.age);//报错age为父类私有属性能被继承,但没有使用权
man.getAge();//10 虽然age为private但是可以利用get/set方法实现调用和赋值
}
}
在Java中,所有的类,都默认直接或者间接继承Object
- super详解
super和this是一对近义词:我们之前写的this.()用法是表示该类下的类变量,而super则表示父类中的类变量。(当然this和super后加方法也分别代表同样的意思)
当方法中形参不与类变量重名时
package com.xzc.test;
public class test{
private String name;
private int age;
public void t(int a){//此时t方法中的形参不与类变量重名
this.name = "zyj";//this.name代表的是类变量
name = "xzc";//可以用name来代替this.name并且二者没有区别,因为类变量和t方法都是非static修饰的所以可以直接调用
}
}
当方法中有与类变量重名的形参时,需要对两个变量名进行区分就用this
package com.xzc.test;
public class test{
private String name;
private int age;
public void t(String name){//此时t方法中有与类变量重名形参
name = "zyj";//name代表的是传入的形参
this.name = "xzc";//而this.name则表示类变量name
}
}
当方法中出现父类变量、类变量、传入形参三者都重名的情况,则用this表示类变量,super表示父类变量。
package com.xzc.test;
public class test extends Test{
private String name;
private int age;
public void t(String name){//此时t方法中有与类变量重名形参
name = "zyj";//name代表的是传入的形参
this.name = "xzc";//而this.name则表示类变量name
super.name = "xt";//super.name表示该类的父类中的name变量
}
}
注意:当主函数进行new对象时,该语句先执行父类构造器然后再执行该类构造器。 这也导致父类和子类的构造器中必须要各有一个无参构造器,以达到调用时不报错。
最后总结一点:就是在主函数中使用对象名.变量(或方法)可以调用出对应对象类的类变量(类方法),当对象类中无此类变量名时则调用的是父类中的类变量。若子类和父类都有同名的类变量时,对象名.变量只能调用子类的类变量,无法调用父类的类变量,若想调用父类变量则需要在子类中写出调用方法,方法中需包含super.变量名。