面向对象三大特征:

  • 封装
  • 继承
  • 多态

需求:使用java类描述百合网的会员。
问题:性别有问题??
根本原因:由于其他人可以直接操作sex属性,可以对sex属性进行了直接的赋值。

class Member{
    String name;//姓名
    String sex;//性别
    int salary;//薪水
    //聊天
    public void talk(){
        System.out.println(name+"聊得非常开心");
    }
}
class Demo1{
    public static void main(String[] args){
        Member m = new Member();
        m.name = "狗娃";
        m.sex = "人妖";
        m.salsry = 800;
        System.out.println("姓名:"+m.name+" 性别:"+m.sex+" 薪水:"+m.salary);
    }
}

———————————————————————–

权限修饰符:(共有4个,当前学2个)

  • public:公共的。public修饰的成员变量或者方法任何人都可以直接访问。
  • private:私有的。private修饰的成员变量或者方法只能在本类中直接进行访问。

封装的步骤:

  • 1、使用private修饰需要被封装的属性。
  • 2、提供一个公共的方法 设置或者获取该私有的成员属性。
- 命名规范:         
 set属性名();//设置属性值       
 get属性名();//获取属性值
  • 3、

于是,上边例子可以改为更严谨一些:

class Member{
    public String name;//姓名
    private String sex;//性别
    public int salary;//薪水
    //定义一个公共的方法设置sex属性
    public void setsex(String s){
        if(s.equals("男")||s.equals("女")){//注意:如果比较两个字符串的内容是否一致,不要使用==号,要使用equals方法。
            sex = s;
        }else{
            //默认是“男”
            sex = "男";
        }
        System.out.println(name+"聊得非常开心");
    }
    //定义一个公共的方法获取sex属性的值
    public String getsex(){
        return sex;
    }
}

class Demo2{
    public static void main(String[] args){
        Member m = new Member();
        m.name = "狗娃";
        m.setsex( "人妖");
        m.salsry = 800;
        System.out.println("姓名:"+m.name+" 性别:"+m.getsex()+" 薪水:"+m.salary);//getsex:只有当setsex为女时,getsex为女,否则getsex都为男
    }
}

———————————————————————–

疑问:封装一定要提供get或者set方法吗?不一定,根据需求而定的。
规范:在现实开发中,一般实体类的所有成员属性(成员变量)都要封装起来。

  • 实体类:实体类就是用于描述一类事物的 就称作实体类。
  • 工具类:例如Arrays数组的工具类。

封装的好处:

  • 1、提高数据的安全性。
  • 2、操作简单。
  • 3、隐藏了实现。

练习1:
需求:使用java类描述一个计算器类,计算器具备操作数1、操作数2,、操作符三个公共的属性,还具备运算的功能行为。
要求:不能直接对操作数1、操作数2、运算符这些属性进行直接的赋值,要封装起来。(+ - * /)
根据需求提供get或者set方法。本例需要提供set方法。

//计算器类
class Calculator{
    private int num1;//操作数1
    private int num2;//操作数2
    private char option;//运算符
    //提供公共的变量设置属性值
    public void initCalculator(int n1,int n2,char o){//相当于set方法
        num1 = n1;
        num2 = n2;
        if(o=='+'||o=='-'||o=='*'||o=='/'){
            option = o;
        }else{
            option = '+';//默认做加法运算
        }
    }
    //计算的功能
    public void calculate(){
        switch(option){
            case '+':
                System.out.println("做加法运算,结果是:"+(num1+num2));
                break;
            case '-':
                System.out.println("做减法运算,结果是:"+(num1-num2));
                break;
        case '*':
                System.out.println("做乘法运算,结果是:"+(num1*num2));
                break;
        case '/':
                System.out.println("做除法运算,结果是:"+(num1/num2));
                break;
        }

    }
}
class Demo{
    public static void main(String[] args){
        //创建一个计算器对象
        Calculator c = new Calculator();
        //设置属性值
        c.initCalculator(1,2,'a');//输入a时不符合+-*/,所以执行设置的默认的加法流程
        //调用计算器的功能
        c.calculate();//结果是:做加法运算,结果是:3
    }
}

练习2:值得学习
需求: 目前存在数组:int[] arr = {0,0,12,1,0,4,6,0} ,编写一个函数
接收该数组,然后把该数组的0清空,然后返回一个不存在0元素的数组。

步骤: 1. 计算出新数组的长度。 原来的数组长度-0的个数:new int[长度]

import java.util.*;
class Demo{
    public static void main(String[] args){
        int arr[] = {0,0,12,1,0,4,6,0};
        arr = clearZero(arr);
        System.out.println("数组的元素:"+Arrays.toString(arr));
    }
    public static int[] clearZero(int[] arr){
        //统计0的个数
        int count = 0;//定义一个变量记录0的个数
        for(int i = 0 ; i <arr.length ; i++){
            if(arr[i]==0){
            count++;
            }
        }
        //创建一个新的数组
        int[] newArr = new int[arr.length-count];
        int index = 0;//新数组使用的索引值
        //把非0的数据存储到新数组中
        for(int i = 0 ; i < arr.length ; i++){
            if(arr[i] != 0){
                newArr[index] = arr[i];
                index++;
            }
        }
        return newArr;
    }
}