面向对象封装

封装

 概述

封装是隐藏对象的属性和实现细节,仅仅对外提供公共的访问方式,比如类和方法
好处:

  1. 提高安全性
  2. 提高重用性

两层含义:一层含义是把对象的属性和行为看成一个密不可分的整体,将这两者“封装”在一个不可分割的独立单元(即对象)中;另一层含义指“信息隐藏”,把不需要让外界知道的信息隐藏起来,有些对象的属性及行为允许外界用户知道或使用,但不允许更改,而另一些属性或行为,则不允许外界知晓,或只允许使用对象的功能,而尽可能隐藏对象的功能实现细节
————————————————

封装的优点

  • 良好的封装能够减少耦合,符合程序设计追求“高内聚,低耦合”。

  • 类内部的结构可以自由修改。

  • 可以对成员变量进行更精确的控制。

  • 隐藏信息实现细节。

private关键字

是一个权限修饰符 ,可以用来修饰成员变量和成员方法.被私有化的成员只能在本类中访问

实现Java封装的步骤

修改属性的可见性来限制对属性的访问(一般限制为private),例如:

public class Person { 
    private String name; 
    private int age; 
}

这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。

2. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:

public class Person{ 
    private String name;
    private int age; ​ 
    private boolean alive;
 
    public int getAge(){
        return age; 
    } 
 
    public void setAge(int age){ 
        this.age = age; 
    } ​
 
    public String getName(){ 
        return name; 
    } ​
 
    public void setName(String name){ 
        this.name = name; 
    }
 
    public boolean isAlive() {
		return alive;
	}
 
	public void setAlive(boolean alive) {
		this.alive = alive;
	}
 
}

采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。

封装同时可以提高代码的安全性,例如普通的类属性不是private修饰就直接可以通过“对象名.属性 = xxx”对其赋值,但当我们用private修饰该属性后就不能这样对其做任意的修改了,而且我们还可以在其对外的访问方法中进行合法值校验。比如上例中的setAge()就可以更改为:

public void setAge(int age){
    if(age > 120)
        System.out.println("Age setting error");
    else
        this.age = age;
}

 封装的使用细节:

一般使用private访问权限
提供相应的get、set方法来访问相关属性,这些方法通常是public修饰的。以提供对属性的赋值与读取操作。(注意!boolean变量的get方法是is开头。)
一些只用于本类的辅助性方法,可以使用private修饰,希望其他类调用的方法用public修饰。

this与super关键字:

1、this关键字代表当前对象

2、super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。  

 练习:封装学生案例

package cn.tedu.oop;
/*本类用于测试面向对象第一大特性--封装*/
public class TestPrivate {
    public static void main(String[] args) {
        //4.创建学生类对象s
        Student s = new Student();
        //5.通过对象操作学生类的属性与方法
        System.out.println(s.name);//null
        s.study();//正在学习中。。。
        /*2.subject属性在Student类中被private修饰,所以此处无法直接修改或获取值*/
        //s.subject = "Java培优";
        //System.out.println(s.subject);//Java培优
        //6.3在main()里操作subject属性
        s.setSubject("CGB");//设置值
        System.out.println(s.getSubject());//获取值
        //7.3操作属性sno
        s.setSno(1);
        int snumber = s.getSno();
        System.out.println("接到的学号是:"+snumber);
        System.out.println(s.getSno()+"直接打印的");
    }

}

//1.描述学生这一类型
class Student{
    //2.特征:学号 姓名 科目--成员变量/属性
    //7.1封装属性,用private修饰这个属性
    private int sno;//学号
    String name;//姓名
    /*1.private是一个修饰符,被它修饰的资源只能在本类中使用,是权限最小的修饰符*/
    //6.1封装subject属性
    private String subject;//科目

    //7.2添加sno属性对应的get()与set()
    public int getSno() {
        return sno;
    }
    public void setSno(int sno) {
        this.sno = sno;
    }

    //6.2我们需要提供一个公共的方式,供外界操作subject的属性值
    //右键空白处->Generate->Getter and Setter->选中subject属性->OK
    public String getSubject() {
        /*4.如果一个方法需要返回结果,那么这个方法定义的返回值类型就不再是void了
        * 至于具体设置成什么类型,与返回值的类型保持一致
        * 比如我们要返回的subject是String类型,所以方法的返回值类型为String
        * 返回值通过关键字return进行返回*/
        return subject;
    }
    public void setSubject(String subject) {
        /*3.如果一个类中的成员变量与局部变量同名
        * 需要使用this关键字指定,我们规定this指定的那个是成员变量*/
        this.subject = subject;
    }

    //3.功能:学习 吃饭 睡觉--方法
    public void study(){
        System.out.println("正在学习中。。。");
    }
    public void eat(){
        System.out.println("正在吃饭ing...");
    }
    public void sleep(){
        System.out.println("我一点也不想睡觉,就想学Java!");
    }
}

OOP综合练习

package cn.tedu.oop;
/*本类用于面向对象的巩固练习*/
public class TestCar {
    //创建程序的入口函数main()
    public static void main(String[] args) {
        //3.创建汽车类对象c
        Car c = new Car();
        //4.通过汽车类对象c设置属性值
//        c.color = "暗夜紫";
//        c.brand = "BMW";
//        c.price = 200;
//        c.length = 0.2;
        //5.查看刚刚设置好的属性值
//        System.out.println(c.brand);
//        System.out.println(c.price);
//        System.out.println(c.color);
//        System.out.println(c.length);
        //6.通过c对象调用汽车类的方法
        c.start();
        //c.stop();
        //7.3调用提供的set与get方法,设置并获取对应属性的值
        c.setBrand("特斯拉");
        c.setColor("black");
        c.setPrice(200.02);
        c.setLength(3);
        System.out.println(c.getBrand());
        System.out.println(c.getColor());
        System.out.println(c.getLength());
        System.out.println(c.getPrice());
        //8.3 调用公共方法来实现私有方法功能的使用
        c.start();
    }
}
//1.抽象汽车这一类事物的属性与行为,封装成一个类组件
class Car{
    //2.属性--用成员变量来描述
    //7.1封装所有的属性值--使用private修饰
    private String color;
    private String brand;
    private double price;
    private double length;
    //7.2 生成所有属性的get与set方法
    /*右键空白处->Generate->Getter and Setter->按住Shift全选所有属性生成即可*/
    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }

    //3.行为--用方法来描述
    //8.2 可以在本类公共的方法里,调用私有方法
    public void start(){
        System.out.println("汽车开动了~");
        stop();//我们通过方法名+参数列表确定要调用哪个方法
    }
    //8.1封装方法,通过private修饰符
    private void stop(){
        System.out.println("汽车停止了~");
    }
}

你可能感兴趣的:(css,html,javascript)