Java--super关键字、this关键字、抽象方法和抽象类、以及发红包项目

本文详细介绍了Java中super关键字在子类构造方法、成员方法中的应用,以及this关键字访问本类内容的三种场景。此外,涵盖了单继承、多级继承特点,抽象方法和抽象类的使用,以及一个实际的发红包项目示例。
摘要由CSDN通过智能技术生成

1.super关键字的三种用法

super关键字的用法有三种:

1)在子类的成员方法中,访问父类的成员变量。

2)在子类的成员方法中,访问父类的成员方法。

3)在子类的构造方法中,访问父类的构造方法。

public class Fu {

    int num = 10;
    public void method(){
        System.out.println("父类方法");
    }
}
public class Zi extends Fu {

    int num =20;
    public Zi(){
        super();
    }
    public void methodZi(){
        System.out.println(super.num);//父类中的num
    }
    public void method(){
        super.method();// 访问父类中的method
        System.out.println("子类方法");
    }
}

2.this关键字的三种用法

super关键字用来访问父类内容,而this关键字用来访问本类内容。用法也有三种:

1)在本类的成员方法中,访问本类的成员变量。

2)在本类的成员方法中,访问本类的另一个成员方法。

3)在本类的构造方法中,访问本类的另一个构造方法。

在第三中用法当中要注意:

A. this(...)调用也必须是构造方法的第一个语句。唯一一个。

B. super和this两种构造调用,不能同时使用。

public class Fu {
    int num = 30;
}
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(){
        methodA();
        this.methodA();
        System.out.println("bbb");
    }
}

super与this关键字

public class Fu {

    int num = 10;
    public void method(){
        System.out.println("父类方法");
    }
}
public class Zi extends Fu {

    int num = 20;
    @Override
    public void method() {
        super.method();//调用了父类方法
        System.out.println("子类方法");
    }
    public void show(){
        int num = 30;
        System.out.println(num);//30
        System.out.println(this.num); // 20
        System.out.println(super.num); // 10
    }
}
public class Demo {
    public static void main(String[] args) {
        Zi zi = new Zi();

        zi.show();
        zi.method();
    }
}

 输出结果:

 

3.Java继承的三个特点

1)Java语言是单继承的。

一个类的直接父类只能有唯一一个。

class A{ } class B extends A{ } //正确

class C{ } class D extends A,C{ } // 错误

2)Java语言可以多级继承。

我有一个父亲,我父亲还有一个父亲,也就是爷爷。

class A{ }

class B extends A{ }//正确

class C extends B{ } //正确

3)一个子类的父类是唯一的,但是一个父类可以拥有很多个子类。

可以有很多兄弟姐妹。

class A{ }

class B extends A{ }//正确

class C extends A{ }//正确

4.抽象方法和抽象类

抽象方法:就是加上abstract关键字,然后去掉大括号,直接分号结束。

抽象类:抽象方法所在的类,必须是抽象类才行,在class之前写上abstract即可。

如何使用抽象类和抽象方法:

1)不能直接创建new抽象类对象。

2)必须用一个子类来继承抽象父类。

3)子类必须覆盖重写抽象父类当中所有的抽象方法。

覆盖重写(实现):去掉抽象方法的abstract关键字,然后补上方法体大括号。

4)创建子类对象进行使用。

public abstract class Animal {

    //这是一个抽象方法,代表吃东西,但是具体吃什么(大括号的内容)不确定。
    public abstract void eat();

    //这是普通的成员方法
    public void normalMethod(){
    }
}
public class Cat extends Animal {

    public void eat(){
        System.out.println("猫吃鱼");
    }
}
public class DemoMain {

    public static void main(String[] args) {
//        Animal animal = new Animal(); // 错误写法,不能直接创建抽象类对象
        Cat cat = new Cat();
        cat.eat();
    }
}

注意事项:

ublic abstract class Fu {

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

    public Zi(){
        // super();
        System.out.println("子类构造方法执行");
    }
    @Override
    public void eat() {
        System.out.println("吃饭");
    }
}
public class DemoMain {

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

输出结果:

一个抽象类不一定含有抽象方法, 只要保证抽象方法所在的类是抽象类,即可。

这样没有抽象方法的抽象类,也不能直接创建对象,在一些特殊场景下有用途。

// 最高的抽象父类
public abstract class Animal {

    public abstract void eat();
    public abstract void sleep();
}
// 子类也是抽象类
public abstract class Dog extends Animal {

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

    @Override
    public void sleep() {
        System.out.println("呼呼呼~~");
    }
}
public class Dog2Ha extends Dog {
    @Override
    public void sleep() {
        System.out.println("嘿嘿嘿嘿嘿");
    }
}
public class DemoMain {
    public static void main(String[] args) {
//        Animal animal = new Animal();// 错误

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

        Dog2Ha ha = new Dog2Ha();//这是普通类,可以直接new对象
        ha.eat();
        ha.sleep();
        System.out.println("=============");

        DogGolden golden = new DogGolden();
        golden.eat();
        golden.sleep();

    }
}

输出结果:

5.发红包项目 

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;
    }
}
import java.util.ArrayList;
//群主的类
public class Manager extends User {

    public Manager(){
        //super();
    }

    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(totalMoney>leftMoney){
            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;
    }
}
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);
    }
}
import java.util.ArrayList;

public class Main {

    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();//100
        one.show();//0
        two.show();//0
        three.show();//0
        System.out.println("============");

        //群主发红包
        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();
    }
}

输出结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值