面向对象之封装和继承

一 , 封装

   1)封装的介绍 

  封装就是把抽象出的数据【属性】和对数据的操作【方法】封装再一起,数据被保护再内部,程序的其它部分只有通过被授权的操作【方法】,才能多数据进行操作。

  2)封装的理解和好处

    1》隐藏实现细节:方法(连接数据库)<-- 调用(传入参数)

    2》可以对数据进行验证,保证其合理安全

  3) 封装实现步骤

    1>将属性进行私有化  【不能直接改属性】

    2>提供一个公共的(public) set 方法,用于对属性判断并赋值

      public void setXxx(类型 参数名) {              //  Xxx 表示某个属性

         //加入数据验证的业务逻辑

         属性名 = 参水名;

      }

    3> 提供一个公共的(public)get方法,用于获取属性的值

      public  数据类型  getXxx (){       //权限判断,Xxx某个属性

        return  xx;

      }

public class People {
    public String name;
    private int age;
    private double salary;
    public People() {
    }
    public People(String name, int age, double salary) {
//        this.name = name;
//        this.age = age;
//        this.salary = salary;
        //我们可以将 set 方法写在构造器中,这样仍然可以验证
//set和构造器的结合    留意一下
        setName(name);
        setAge(age);
        setSalary(salary);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        if (name.length()>2 && name.length()<6){
            this.name = name;
        }else {
            System.out.println("输入正确的名字");
        }

    }
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age>=0 && age<= 120){
            this.age = age;
        }else {
            this.age = 18;
        }
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
    public String info(){
        return "名字" + name + "年龄" +age + "薪水" + salary;
    }

    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", salary=" + salary +
                '}';
    }
}
//==================================
public class PeopleTest {
    public static void main(String[] args) {
        People people = new People();
        people.setName("小明");
        people.setAge(20);
        people.setSalary(80000);
        System.out.println(people.info());

        People people1 = new People("小红", 300, 60);
        System.out.println(people1);
    }
}

二 , 继承

  继承可以解决代码复用,让我们的编程更加靠近人类思维. 当多个类存在相同的属性(变量)和方法时,可以从这些类中 抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过 extends 来 声明继承父类即可

 

   基本语法:

    

 

   1. 继承给编程带来的便利

      代码的复用性提高了

      代码的扩展性和维护性提高了

  2. 继承的细节

    1)子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问。但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问

    2)子类必须调用父类的构造器,完成父类的初始化

    3)当创建子类对象是,不管使用子类的哪个构造器默认清情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器种用super去指定使用父类的哪个构造器,完成父类的初始化工作,否则,编译不会通过

    4)如果希望指定去调用父类的某个构造器,则显示的调用一下 : super(参数列表)

    5) super在使用时,必须放在构造器第一行(super只能在构造器中使用)

    6)super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器

    7) java 所有类都是Object 的子类,Object 是所有类的基类

    8)父类构造器的调用不限于直接父类 ,将一直往上追溯到Object类 (顶级父类)

    9)    子类最多只能继承一个父类(指直接继承) ,即java 中是单继承机制。

        思:如何让 A 类继承 B 类和C 类?   A  继承 B  B 继承 C

    10) 不能滥用继承,子类和父类之间必须满足 is-a  的逻辑关系

  3. super关键字

    super 代表父类的引用,用于访问父类的属性、方法、构造器

    基本语法:

 

   //super 的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用 super 去访问爷爷类的成员;

   //  如果多个基类(上级类)中都有同名的成员,使用 super 访问遵循就近原则。A->B->C

   调用父类的构造器的好处(分工明确,父类属性有父类初始化,子类属性由子类初始化)

   当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super,如果没有重名,使用super,this 直接访问是一个效果

  super和this 区别

  

 

 

 

  

posted @ 2022-11-22 17:54  阿文程序猿  阅读(45)  评论(0)    收藏  举报