java自学之路六(继承)

Posted jimmyhe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java自学之路六(继承)相关的知识,希望对你有一定的参考价值。

继承

格式:

  • public class 子类名称 extends 父类名称
public class Employee 
    public void method() 
        System.out.println("方法执行!");
    
public class Teacher extends Employee
    public static void main(String[] args) 
        Teacher teacher = new Teacher();
        teacher.method();
    

super

访问父类的重名变量

    public void method()
        int age = 20;
        System.out.println(age);  //20
        System.out.println(this.age);  //25
        System.out.println(super.age);  //30
    

重写

用@Override可以检测是否重写成功

注意:

  • 子类方法的返回值,必须小于等于父类方法的返回值范围。java.lang.object是所有类的公共最高父类

  • 子类方法的权限必须 大于等于 父类方法的权限修饰符。

    public > protected > (default) > private,default不是关键字,而是什么都不写,留空。

设计原则

对于已经投入使用的类,尽量不要进行修改,推荐定义一个新的类,来重复利用其中共性内容,并且添加改动新内容

父子类构造方法的访问特点

注意:

  1. 子类构造方法当中有一个默认隐含的super()调用,所以一定是先调用父类,后调用子类。
  2. 可以通过super关键字来构造调用父类重载构造
  3. super的父类构造调用,必须是子类构造方法的第一个语句,不能一个子类构造调用多次super构造
public class Father 
    public Father()
        System.out.println("父类构造方法");
    
public class Son extends Father 
    public Son()
        System.out.println("子类构造方法");
    

    public static void main(String[] args) 
        Son son = new Son();
    

带参数的情况,用super调用父类重载的构造方法

    public Father(int age)
        System.out.println(age);
    
    public Son()
        super(13);
        System.out.println("子类构造方法");
    

    public static void main(String[] args) 
        Son son = new Son();
    

总结:子类必须调用父类构造方法,不写则赠送super(),写了则用写的指定super调用,必须在第一行。

this的用法

public class Daughter 
    public Daughter()
        this(23);  // 本类的无参构造,调用本类的有参构造。
    
    public Daughter(int n)
        
    
  1. 在本类的成员方法中,访问本类的成员变量。
  2. 在本类的成员方法中,访问本类的另一个成员方法。
  3. 在本类的构造方法中,访问本类的另一个构造方法。(this(...)调用必须是构造方法的第一个语句,唯一一个。)

继承特性(重要)

java语言是单继承的

抽象方法

加上abstract关键字,去掉大括号,直接分号结束

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

public abstract class Animal 
//    抽象方法
    public abstract void eat();
    public void method()
        
    

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

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

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

  3. 子类必须覆盖重写父类当中所有的抽象方法,去掉抽象方法的abstract关键字,然后不上方法体大括号。

  4. 创建子类对象进行使用

    public abstract class Animal 
    //    抽象方法
        public abstract void eat();
        public void method()
            System.out.println("执行了animal方法");
        
    
    
    public class Dog extends Animal
        public void eat()
            System.out.println("小狗吃东西");
        
    
    public class Demo01 
        public static void main(String[] args) 
            Dog dog = new Dog();
            dog.eat();
        
    
    

如果继承了抽象类并没有重写所有方法,则还是个抽象类。

习题分红包

总结:

  1. 范型首字母大写

  2. 子类用get set获取父类属性

    public class User 
        private String name;
        private double money;
    
        public User() 
        
    
        public User(String name, double money) 
            this.name = name;
            this.money = money;
        
    
        public void show()
            System.out.println("我是"+name+",有"+getMoney()+"元");
        
    
        public String getName() 
            return name;
        
    
        public double getMoney() 
            return money;
        
    
        public void setName(String name) 
            this.name = name;
        
    
        public void setMoney(double money) 
            this.money = money;
        
    
    
    public class Host extends User
        public Host() 
        
    
        public Host(String name, double money) 
            super(name, money);
        
    
        public ArrayList<Double> send(double gift, int count)
            ArrayList<Double> moneyArray = new ArrayList<>();
            double money = super.getMoney() - gift;
            if(gift > getMoney())
                System.out.println(getMoney());
                System.out.println("余额不足");
                return moneyArray;
            
            for (int i = 0; i < count; i++) 
                if(i==count-1)
                    double lastGift = gift;
                    moneyArray.add(lastGift);
                else
                    double perGift = new Random().nextDouble()*(Math.floor(gift));
                    gift -= perGift;
                    moneyArray.add(perGift);
                
            
    
    
    
            setMoney(money);
            return moneyArray;
        
    
    
    public class Customer extends User
        public Customer() 
        
    
        public Customer(String name, double money) 
            super(name, money);
        
    
    
        public double receive(ArrayList<Double> moneyArray)
            int index = new Random().nextInt(moneyArray.size());
            double delta = moneyArray.get(index);
            moneyArray.remove(index);
            super.setMoney(super.getMoney() + delta);
            return delta;
        
    
    public class Demo02Test 
        public static void main(String[] args) 
            Host host = new Host();
            Customer customer1 = new Customer();
            Customer customer2 = new Customer();
            Customer customer3 = new Customer();
            Customer customer4 = new Customer();
            host.setName("群主");
            customer1.setName("二哈");
            customer2.setName("三哈");
            customer3.setName("四哈");
            customer4.setName("五哈");
            host.setMoney(29);
            customer1.setMoney(0);
            customer2.setMoney(0);
            customer3.setMoney(0);
            customer4.setMoney(0);
    
    
            ArrayList<Double> res = host.send(27, 4);
            host.show();
            double r1 = customer1.receive(res);
            customer1.show();
            double r2 = customer2.receive(res);
            customer2.show();
            double r3 = customer3.receive(res);
            customer3.show();
            double r4 = customer4.receive(res);
            customer4.show();
            System.out.println(r1 + r2 + r3 + r4);
        
    
    

以上是关于java自学之路六(继承)的主要内容,如果未能解决你的问题,请参考以下文章

17.Python自学之路:面对过程编程之继承

java自学之路-day10

java自学之路-day14

java自学之路-day16

适合小白的Java零基础自学方法,从零基础到大神之路

[转载] JAVA自学之路