Java是一门纯粹的面向对象的编程语言
面向对象有三个基本特征:封装 继承 多态
封装:隐藏实现细节,对外提供公共的访问方法。就是将成员变量(属性)进行私有化,同时对外提供getter和sertter方法,方法和类 也是封装的一种表现形式
继承
类中:属性、类属性 、构造方法、构造代码块、静态代码块、普通方法、静态方法
类与类之间的关系:继承
继承在代码中的体现:extends
例子:
人
职业:学生
工人
教师
性别:
男人
女人
年龄:
未成年人
成年人
通过关键字 extends 来使两个类之间产生了关系
产生了继承的关系:
student 是 person 的子类/派生类/衍生类
person 是 student 的父类/超类
java中继承的特点
- Java中的继承都是单继承,不允许多继承,但是可以允许多重继承。也就是说:一个类只能有一个父类
- 一个类只能有一个父类,但是一个类可以有多个子类在继承中,子类都可以继承父类的哪些成员:
- 子类可以继承父类的非私有的成员属性:不能是private修饰的。区分子类和父类的同名的成员属性:super:代表父类的当前对象
- 构造方法。构造方法不能继承,但是当我们去创建子类对象的时候,会先调用父类的构造方法;在子类的构造方法中,如果要调用父类的构造方法,对共有的属性进行初始化那么就可以使用super()来调用父类的构造方法,但是在使用的时候,必须出现在构造方法的第一句
- 构造代码块。当我们创建子类对象的时候,也会先执行父类的构造代码块,再执行父类构造方法,再执行子类构造代码块,子类的构造方法
- 静态代码块。如果创建父类对象,那么就在创建父类对象之前,执行一次父类的静态代码块,在创建子类对象的时候,静态代码块就不在执行了,如果没有创建父类对象,那么在创建子类对象的时候,首先会执行父类的静态代码块,而且只执行一次
- 普通方法。方法的继承,也是只能继承非私有的方法。当我们去使用子类对象去调用一个方法的时候,首先在子类中找,如果子类中有,则执行子类的方法,如果子类中没有,则去父类中找,如果父类中有,则执行父类的。在同一个类中,如果方法名称相同,则称为重载(需要满足重载要求);在同一个类中,如果出现在继承的两个类中,方法名称相同,则称为重写(覆盖):
重写的条件:
1、存在继承关系的两个类中
2、方法的声明必须完全一致(方法的名称和参数列表必须完全相同)
3、子类中的重写父类的方法的时候,不能采用比父类更为严格的访问修饰符
方法重写的作用:
对父类中的该方法进行扩展或者重新实现。
- 静态方法。从表现形式上来说,静态方法也能继承,但是本质不是继承。对于静态方法不能进行重写
- final关键字。可以修饰类、修饰变量、修饰方法。使用final修饰的类不能被继承;使用final修饰的变量只能被赋值一次使用final修饰的方法不能被重写。final的使用场景:
1、类不想被继承
2、使用final修饰的变量的值,不想被修改。一般情况下,使用final修饰的变量称为常量,而且常量的修饰一般是 static 和 final共同进行修饰
3、方法不想被重写
继承的好处
- 提高了代码的复用性。多个类相同的成员可以放到同一个类中
- 提高了代码的维护性。如果功能的代码需要修改,修改一处即可
- 让类与类之间产生了关系,是多态的前提。其实这也是继承的一个弊端:类的耦合性很强。
子类是父类的扩展,不是简单的复制
package org.lanqiao.extenddemo2;
public class Animal {
public String name = "小强";
protected int age;
int leg;
public Animal() {
System.out.println("父类的构造方法");
}
public Animal(String name, int age,int leg) {
this.name = name;
this.age = age;
this.leg = leg;
}
{
System.out.println("父类的构造代码块");
}
static{
System.out.println("父类的静态代码块");
}
public void showInfo() {
System.out.println(this.name +"--"+this.age+"--"+this.leg);
}
public final void show() {
System.out.println("父类的普通方法....");
}
public static void print1() {
System.out.println("父类的静态方法");
}
}
package org.lanqiao.extenddemo2;
public class LandAnimal extends Animal {
public String name ="旺财";
public int speed;
public LandAnimal() {
System.out.println("子类的构造方法");
}
public LandAnimal(int speed) {
this.speed = 20;
}
public LandAnimal(String name, int age,int leg) {
this.name = name;
this.age = age;
this.leg = leg;
}
public LandAnimal(String name , int age, int leg,int speed) {
//this(name,age,leg);
super(name,age,leg);
this.speed = speed;
}
{
System.out.println("子类的构造代码块");
}
static{
System.out.println("子类的静态代码块");
}
public void printInfo() {
System.out.println(super.name +"--"+age+"--"+leg);
}
@Override
public void show() {
System.out.println("子类的普通方法");
}
@Override
public String toString() {
return "LandAnimal [name=" + name + ", speed=" + speed + "]";
}
public static void print1() {
System.out.println("子类的静态方法");
}
}
测试代码
package org.lanqiao.extenddemo2;
public class Test {
public static void main(String[] args) {
/*Animal a = new Animal();
a.showInfo();*/
System.out.println("--------------------");
LandAnimal la = new LandAnimal();
la.printInfo();
LandAnimal la1 = new LandAnimal();
la1.show();
System.out.println(la1.toString());
LandAnimal.print1();
}
}