0
点赞
收藏
分享

微信扫一扫

java语言-封装,继承,多态

王栩的文字 2022-04-15 阅读 85
java

目录

封装

继承

多态


封装

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现的细节,仅对外公开接口来和对象进行交互

java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,访问权限来控制方法或字段能否直接在类外进行访问。

继承

继承实现了代码的复用与共性的抽取

继承的语法(java不支持多继承):

修饰符 class 子类 extends 父类 {

}

 实例:

class Animal {
    protected String name;
    protected int age;
    private String type;

    public void sleep () {
        System.out.println(this.name + "正在睡觉");
    }

}

class Cat extends Animal {

}

public class Main {
    public static void main (String[] args) {
       Cat c = new Cat();

       //Cat中没有定义成员变量与成员方法,均是继承下来的
        System.out.println(c.age);
        System.out.println(c.name);
        c.sleep();
    }
}

在子类方法中或通过子类访问成员时:
如果访问的成员中子类与父类中同名,优先访问子类自己的

如果不存在,则访问父类继承下来的

class Animal {
    protected String name;
    protected int age;
    private String type;

    public void sleep () {
        System.out.println(this.name + "正在睡觉");
    }

    public void eat () {
        System.out.println("正在吃饭");
    }
}

class Cat extends Animal {
    public String name = "喵喵";

    public void sleep () {
        System.out.println("睡觉");
    }
}

public class Main {
    public static void main (String[] args) {
       Cat c = new Cat();

       //当成员父类和子类的成员变量名相同时,优先子类自己的
        System.out.println(c.name);
        c.sleep();
        c.eat();
    }
}

那么,若当父类和子类的成员名称相同时,我们想要访问父类的成员,我们应该如何操作呢?

这时候就不得不提到super关键字了

super关键字主要作用就是:在子类方法中访问父类的成员

class Animal {
    protected String name;
    protected int age;
    private String type;

    public void sleep () {
        System.out.println(this.name + "正在睡觉");
    }

    public void eat () {
        System.out.println("正在吃饭");
    }
}

class Cat extends Animal {
    public String name = "喵喵";

    public void sleep () {
        System.out.println("睡觉");
    }

    public void method () {
        //父类的访问:
        super.name = "小橘猫";
        System.out.println(super.name);
        super.sleep();
    }
}

 注意:

super只能在非静态方法中使用

super在构造方法中的作用;

子类对象构造时,需要先调用基类的构造方法,然后再执行子类的构造方法

class Animal {
    protected String name;
    protected int age;
    private String type;

    public Animal () {
        System.out.println("Animal的无参构造");
    }
}

class Cat extends Animal {
    public String name = "喵喵";

    public Cat () {
        //super();//这里可以不写,不写这一行,也会默认有隐含的super调用
        System.out.println("Cat的无参构造");
    }
}

public class Main {
    public static void main (String[] args) {
        Cat c = new Cat();
    }
}

 注意:

如果父类的构造方法是有参的,且不含有无参构造,此时编译器不会再给子类生成默认的构造方法,需要在子类构造方法的第一行,选择合适的父类构造方法的调用,否则编译失败

在子类构造方法中super()调用父类的构造时,必须是子类构造函数中第一条语句

super()只能在子类构造方法中出现一次,且不能和this()同时出现(因为二者都需要放在第一行)

final关键字

final关键字可以用来修饰变量,成员方法以及类

1.修饰变量或字段,表示常量

final int age = 10;
//age = 20;//编译出错

2.修饰类表示此类不能被继承

final class A {
    
}

class B extends A {
    
}
//编译出错

我们平常使用的String类就是用final修饰的,不能被继承

3.修饰方法表示该方法不能被重写(后续多态介绍)

多态

多态的实现条件:

1.必须存在继承

2.子类必须要对父类的方法进行重写

3.通过父类调用子类

多态优缺点:

优点:

1.可以避免使用大量的if-else

2.可阔赞能力强

缺点:代码的运行效率低

class Animal {
    public void printType () {
        System.out.println("我是动物");
    }
}

class Cat extends Animal {
    public void printType () {
        System.out.println("我是猫");
    }
}

class Dog extends Animal {
    public void printType () {
        System.out.println("我是狗");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal cat = new Cat ();
        Animal dog = new Dog ();
        cat.printType();
        dog.printType();
    }
}

运行结果:

我是猫

我是狗

重写:重写也成为覆盖,可以对父类的非静态方法,非final方法,非构造方法进行重写

重写的规则:
1.重写方法时,该方法的返回值,方法名,参数列表要与父类完全一致

2.如果父类与子类在同一个包中,子类可以对父类的非静态,非final方法,非构造方法,非private进行重写

3.如果父类与子类不在同一个包里,子类只能对public和protected修饰的方法进行重写

4.重写方法时,可以利用@Override注解,帮助我们进行检验,如方法名是否写错,参数列表是否一致等

向上转型and向下转型

向上转型:父类对象名 = new 子类对象

优点:使代码更加灵活

缺点:不能调用子类特有的方法

class Animal {
    public void printType () {
        System.out.println("我是动物");
    }
}

class Cat extends Animal {
    public void printType () {
        System.out.println("我是猫");
    }

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

}

public class Main {
    public static void main(String[] args) {
        Animal cat = new Cat ();
        //cat.eat();//编译报错,不能调用子类特有的方法
        cat.printType();
    }
}

向下转型

向下转型不安全,如果转换失败在运行时就会报异常,这里可以利用instanceof来判断是否能转换

class Cat extends Animal {
    public void printType () {
        System.out.println("我是猫");
    }

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

}

class Dog extends Animal {
    public void printType () {
        System.out.println("我是狗");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal cat = new Cat ();
        Animal dog = new Dog();
        //cat.eat();//编译报错,不能调用子类特有的方法
        Cat c = null;

        c = (Cat)dog;//编译未报错,但存在运行时错误

        //可以里用instance来检验是否能向下转型
        if (cat instanceof Cat) {
            c = (Cat)cat;
            c.eat();
        }
    }
}
举报

相关推荐

0 条评论