java继承知识点小结
Java继承的概念
继承是面向对象中一个非常重要的特性,通过继承,子类可以使用父类中的一些成员变量和方法,从而提高代码的复用性,提高开发的效率。被继承的类叫做基类或者父类,继承基类或父类的类叫派生类或子类,继承通过关键字extends关键字来实现的。
继承格式
public class 子类名 extend 父类名{}
继承的一些特性
1.java语言不支持多重继承,也就是子类最多只有一个父类,但是可以通过实现多个接口的方式来实现多重继承的目的。
2.子类会继承父类中所有属性和方法,但是父类私有(private)属性和方法不能直接使用,可以通过对父类进行set和get方法来进行使用父类的方法和属性。
3.子类可以覆盖(重写)父类的方法,重写应该满足:a.有继承关系的两个类之间,b.函数名和返回值以及参数类型和顺序应该也是相同的 c.子类的访问修饰符权限应该要大于等于父类的访问权限。当这三个条件有一个不满足时,便不是重写。
4.同样的子类定义的成员变量与父类同名时,子类中的成员变量会覆盖父类的成员变量。
父类权限为public时, 子类只能是public
父类权限为protected时 子类只能是public和protected
父类权限为默认时 子类只能是public和protected和默认
父类权限为private时 子类只能是public和protected和默认和private
发生多态的三个前提条件:
1. 继承。多态发生一定要子类和父类之间。
2. 覆盖。子类覆盖了父类的方法。
3. 声明的变量类型是父类类型,但实例则指向子类实例。
即为 :父类 对象=new 子类();
多态发生时,Java虚拟机运行时根据引用变量指向的实例调用它的方法,而不是根据引用变量的类型调用,也就是看new 这边的类重写的方法。
## 类与对象
首先类包含了属性和方法,比如说动物类,它有状态和行为,状态有颜色,名字和品种,而行为的话,有吃饭,睡觉,咬人等等。所以我们可以看成,将类的属性和方法对应于状态和行为。
类中的成员变量有:局部变量和成员变量和类变量。
**局部变量:**定义在方法体(方法,构造方法,语句块)内部的变量,变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
**成员变量:**成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
**类变量:**类变量也声明在类中,方法体之外,但必须声明为 static 类型,因此属于静态变量。
构造方法:
每个类都有构造方法。如果没有显式地为类定义构造方法,Java 编译器将会为该类提供一个默认构造方法。在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。
> //定义带参构造函数,用于初始化属性 public JueSe1(String name, int blood, int gongji) {
> this.name = name;
> this.blood = blood;
> this.gongji = gongji; }
> //定义无参构造函数
> public JueSe1() {
>
> }
创建对象:对象是根据类创建的。在Java中,使用关键字 new 来创建一个新的对象。创建对象需要以下三步:
声明:声明一个对象,包括对象名称和对象类型。
实例化:使用关键字 new 来创建一个对象。
初始化:使用 new 创建对象时,会调用构造方法初始化对象,如果构造方法里面的运行语句,会运行。如果子类继承父类的情况下,在子类的构造函数里要调用一次父类的构造方法(super(参数)),如果父类有无参构造,默认不写也可以。
父类Person
public class Person {
private String name;
private int blood;
private int gongji;
//定义带参函数
public Person(String name,int blood,int gongji){
this.name=name;
this.blood=blood;
this.gongji=gongji;
System.out.println("父类的构造函数");
}
子类JueSe1
public class Juese1 extends Person {
//子类的构造函数
//先调用一次父类的构造函数,相当于初始化子类的信息,若有新的属性,再添加即可
public Juese1(String name,int blood,int gongji){
super(name,blood,gongji);
System.out.println("子类1的构造函数");
}
}
public class JueSe2 extends Person {
//子类的构造函数
//先调用一次父类的构造函数,相当于初始化子类的信息,若有新的属性,再添加即可
public JueSe2(String name,int blood ,int gongji){
super(name,blood,gongji);
System.out.println("子类2的构造函数");
}
}
public class Main {
public static void main(String[] args) {
Person P1 = new Juese1("后羿", 100, 10);
Person P2 = new JueSe2("鲁班", 100, 20);
}
}
输出:
父类的构造函数
子类1的构造函数
父类的构造函数
子类2的构造函数