目录
一、继承概念
二、为什么要继承
三、继承语法(关键字extends)
四、父类成员访问
1、子类中访问父类的成员变量
(1)子类和父类不存在同名的成员变量
(2)子类和父类中存在同名的成员变量
2、子类中访问父类的成员方法
(1)子类和父类不存在同名的成员方法
(2)子类和父类中存在同名的成员方法
五、了解super关键字
六、子类构造方法
七、super和this关键字区分
八、继承方式
九、final关键字
一、继承概念
继承是什么呢?继承的出现时为什么呢?主要解决的问题是什么呢?
在现实生活中,在一个人离世后,孩子需要继承父亲所留下来的东西,而在Java也是如此,子类继承父类所留下来的东西,这就是继承。
那出现的原因和主要解决的问题呢?很简单,对于每一个类,我们都需要写成员变量成员方法,那么如果它们的成员变量和成员方法都一样,我们真的要一个一个去写吗?这是一个很重要的问题,对于这个问题,在Java里面提供一种解决方法,那就是写一个派生类,里面写出它们的共有的方法和成员变量,而其他方法只需要继承这个这个类就行,这样就实现共性的抽取,实现代码的复用,这样就可以大大提高写代码的效率。我举个例,比如老师和学生都是人类,而人类都有名字,年龄,都会吃饭,那么我们就将者共性的内容进行抽取,然后采用继承的思想来达到共用。
而上面这个图也是老师和学生类继承人类这个派生类。
二、为什么要继承
对于为什么要继承,我在第一点说明白了,而这里就是一个小总结, 继承出现最重要的原因就是为了提高程序员编写代码的效率,通过创建一个共性——派生类,其他类通过继承这个派生类使用里面的共性,从而达到提高编写代码效率的效果。
三、继承语法(关键字extends)
对于继承的语法,我们需要使用到关键字extends。
语法格式是:
修饰符 class 子类 extends 父类{
//...
}
举个例子,以上面的老师学生和人类为例子。
public class Person {
String name;//共有的属性那么
int age;//共有的属性age
public void eat(){//共有的方法eat()
System.out.println(this.name+"正在吃饭");
}
}
public class Student extends Person{
int sno;
String sclass;
}
public class Teacher extends Person{
int sno;
String sclass;
}
对于Student和Teacher来说,name和age这俩个变量是继承父类的,可以使用,而如何使用呢?看下面代码:
public class test {
public static void main(String[] args) {
Student stu=new Student();
stu.name="zhangsan1";
stu.eat();
Teacher th=new Teacher();
th.name="lisi";
th.eat();
}
}
运行结果如下:
这样看的话会更加明白,使用方法也是和之前一样。
四、父类成员访问
1、子类中访问父类的成员变量
(1)子类和父类不存在同名的成员变量
public class Date011 {
int year1=2000;
int month1=12;
int day1=01;
}
public class Date012 extends Date011{
int year=2020;
int month=01;
int day=30;
}
public static void main(String[] args) {
Date012 date012=new Date012();
System.out.println(date012.day);
System.out.println(date012.year1);
System.out.println(date012.month1);
System.out.println(date012.day1);
}
打印结果如下:
·
在父类和子类都不同名的情况下,可以直接引用父类的成员变量。
(2)子类和父类中存在同名的成员变量
public class Date011 {
int year=2000;
int month=12;
int day=01;
}
public class Date012 extends Date011{
int year=2020;
int month=01;
int day=30;
}
public static void main(String[] args) {
Date012 date012=new Date012();
System.out.println(date012.day);
}
打印结果如下:
在父类和子类的成员变量名一样是,优先使用子类。
总结:(1)如果访问的成员变量子类中有的话,优先访问自己的成员变量。
(2)如果访问的成员变量子类中没有的话,先访问父类继承下来的,如果父类中也没 有定义,那就会编译报错。
(3)如果访问的成员变量与父类中成员变量同名,则优先访问自己的。
2、子类中访问父类的成员方法
(1)子类和父类不存在同名的成员方法
public class Date011 {
public void FuNvJie(){
System.out.println("三月八号");
}
}
public class Date012 extends Date011{
public void FuNvJie1() {
System.out.println("每年的三月八号");
}
}
public static void main(String[] args) {
Date012 date012=new Date012();
date012.FuNvJie1();
date012.FuNvJie();
}
打印结果如下:
如果成员方法名字在当前类有的话,优先使用当前类,如果当前类没有父类有的话,那么就使用父类的成员方法,如果都没有,则会报错。
(2)子类和父类中存在同名的成员方法
public class Date011 {
public void FuNvJie(){
System.out.println("三月八号");
}
}
public class Date012 extends Date011{
public void FuNvJie() {
System.out.println("每年的三月八号");
}
}
public static void main(String[] args) {
Date012 date012=new Date012();
date012.FuNvJie();
}
打印结果如下:
如果子类和父类出现成员方法都同名的时候,那么会实现方法重写,就会优先使用子类。
五、了解super关键字
对于super关键字是什么呢?我们前面讲到过this关键字的使用,this.属性名的方法指代的是当前对象的属性名,this()的方法是指代当前对象的构造对象,总的来说,this关键字就是用来指代当前对象,而super关键字则是访问父类的成员,提供super方法就是为了能够在子类更好的调用父类成员。那么具体该如何操作呢?观察以下代码:
public class Animal {
String name;
int age;
public Animal(String name,int age){
this.name=name;
this.age=age;
System.out.println(name+"已经"+age+"岁了");
}
}
public class Cat extends Animal{
public Cat(){
super("咪咪",2);//调用父类构造方法
super.age=10;//调用父类成员
}
}
public class Dog extends Animal{
public Dog(){
super("旺财",10);//调用父类构造方法
}
}
public static void main(String[] args) {
Dog dog=new Dog();
Cat cat=new Cat();
}
打印结果如下:
我们发现,可以在子类中调用父类中的构造方法,只需要使用super关键字就能做到,但是只能在子类方法中才能做到。
六、子类构造方法
在子类构造方法中,是先执行基类的,然后再执行子类的方法,以下面代码为例。
public class Animal {
String name;
int age;
int a=10;
int b=20;
public Animal(){//父类方法
System.out.println("Animal");
}
}
public class Dog extends Animal{
public Dog(){//子类方法
//super()如果没有调用super关键字,那么会默认调用super关键字。
System.out.println("Dog");
}
}
public class Test {
public static void main(String[] args) {
Dog dog=new Dog();//调用的时候,先执行父类,后执行子类。
}
}
打印结果如下:
在子类构造方法中,并没有写任何关于基类构造的代码,但在佛营造子类对象的时候,先执行基类的构造方法,然后执行子类的构造方法。因为:子类对象中成员是由俩部分组成的,父类继承下来的以及子类增加的部分。而在构造子类对象的时候,先要调用父类的构造方法,然后再调用子类自己的构造方法,从而将自己的成员初始化完整。
七、super和this关键字区分
super和this关键字我们到现在都有着一定的认识,那么它们都有什么共同点呢?
相同点:
(1)都是Java关键字;
(2)只能再类的非静态方法中使用,用来访问非静态成员方法和字段
(3)再构造方法中调用时,必须要放在语法中的第一条语句,并且不能同时存在。
不同点:
(1)this是指代当前对象的引用,super是用来指代子类对象中从父类继承下来部分成员的引用,简单来说,this引用当前类,super引用父类。
(2)在非静态成员中,this(...)用于调用本类的构造方法,super(...)用于调用父类的构造方法,俩种不能同时在构造方法中出现。
(3)构造方法中一定回存在super(...)的调用,用户没有写编译器也会增加,而this(...)用户不写则没有
八、继承方式
继承方式一共有三种,第一种是单继承,第二种是多层继承,第三种是不同类继承同一个类,单继承我们能理解,那多层继承是什么呢?主要就是父子关系上面还有一个爷爷这种叫做多层继承,如果以图来说的话就是:
在Java种不支持多继承,还有一点注意的就是,对于继承之间的层次太复杂,一般我们不希望超出三层的继承关系,如果继承层次太多,就需要考虑对代码进行重构了。
九、final关键字
对于final修饰变量或者字段,表示常量(即不能修改),如果修改就会编译出错。
public static void main(String[] args) {
final int a=0;
a=1;//报错
}
打印结果会直接报错,而对于final修饰类的话,那就是不能够被继承。
final public class Animal {
String name;
int age;
int a=10;
int b=20;
public Animal(){
System.out.println("Animal");
}
}
public class Dog extends Animal{//因为Animal被final修饰,所以不能够被继承
public Dog(){
System.out.println("Dog");
}
}
因为Animal被final修饰了,不能够被继承,不然就会报错。
这点是我们需要注意的地方。