(一)继承
1.概述:将多个类的共性内容,抽取到一个独立的类中,独立的类和着多个类就产生一种关系,这种关系即为继承.extends:表示继承
2.格式:class Zi extends Fu{}
3.特点:在java中,支持单继承,不支持多继承,支持多层继承.
4.注意事项:
1)子类不能继承类的私有的成员(成员变量/成员方法)
2)子类不能继承父类的构造方法,但是可以间接的通过super关键字去访问父类的构造方法
5.子类父类成员变量名称一致情况:
例:
package 继承;
//继承中子类和父类成员变量名称一致的情况
//父类
class Fu1{
int num = 10;//3) 10
}
//子类
class Zi1 extends Fu1{
// int num = 20;//2) 20
public void show(){
// int num = 30;//1) 30
System.out.println(num);
}
}
//测试类
public class ExtendsDemo2 {
public static void main(String[] args) {
//创建子类对象
Zi1 z = new Zi1();
z.show();
}
}
1)先在子类中的成员方法的局部位置查找有没有这个变量,有就输出
2)如果在子类成员方法的局部位置找不到,就访问子类的成员位置,有就输出
3)如果在子类的成员位置找不到,就去访问父类的成员位置
4)如果在父类的成员位置找不到,那么就没有这个变量,报错
6.this关键字和super关键字:
this:代表当前类的对象
super:代表父类的引用
应用场景:
成员变量
this.成员变量: 访问当前类中的成员变量
super.成员变量: 访问父类中的成员变量
构造方法
this(...); 访问的是本类中构造方法
super(".."); 访问的是父类中的无参构造
成员方法
this.成员方法; 访问的是本类的成员方法
super.成员方法; 访问的就是父类中的成员方法
例:
package 继承;
//this关键字和super关键字
class Fu3{
//成员变量
int num = 10;
//构造方法
public Fu3(){
System.out.println("这是父类的无参构造方法");
}
}
class Zi3 extends Fu3{
int num = 20;
public Zi3(){
System.out.println("这是子类的无参构造方法");
}
public void function(){
int num = 30;
System.out.println(num);
System.out.println(this.num);
System.out.println(super.num);
}
}
//测试类
public class ExtendsDemo3 {
public static void main(String[] args) {
//创建对象
Zi3 z = new Zi3();
z.function();
}
}
7.构造之间的关系:
1)子类中的构造方法(有参/无参)都会默认的访问父类中的无参构造方法.即子类继承父类进行初始化,父类初始化完毕,才能进行子类的初始化
父类中没有无参构造的情况:
(1)在父类中给出无参构造方法
(2)使用super关键字去显示的访问父类中的带参构造.super关键字写在所有语句中的最上面
(3)子类的构造可以使用this关键字去调用其他的构造方法,去间接的访问父类的带参构造
2)子类中的构造方法的第一句话super();被隐藏
8.方法重写:
1)概述:子类出现了和父类一模一样的方法声明
2)注意事项:
(1)如果父类的成员方法被private修饰,子类中的方法不能重写父类的私有的方法
(2)子类要重写父类的方法,访问权限不能更低,子类和父类方法保持一致
(3)如果父类中的成员方法是静态方法,子类重写父类中的这个方法,也必须是静态
(静态方法算不上方法重写)规则:静态只能访问静态!
3)方法重写和方法重载:
overload:在同一个类中,方法名相同,参数列表不同(参数个数/参数类型),与返回值没有关系
override:子类的方法和父类的一模一样,连返回值都一样.
9.猫狗案例:
package 继承;
/*
* 猫狗案例:
* 猫类:
* 成员变量:品种breed 性别sex 颜色color
* 成员方法:
* 喜欢和主人玩
* 喜欢吃鱼
* 狗类:
* 成员变量:品种breed 性别sex 颜色color
* 成员方法:
* 喜欢和主人玩
* 喜欢吃骨头
* 动物类:
* 成员变量:品种breed 性别sex 颜色color
* 成员方法:
* 喜欢和主人玩
* */
//动物类
class Animal{
//定义成员变量
private String breed;
private String sex;
private String color;
//父类的无参构造方法
public Animal(){
}
//get()/set()方法
public String getBreed() {
return breed;
}
public void setBreed(String breed) {
this.breed = breed;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
//成员方法
public void play(){
System.out.println("喜欢和主人玩");
}
}
//猫类
class Cat extends Animal{
public Cat(){}
public void eat(){
System.out.println("喜欢吃鱼");
}
}
//狗类
class Dog extends Animal{
public Dog(){}
public void eat(){
System.out.println("喜欢吃骨头");
}
}
//测试类
public class extendsTest {
public static void main(String[] args) {
//创建子类的对象
Cat c = new Cat();
Dog d = new Dog();
//赋值
c.setBreed("折耳猫");
c.setSex("雌性");
c.setColor("白色");
d.setBreed("哈士奇");
d.setSex("雄性");
d.setColor("灰色");
//输出
System.out.println("这是一只"+c.getColor()+"的"+c.getSex()+c.getBreed());
c.play();
c.eat();
System.out.println("这是一只"+d.getColor()+"的"+d.getSex()+d.getBreed());
d.play();
d.eat();
}
}
1.概述:将多个类的共性内容,抽取到一个独立的类中,独立的类和着多个类就产生一种关系,这种关系即为继承.extends:表示继承
2.格式:class Zi extends Fu{}
3.特点:在java中,支持单继承,不支持多继承,支持多层继承.
4.注意事项:
1)子类不能继承类的私有的成员(成员变量/成员方法)
2)子类不能继承父类的构造方法,但是可以间接的通过super关键字去访问父类的构造方法
5.子类父类成员变量名称一致情况:
例:
package 继承;
//继承中子类和父类成员变量名称一致的情况
//父类
class Fu1{
int num = 10;//3) 10
}
//子类
class Zi1 extends Fu1{
// int num = 20;//2) 20
public void show(){
// int num = 30;//1) 30
System.out.println(num);
}
}
//测试类
public class ExtendsDemo2 {
public static void main(String[] args) {
//创建子类对象
Zi1 z = new Zi1();
z.show();
}
}
1)先在子类中的成员方法的局部位置查找有没有这个变量,有就输出
2)如果在子类成员方法的局部位置找不到,就访问子类的成员位置,有就输出
3)如果在子类的成员位置找不到,就去访问父类的成员位置
4)如果在父类的成员位置找不到,那么就没有这个变量,报错
6.this关键字和super关键字:
this:代表当前类的对象
super:代表父类的引用
应用场景:
成员变量
this.成员变量: 访问当前类中的成员变量
super.成员变量: 访问父类中的成员变量
构造方法
this(...); 访问的是本类中构造方法
super(".."); 访问的是父类中的无参构造
成员方法
this.成员方法; 访问的是本类的成员方法
super.成员方法; 访问的就是父类中的成员方法
例:
package 继承;
//this关键字和super关键字
class Fu3{
//成员变量
int num = 10;
//构造方法
public Fu3(){
System.out.println("这是父类的无参构造方法");
}
}
class Zi3 extends Fu3{
int num = 20;
public Zi3(){
System.out.println("这是子类的无参构造方法");
}
public void function(){
int num = 30;
System.out.println(num);
System.out.println(this.num);
System.out.println(super.num);
}
}
//测试类
public class ExtendsDemo3 {
public static void main(String[] args) {
//创建对象
Zi3 z = new Zi3();
z.function();
}
}
7.构造之间的关系:
1)子类中的构造方法(有参/无参)都会默认的访问父类中的无参构造方法.即子类继承父类进行初始化,父类初始化完毕,才能进行子类的初始化
父类中没有无参构造的情况:
(1)在父类中给出无参构造方法
(2)使用super关键字去显示的访问父类中的带参构造.super关键字写在所有语句中的最上面
(3)子类的构造可以使用this关键字去调用其他的构造方法,去间接的访问父类的带参构造
2)子类中的构造方法的第一句话super();被隐藏
8.方法重写:
1)概述:子类出现了和父类一模一样的方法声明
2)注意事项:
(1)如果父类的成员方法被private修饰,子类中的方法不能重写父类的私有的方法
(2)子类要重写父类的方法,访问权限不能更低,子类和父类方法保持一致
(3)如果父类中的成员方法是静态方法,子类重写父类中的这个方法,也必须是静态
(静态方法算不上方法重写)规则:静态只能访问静态!
3)方法重写和方法重载:
overload:在同一个类中,方法名相同,参数列表不同(参数个数/参数类型),与返回值没有关系
override:子类的方法和父类的一模一样,连返回值都一样.
9.猫狗案例:
package 继承;
/*
* 猫狗案例:
* 猫类:
* 成员变量:品种breed 性别sex 颜色color
* 成员方法:
* 喜欢和主人玩
* 喜欢吃鱼
* 狗类:
* 成员变量:品种breed 性别sex 颜色color
* 成员方法:
* 喜欢和主人玩
* 喜欢吃骨头
* 动物类:
* 成员变量:品种breed 性别sex 颜色color
* 成员方法:
* 喜欢和主人玩
* */
//动物类
class Animal{
//定义成员变量
private String breed;
private String sex;
private String color;
//父类的无参构造方法
public Animal(){
}
//get()/set()方法
public String getBreed() {
return breed;
}
public void setBreed(String breed) {
this.breed = breed;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
//成员方法
public void play(){
System.out.println("喜欢和主人玩");
}
}
//猫类
class Cat extends Animal{
public Cat(){}
public void eat(){
System.out.println("喜欢吃鱼");
}
}
//狗类
class Dog extends Animal{
public Dog(){}
public void eat(){
System.out.println("喜欢吃骨头");
}
}
//测试类
public class extendsTest {
public static void main(String[] args) {
//创建子类的对象
Cat c = new Cat();
Dog d = new Dog();
//赋值
c.setBreed("折耳猫");
c.setSex("雌性");
c.setColor("白色");
d.setBreed("哈士奇");
d.setSex("雄性");
d.setColor("灰色");
//输出
System.out.println("这是一只"+c.getColor()+"的"+c.getSex()+c.getBreed());
c.play();
c.eat();
System.out.println("这是一只"+d.getColor()+"的"+d.getSex()+d.getBreed());
d.play();
d.eat();
}
}