Java学习_Day09

Java第九天学习内容:
1.继承
2.this和super的用法总结
3.抽象
4.综合案例练习

一、继承

关键词:extends
implements 是实现接口的关键词
理解:解决多子类中【共性抽取】的问题,提高了代码的复用性。
Java学习_Day09

1.继承的格式

public class Father{
	//成员变量;
	//构造方法
	//成员方法
}
public class Son extends Father{
	//成员变量
	//构造方法
	//成员方法
}

2.继承中成员的访问特点
1)成员变量的访问特点
如果欲访问的变量,子类中存在就先访问子类中的这个变量,如果没有就访问父类,如果父类也没有,就报错。
this.成员变量—>指明访问本类的成员变量
super.成员变量—>指明访问父类的成员变量
2).成员方法的访问特点
子类有就先用子类的,子类没有就用父类的,如果父类也没有就报错。
方法重写(复写/覆盖):在子类父类关系中有一模一样的方法。
方法重写的注意事项:
1)[email protected]:注解,起到标记提示的作用
写在方法上面,起到检测方法是否正确覆盖如果没有就报红提示,其实就算不写,如果方法没问题也能完成对父类相同方法的覆盖
2).重写方法的返回值类型的范围,必须【小于等于】父类返回值类型的范围
3).重写方法的权限修饰符的范围,必须【大于等于】父类返回值类型的范围

public > protected > 默认的(default不用写出来) > private

【小结:实际运用方法重写,只需要和父类写得一模一样就可以了】

方法重写的好处:既能保证父类的方法不变,子类也可以根据自己的需求做不同的实现。

代码案例:

public class Phone{
					public void show(){
						System.out.println("来电显示");
					}
				}
				
				public class NewPhone extends Phone{
					@Override//提示该方法是重写父类的show方法
					public void show(){
						super.show(); //调用父类方法
						System.out.println("显示头像");
						System.out.println("显示姓名");
					}
				}

3)构造方法的访问特点
a:子类所有的构造器(构造方法)都会默认去访问父类的空参构造器
在构造方法的第一行隐含的一句super();访问父类的空参构造方法

b:如果父类没有空参构造器,子类可以通过super(参数);去调用父类的有参构造器

3.this和super的用法总结
Java学习_Day09
super:引用父类对象
super.成员变量 调用父类的成员变量(用来访问父类被隐藏的成员变量即就是private关键字修饰的成员变量只能被间接访问)
super.成员方法 调用父类的成员方法(调用父类中被重载的方法)
super() 调用父类的空参构造器
super(参数) 调用父类的有参构造器

this:访问(调用)当前类的对象
this.成员变量 访问当前类的成员变量
this.成员方法 调用当前类的成员方法
this() 访问当前类的空参构造器
this(参数) 访问当前类的有参构造器

注意:
不管是 this()、 super() 还是 this(参数)、 super(参数) 只能写在构造方法的第一语句
即super()和this的用法一样的
在构造方法中:
都必须得是第一行,所以二者不可共存
super用法注意:
在子类的构造方法中调用父类构造方法只能访问一次
即子类中:不能同时存在super(),和super(参数)两条语句

4.继承的特点
1)Java只能单一继承
一个儿子只能有一个爸爸
2)Java支持多层继承
爸爸也可以有爸爸
3)一个类可以有多个子类
爸爸可以有多个儿子

二、抽象

关键字:abstract

抽象类和抽象方法

//抽象类(有抽象方法的类,必须是抽象类)
	public abstract class 类名{
		//抽象方法
		public abstract void 方法名(); //没有方法体
		//具体方法
		public void 方法名(){
			
		}
	}

抽象类是干什么用的?
答:抽象类就是用来给子类继承的,限定和约束子类,一个子类继承抽象类必须重写所有的抽象方法。
抽象的注意事项:
1)抽象类不能创建对象即不能直接new对象
2)抽象类中可以有抽象方法,也可以有普通方法(非抽象方法)(含有抽象方法的类一定是抽象类,但抽象类不一定有抽象方法也不只有抽象方法,抽象方法只能存在于抽象类中)
3)子类继承(extends)抽象类,必须重写父类所有的抽象方法
4)如果子类也是抽象类,可以不用重写其父类的抽象方法
类的成员:成员变量+常用方法+构造方法

三、综合案例练习

有乒乓球运动和篮球运动员,还有乒乓球教练和篮球教练
乒乓球运动打乒乓球、篮球运动员打篮球
乒乓球教练教乒乓球,篮球教练教打篮球
使用类和抽象把乒乓球运动、乒乓球教练、篮球运动员、篮球教练

人类
	--教练类
		--乒乓球教练
		--篮球教练
		
	--运动员类
		--品牌球运动员
		--篮球运动员

结构图:
Java学习_Day09
根类:Person

package com.itheima.Test;

public abstract class Person {
    public String name;

    public Person() {
    }

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    //抽象方法
    public abstract void eat();
    public abstract void sleep();
}

父类:Coach类

package com.itheima.Test;

public abstract class Coach extends Person {
    public Coach() {
    }

    public Coach(String name) {
        super(name);
    }

    //教学方法
    public abstract void teach();
}

父类:Player类

package com.itheima.Test;

public abstract class Player extends Person {
    public Player() {
    }

    public Player(String name) {
        super(name);
    }

    public abstract void play();
}

实现类1:PingPongCoach

package com.itheima.Test;

public class PingPongCoach extends Coach{
    public PingPongCoach() {
    }

    public PingPongCoach(String name) {
        super(name);
    }

    //重写直接父类的抽象方法
    @Override
    public void teach() {
        System.out.println("教练教的很专业!棒棒哒");

    }
    //重写父类类的抽象方法
    @Override
    public void eat() {
        System.out.println("教练的餐配-->三菜一汤");
    }

    @Override
    public void sleep() {
        System.out.println("教练的每天睡八个小时~");
    }
}

实现类2:PingPongPlay类

package com.itheima.Test;

public class PingPongPlay extends Player {
    @Override
    public void play() {
        System.out.println("乒乓球运动员,爱打乒乓球~~~");
    }

    @Override
    public void eat() {
        System.out.println("我每天吃得很营养!!!");

    }

    @Override
    public void sleep() {
        System.out.println("我每天睡7个小时........");
    }
}

实现类3:BasketBallCoach

package com.itheima.Test;

public class BasketBallCoach extends Coach {
    public BasketBallCoach() {
    }

    public BasketBallCoach(String name) {
        super(name);
    }

    @Override
    public void teach() {
        System.out.println("篮球教练教篮球运动员打篮球");
    }

    @Override
    public void eat() {
        System.out.println("篮球教练的餐配-->四菜一汤");

    }

    @Override
    public void sleep() {
        System.out.println("篮球教练每天睡7个小时.....");

    }
}

实现类4:BasketBallPlay 类

package com.itheima.Test;

public class BasketBallPlay extends Player {
    public BasketBallPlay() {
    }

    public BasketBallPlay(String name) {
        super(name);
    }

    @Override
    public void play() {
        System.out.println("我爱打篮球");
    }

    @Override
    public void eat() {
        System.out.println("我吃肯德基喝牛奶");
    }

    @Override
    public void sleep() {
        System.out.println("每天睡八个小时,中午午休!");
    }
}

测试类:Demo04

package com.itheima.Test;

public class Demo04 {
    public static void main(String[] args) {
        //篮球教练
        BasketBallCoach basketBallCoach = new BasketBallCoach("乔丹");
        System.out.println(basketBallCoach.getName());

        basketBallCoach.eat();
        basketBallCoach.sleep();
        basketBallCoach.teach();
        System.out.println("*****************");
        //篮球运动员
        BasketBallPlay basketBallPlay = new BasketBallPlay("库里");//每个类都有一个空参构造器

        System.out.println(basketBallPlay.getName());
        basketBallPlay.eat();
        basketBallPlay.play();
        basketBallPlay.sleep();

        System.out.println("-------------------------");

        //乒乓球教练
        PingPongCoach pingPongCoach = new PingPongCoach();
        pingPongCoach.setName("刘国梁:");
        System.out.println(pingPongCoach.getName());
        pingPongCoach.eat();
        pingPongCoach.sleep();
        pingPongCoach.teach();
        System.out.println("************************");
        //乒乓球运动员
        PingPongPlay pingPongPlay = new PingPongPlay();
        pingPongPlay.setName("马龙:");
        System.out.println(pingPongPlay.getName());
        pingPongPlay.eat();
        pingPongPlay.play();
        pingPongPlay.sleep();

    }
}

运行结果:

乔丹
篮球教练的餐配-->四菜一汤
篮球教练每天睡7个小时.....
篮球教练教篮球运动员打篮球
*****************
库里
我吃肯德基喝牛奶
我爱打篮球
每天睡八个小时,中午午休!
-------------------------
刘国梁:
教练的餐配-->三菜一汤
教练的每天睡八个小时~
教练教的很专业!棒棒哒
************************
马龙:
我每天吃得很营养!!!
乒乓球运动员,爱打乒乓球~~~
我每天睡7个小时........

子类又叫派生类
父类又叫超类,基类

【构造方法的方法名和类名相同】

Java学习第十天内容链接:
https://blog.csdn.net/LJN951118/article/details/88960563