什么是继承
一种类与类之间的关系
根据不同类之间共有的东西抽取出来放到父类中
猫和狗可以继承父类中开放的所有属性和方法,这样在编写猫和狗的类的时候只需要编写他们特有的东西。
新增别的动物类复用。
继承具有什么特点
使用已存在的类的定义作为基础建立新类。
新类的定义可以增加新的数据或者新的功能,也可以用父类的功能,但不能选择性地继承父类。不能选择性的意思是,子类一旦继承父类,它将获得父类一切开放的特征,没有选择余地。
满足“A is a B”的关系就可以行成继承关系。
继承的实现
java继承只能是单继承,一个孩子只能有一个亲爹。
首先创建父类
还是老三样 公有属性、无参构造、getter 和 setter、公用的方法
创建子类,子类独有的属性、无参构造、getter 和 setter、方法
私有的属性获取不到只能通过getter、setter
ctrl + shift +o 快速导包
子类的独有成员,其他的兄弟成员也是访问不到的。
]654567890-
package com.immoc.test;
import com.immoc.animal.Cat;
import com.immoc.animal.Dog;
public class Test {
public static void main(String[] args) {
Cat cat1 = new Cat();
cat1.setName("花花");
cat1.setSpecies("英国短毛");
cat1.eat();
cat1.run();
System.out.println("==================================");
Dog dog1 = new Dog();
dog1.setName("土土");
dog1.setMonth(11);
dog1.eat();
dog1.sleep();
}
}
方法重写
方法重载:1、在同一个类中2、方法名相同,参数列表不同(顺序、个数、类型)3、方法返回值、访问修饰符不做限制
4、与方法的参数名称无关
方法重写
1、有继承关系的类中2、子类重写父类方法
3、方法名、参数列表(顺序、个数、类型)完全相同、方法返回值
4、访问修饰符?
5、与方法的参数名无关,无关
与方法的参数名无关,无关
除了方法,属性 也是可以重写的。
在子类可以定义与父类重名的属性,最后也是使用子类重写后的值。
访问修饰符
private-访问限定最小的修饰符
只允许在本类当中访问。在当前类内的方法进行访问无问题(get set)。
public-访问权限最大
允许任意位置访问。
只要能正确加载public成员所在的类型,就可以访问到public定义的成员。
protected
当前类中可以访问。同包当中的子类也可以访问。跨包子类调用也可以调用。
同包无继承关系可以调用。(同包的情况下都可以访问到)
跨包无继承关系的类不能调用。
默认访问权限
允许在当前类、同包子类、非子类可以调用、
跨包子类、非子类不允许调用
访问修饰符对方法重载的影响
子类对方法重写的过程中,允许对访问修饰符与父类方法不同。访问范围要求大于等于父类范围。
super关键字
用于,父类对象的引用。我们可以通过super去访问父类中允许被子类继承的任意成员。
第一个super
需要注意一点,父类的构造方法是不允许被子类继承的,我试了一下其实是可以的,只不过构造方法一定要配合new去使用。
不能被重写。
继承的初始化顺序
满足继承关系的子类对象是如何产生的
Cat one = new Cat(); Cat one 父类静态属性---->父类静态代码块---->子类静态属性---->子类静态代码块 new Cat() 父类构造代码块---->父类无参构造器---->子类构造代码块--->子类无参构造器
package com.immoc.animal;
public class Animal {
//成员属性:昵称、月份、品种
private String name;
private int month;
private String species;
public int temp =100;
private static int st1= 11;
public static int st2 = 22;
static {
System.out.println("我是父类静态代码块");
}
{
System.out.println("我是父类构造代码块");
}
//无参构造
public Animal() {
System.out.println("我是父类无参构造器");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public String getSpecies() {
return species;
}
public void setSpecies(String species) {
this.species = species;
}
//吃东西
public void eat() {
System.out.println(this.getName() + "is eating");
}
public void eat(String name) {
System.out.println(name + "is eating");
}
}
package com.immoc.animal;
public class Cat extends Animal {
private double weight;
public static int str3 =33;
static {
System.out.println("我是子类静态代码块");
}
{
System.out.println("我是子类构造代码块");
}
public Cat() {
System.out.println("我是子类的无参构造方法");
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
//跑动的方法
public void run() {
System.out.println(this.getName() + "是一只" + this.getSpecies() + "在快乐的奔跑");
}
}
package com.immoc.test;
import com.immoc.animal.Cat;
public class TestXunXu {
public static void main(String[] args) {
Cat one = new Cat();
}
}
那么我们就面对一个问题,子类是否有权力选择调用父类哪个构造方法。
我们子类有参构造的时候发现父类的有参构造被无视掉了。还是去找的父类的无参构造。
java继承的一个重要特点:子类继承没有显示标注的时候默认调用父类的无参构造方法。