面向对象三大特征:
- 封装
- 继承
- 多态
需求:使用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;
}
}