Java面向对象:封装,继承,多态

封装:
该露的露,该藏的藏
我们程序设计要求“高内聚,低耦合”,高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用
封装就是数据的隐藏:属性私有private,通过set/get方法操作数据

继承:
继承是类和类之间的一种关系,继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类用关键字extends表示
extends的意思是“扩展”,子类是父类的扩展。可表示为子类 is a 父类,如学生 is a 人
Java中只有单继承,没有多继承;孩子只有一个爹,但可以有多个兄弟
在Java中所有类都直接或间接继承Object类

方法重写:
重写:需要有继承关系,子类重写父类方法
1.方法名必须相同
2.参数列表必须相同
3.修饰符:范围可以扩大但不能缩小:public>protected>default>private
4.抛出的异常:范围可以缩小但不能扩大:ClassNotFoundException–>Exception(大)
重写:子类的方法必须和父类一致;方法体不同
为什么要重写:父类的功能,子类不一定需要或者不一定满足

多态:
同一方法可以根据发送对象的不同而采取多种不同的行为方式
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
多态存在的条件:有继承关系、子类重写父类方法、父类引用指向子类对象
多态是方法的多态

代码写的比较多,也比较乱,仔细看应该能看懂

package com.zdz.oop;

//一个项目只存在一个main方法
public class Appliction {
    public static void main(String[] args) {
        //类:抽象的,实例化
        //类实例化后会返回一个自己的对象
        //student对象就是一个Student类的具体实例
        Student student = new Student();

        System.out.println("=========================");
        //封装
        student.setName("张生");//set赋值
        System.out.println(student.getName());//get取值
        student.setAge(999);//不合法,3岁小孩输入的
        System.out.println(student.getAge());
        student.setAge(22);//张生自己输入的,合法的
        System.out.println(student.getAge());

        System.out.println("====================");
        //继承
        //子类继承了父类,就会有父类除private的全部方法和属性,继承一般用public
        //修饰符:public,protected,default,private越来越私有,此为优先级
        student.say();
        System.out.println(student.getMoney());//通过手段方法去要钱
        student.test("zdz");
        student.test1();
        //方法重写
        A a=new A();
        B b=new A();//父类的引用指向了子类;多态
        //方法的调用只和左边定义的数据类型有关-->静态方法
        a.test();//A
        b.test();//B
        //重写-->非静态方法
        a.name();//实际类型确定
        b.name();

        System.out.println("====================");
        //多态
        //一个对象的实际类型是确定的
        //new A();
        //可以指向的引用类型不确定了:父类的引用指向了子类
        A x1=new A();//子类A能调用的方法都是自己的或继承父类的
        B x2=new A();//父类B可以指向子类,但不能调用子类独有的方法
        x2.run();//子类重写了父类方法,执行子类的方法
        x2.eat();//子类没重写父类方法,执行父类方法
        //x2.sleep();//Cannot resolve method 'sleep' in 'B';在类B中没有sleep方法,
        // 由此可知:对象执行哪些方法,主要看对象左边的类型,与右边关系不大,可以强制转换:
        ((A)x2).sleep();//高转低
    }
}

/*
封装的意义:
1.提高程序安全性,保护数据
2.隐藏代码的实现细节
3.统一接口
4.系统可维护性增加
 */
class Student extends Person{//同包下不能有重名类
    //属性:字段
    //属性私有private
    private String name="zdz";//姓名,默认初始化,null
    private int age;//年龄

    /*
    构造方法类初始化时就执行了,最早执行
    super注意点:
    1.super调用父类的构造方法,必须在构造方法的第一行
    2.super必须只能出现子类的方法或者构造方法中
    3.super和this不能同时调用构造方法
    VS this
        代表的对象不同
            this:代表本身对象的应用
            super:代表父类对象的应用
        前提
            this:没有继承也可以使用
            super:只能在继承条件下才可以使用
        构造方法
            this();本类的构造
            super();父类的构造
     */
    public Student() {//构造方法
        //隐藏代码:调用了父类Person的构造方法
        //super();//此方法不写效果一样,为隐藏代码,若写出来必须放在代码第一行
        System.out.println("Student无参构造执行了");
    }

    //提供一些方法去操作这些属性set/get
    //get取值,set赋值
    public void setName(String name){
        this.name=name;
    }

    public String getName(){
        return this.name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if ((age<120)&&(age>0)){
            this.age = age;
        }else{
            this.age=3;//三岁小孩才会把年龄输错
        }
    }

    public void test(String name){
        System.out.println(name);//zdz,方法传进来的值
        System.out.println(this.name);//张生,set赋给私有属性的值
        System.out.println(super.name);//张端庄,父类的值
    }

    public void say(){
        System.out.println("说了句:I Heat You !");
    }

    public void test1(){
        say();//I Heat You
        this.say();//I Heat You
        super.say();//I Love You
    }
}

class Person{
    private int money=100000000;//不会被继承,你爹有钱,跟你有啥关系?
    protected String name="张端庄";

    public Person() {//构造方法
        System.out.println("Person无参构造执行了");
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {//但是,你可以通过一些方法去要来你爹的钱
        this.money = money;
    }

    public void say(){
        System.out.println("说了句:I Love You !");
    }
}


/*
重写:需要有继承关系,子类重写父类方法
1.方法名必须相同
2.参数列表必须相同
3.修饰符:范围可以扩大但不能缩小:public>protected>default>private
4.抛出的异常:范围可以缩小但不能扩大:ClassNotFoundException-->Exception(大)
重写:子类的方法必须和父类一致;方法体不同
为什么要重写:父类的功能,子类不一定需要或者不一定满足

 */
class A extends B{
    public static void test(){
        System.out.println("A=>test()");
    }
    //Override 重写
    @Override//注解:有功能的注释
    public void name(){
        //super.name();//将父类方法内容继承过来
        System.out.println("张小生");
    }

    @Override
    public void run() {
        //super.run();
        System.out.println("张小生在跑步");
    }
    public void sleep(){
        System.out.println("张小生在睡觉");
    }
}
/*
多态:
1.多态是方法的多态,属性没有多态
2.父类和子类,有联系 类型转换异常:ClassCastException
3.存在条件:继承关系,方法需要重写,父类引用指向子类对象! Father dog = new Son();
以下没有多态:
1.static方法:属于类,不属于实例
2.final常量
3.private方法
 */
class B{
    public static void test(){
        System.out.println("B=>test()");
    }
    public void name(){
        System.out.println("张生");
    }
    public void run(){
        System.out.println("张生在跑步");
    }
    public void eat(){
        System.out.println("张生在吃饭");
    }
}

 

posted @ 2021-03-15 14:31  廉价劳动力竟是我自己  阅读(58)  评论(0编辑  收藏  举报