继承、super、this、抽象类

继承、super、this、抽象类

继承方法中的覆盖重写

/*
局部变量:        直接写成员变量名
本类的成员变量    this.成员变量名
父类的成员变量名  super.成员变量名

在父子类的继承关系中,创建子类对象,访问成员方法的规则。
   创建的对象是谁,就优先用谁,如果没有则向上找。

 注意事项:无论是成员方法还是成员变量,如果没有都是向上找父类,绝对不会向下找子类。

 重写(Override)
 概念:在继承关系中,方法的名称一样,参数列表也一样。
 重写(Override):方法的名称一样,参数列表【也一样】。覆盖、覆写。
 重载(Overload):方法的名称一样,参数列表【不一样】。

 方法的覆盖重写的特点:创建的是子类对象,则优先用子类方法。
 */
/*
方法覆盖重写的注意事项:

1.必须保证父子类之间方法的名称相同,参数列表也相同。
@Override:写在方法的前面,用来检测是不是有效的正确覆盖重写。

2.子类方法的返回值必须【小于等于】父类方法的返回值范围。
前提:java.lang.Object类是所有类的公共最高父类(祖宗类),java.lang.String就是Object的子类。

3.子类方法的权限必须【大于等于】父类方法的权限修饰符。
小扩展提示:public>protected>(default)>private
备注:(default)不是关键字default,而是什么都不写,留空。
 */

继承中方法的覆盖重写_应用场景
继承设计原则:对于已经投入使用的类,尽量不要进行修改。
推荐定义一个新的类,来重复利用其中共性内容,并且添加改动新内容。

package cn.itcast.day09.demo06;
//本来的老款手机
public class Phone {
    public void call(){
        System.out.println("打电话");
    }

    public void send(){
        System.out.println("发短信");
    }

    public void show(){
        System.out.println("显示号码");
    }


}

package cn.itcast.day09.demo06;
//定义一个新手机,使用老手机作为父类
public class NewPhone extends Phone {
    @Override
    public void show() {
        super.show();//把父类的show方法拿过来重复利用
        //自己子类再来添加更多内容
        System.out.println("显示姓名");
        System.out.println("显示头像");
    }
}

package cn.itcast.day09.demo06;
//定义一个新手机,使用老手机作为父类
public class NewPhone extends Phone {
    @Override
    public void show() {
        super.show();//把父类的show方法拿过来重复利用
        //自己子类再来添加更多内容
        System.out.println("显示姓名");
        System.out.println("显示头像");
    }
}

打电话
发短信
显示号码
============
打电话
发短信
显示号码
显示姓名
显示头像

继承中构造方法的访问特点

/*
继承关系中,父子类构造方法的访问特点:
1.子类构造方法当中有一个默认隐含的“super()”调用,所以一定是先调用的父类构造,后执行的子类构造。
2.子类构造可以通过super关键字来调用父类重载构造。
3.super的父类构造调用,必须是子类【构造方法】的第一个语句。不能一个子类构造调用多次super构造。
总结:
子类必须调用父类构造方法,不写则赠送super();写了则用写的指定的super调用,super只能有一个,还必须是第一个。
 */

super关键字的三种用法:

package cn.itcast.day09.demo08;
/*
super关键字的用法有三种:
1.在子类的成员方法中,访问父类的成员变量。
2.在子类的成员方法中,访问父类的成员方法。
3.在子类的构造方法中,访问父类的构造方法。
 */
public class Zi extends Fu {
    int num=20;
    public Zi(){
        super();
        System.out.println("子类的构造方法");
    }
    
    public void methodZi(){
        System.out.println(super.num);//父类中的num
    }
    public void method(){
        super.method();//访问父类中的method
        System.out.println("子类的成员方法");
    }
}

package cn.itcast.day09.demo09;
/*
super关键字用来访问父类内容,而this关键字用来访问本类内容。用法也有三种:
1.在本类的成员方法中,访问本类的成员变量。
2.在本类的成员方法中,访问本类的另一个成员方法。
3.在本类的构造方法中,访问本类的另一个构造方法。
在第三种方法中要注意:
A.this(...)调用也必须是构造方法的第一个语句,唯一一个。
B.super和this两种构造调用,不能同时使用,因为它们都必须是构造方法的第一个语句,唯一一个。
 */
public class Zi extends Fu {
    int num=20;
    public Zi(){
//        super();//这一行不再赠送
        this(123);
  //      this(1,2);//错误写法!
    }
    public Zi(int n){
        this(1,2);
    }
    public Zi(int n,int m){

    }
    public void showNum(){
        int num=10;
        System.out.println(num);//局部变量
        System.out.println(this.num);//本类中的成员变量
        System.out.println(super.num);//父类中的成员变量
    }
    
    public void methodA(){
        System.out.println("AAA");
    }
    
    public void methodB(){
        System.out.println("BBB");
    }
    
}

Java继承的三个特点:

  1. Java语言是单继承的。
    一个类的直接父类只能有唯一一个。
    2.Java语言可以多级继承
    我有一个父亲,我父亲还有一个父亲,也就是爷爷。
    3.一个子类的的直接父类是唯一的,但是一个父类可以拥有很多个子类。
    可以有很多个兄弟姐妹。
package cn.itcast.day09.demo11;

/*
抽象方法:就是加上abstract关键字,然后去掉大括号,直接分号结束。
抽象类:抽象方法所在的类,必须是抽象类才行。在class之前写上abstract即可。

如何使用抽象类和抽象方法:
1.不能直接创建new抽象类对象。
2.必须用一个子类来继承抽象父类。
3.子类必须覆盖重写抽象父类当中所有的抽象方法。
覆盖重写(实现):子类去掉抽象方法的abstract关键字,然后补上方法体大括号。
4.创建子类对象进行使用。
 */
public abstract class Animal {
    
    //这是一个抽象方法,代表吃东西,但是具体吃什么(大括号的内容)不确定。
    public abstract void eat();
    
    //这是普通的成员方法
    public void normalMethod(){
        
    }
}

抽象方法和抽象类的注意事项:
1.抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。
2.抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。

package cn.itcast.day09.demo12;

public abstract class Fu {
    public  Fu(){
        System.out.println("抽象父类构造方法");
    }
    public abstract void  eat();
}

package cn.itcast.day09.demo12;

public class Zi extends Fu {
    public  Zi(){
        super();//可不写,直接赠送的
        System.out.println("子类的构造方法");
    }
    @Override
    public void eat() {
        System.out.println("吃饭");
    }
}

package cn.itcast.day09.demo12;

public class DemoMain {
    public static void main(String[] args) {
        Zi zi=new Zi();
        zi.eat();
    }
}

3.抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

package cn.itcast.day09.demo12;
/*
一个抽象类不一定含有抽象方法,
只要保证抽象方法所在的类是抽象类,即可

这样没有抽象方法的抽象类,也不能直接创建对象,在一些特殊场景下有用途。
 */
public abstract class MyAbstract {
}

4.抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。

package cn.itcast.day09.demo13;

public abstract class Animal {
    public abstract void sleep();
    public abstract void eat();
}

package cn.itcast.day09.demo13;

public abstract class Dog extends Animal {
    @Override
    public void eat(){
        System.out.println("狗吃骨头");
    }
    public abstract void sleep();
}

package cn.itcast.day09.demo13;

public class DogGolden extends Dog {
    @Override
    public void sleep() {
        System.out.println("呼呼");
    }
}

package cn.itcast.day09.demo13;

public class DemoMain {
    public static void main(String[] args) {
        //Animal animal=new Animal();//错误!

        //Dog dog=new Dog();//错误也是抽象类

        DogGolden dogGolden=new DogGolden();
        dogGolden.eat();
        dogGolden.sleep();
    }

}

在这里插入图片描述

package cn.itcast.day09.demo14;

public class User {
    private String name;//姓名
    private int money;//余额

    public User() {
    }

    public User(String name, int money) {
        this.name = name;
        this.money = money;
    }

    //展示一下当前用户有多少钱
    public void show(){
        System.out.println("用户"+name+" "+"余额"+money);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }
}

package cn.itcast.day09.demo14;

import java.util.ArrayList;

//群主的类
public class Manager extends User {

    public Manager() {
    }

    public Manager(String name, int money) {
        super(name, money);
    }

    public ArrayList<Integer> send(int totalMoney, int count){
        //首先需要一个集合,用来存储若干个红包的金额
        ArrayList<Integer> redList=new ArrayList<>();

        //首先看下群主自己有多少钱
        int leftMoney = super.getMoney();
        if(leftMoney<totalMoney){
            System.out.println("余额不足");
            return redList;//返回空集合
        }

        //扣钱,其实就是重新设置余额
        super.setMoney(leftMoney-totalMoney);

        //发红包需要平均拆分成count份
        int avg = totalMoney/count;
        int mod=totalMoney%count;

        //除不开的零头,包在最后一个红包当中
        //下面把红包一个一个放到集合当中
        for(int i=0;i<count-1;i++){
            redList.add(avg);
        }

        //最后一个红包
        int last = avg+mod;
        redList.add(last);

        return redList;
    }

}

package cn.itcast.day09.demo14;

import java.util.ArrayList;
import java.util.Random;

//普通成员
public class Member extends User{
    public Member() {
    }

    public Member(String name, int money) {
        super(name, money);
    }

    //重新设置红包余额
    public void receive(ArrayList<Integer>List){
        //从多个红包当中随便抽取一个,给我自己。
        //随机获取一个集合当中的索引编号
        int index = new Random().nextInt(List.size());
        //根据索引,从集合当中删除,并且得到被删除的红包,给我自己
        int delta = List.remove(index);
        //当前成员自己本来有多少钱
        int money = super.getMoney();
        //加法,并且重新设置回去
        super.setMoney(money+delta);
    }
}

package cn.itcast.day09.demo14;

import java.util.ArrayList;

public class MainRedPacket {
    public static void main(String[] args) {
        Manager manager = new Manager("群主",100);//群主

        Member one = new Member("成员A",0);
        Member two = new Member("成员B",0);
        Member three = new Member("成员C",0);

        manager.show();
        one.show();
        two.show();
        three.show();
        System.out.println("============");
        //群主总共发20块钱,分成3个红包
        ArrayList<Integer> redList=manager.send(20,3);
        //三个普通成员收红包
        one.receive(redList);
        two.receive(redList);
        three.receive(redList);

        manager.show();//100-20=80
        //6、6、8,随机分给三个人
        one.show();
        two.show();
        three.show();
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100198.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • altium 原理图reset unique id

    altium 原理图reset unique id当画模块原理图时 电路相同的模块可以单独建一个文件 然后复制粘贴 得到多个相同的原理图图纸然而 sheet 文件复制粘贴会出现 ID 相同的情况 UNIQUEID 在原理图和 pcb 里面相当于元器件的唯一身份许可 不可相同 有的时候我们操作不当造成 ID 相同怎么办呢 nbsp 在原理图界面 TOOL Convert Reset nbsp Componentuni AD17 即可选择对应的图纸或工程或打开的文

    2025年10月11日
    4
  • ora 01017问题解决办法

    ora 01017问题解决办法SQL&gt;startup ORACLEinstancestarted. TotalSystemGlobalArea 914358272bytes FixedSize                 2088184bytes VariableSize            528483080bytes DatabaseBuffers         3774873…

    2022年6月1日
    48
  • shell的比较运算符

    算术运算符 +-*/%表示加减乘除和取余运算+=-=*=/=同C语言中的含义位操作符>>>=表示位左右移一位操作&&=|

    2021年12月24日
    50
  • 关于StringUtils的isNotBlank方法

    关于StringUtils的isNotBlank方法当Str为空白或者null时,isNotBlank返回false当Str的length>0时,isNotBlank返回true转载于:https://www.cnblogs.com/xujuntao/p/11027523.html

    2022年8月12日
    7
  • POJ 1509 Glass Beads

    POJ 1509 Glass Beads

    2021年11月29日
    50
  • java中如何定义一个数组「建议收藏」

    java中如何定义一个数组「建议收藏」数组的定义方法 int[]a;//定义一个数组a int[]b=newint[10];//定义一个长度为10的数组b int[]c={7,1,2,3,8};//定义一个数组c,并赋值,其中a[0]=7,a[4]=8; //以数组b为例,长度为10,分别是从b[0]-b[9];…

    2022年7月7日
    19

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号