java-day18
目录
数据隐藏
在定义一个类的时候,我们需要考虑以下,类中的哪些属性/方法对外是可见的,哪些属性/方法对外是不可见的。
例如类中有些属性是内部使用,用来表示对象内部的一些状态,在这种情况下,其他代码中是没有必要知道我们对象里面这个属性的存在。这时候就可以使用private修饰符,把这些属性/方法隐藏起来。
注意,在使用private隐藏属性的时候,我们还可以现在当前是否允许用户设置或者访问这个属性,如果允许用户设置,那么就可以提供一个set方法,如果允许用户访问,那么就提供一个get方法,这时候,用户虽然不能直接访问这个属性,但是可以通过get/set方法间接的来访问这个属性,这样做的目的可以提供我们对这个属性的控制力,以及提高属性的安全。
public class Student{
public String name;
private int age;
public void setAge(int age){
this.age = age;
}
public int getAge(){
return this.age;
}
}
main:
Student s = new Student();
s.name = "tom";
System.out.println(s.name);
//s.age = 20;
//System.out.println(s.age);
s.setAge(20);
System.out.println(s.getAge());
注意,类中attribute和property的区别,一提到attribute,我们第一个想到的就应该是类中的属性,一提到property,我们第一个想到的就应该是类中get/set方法。
注意,property的规则就是,去掉get/set方法前面的get/set这个单词,然后剩下的单词,首字母小写,最后的结果就是property。所以get/set这个方法并不是property。
注意,property只是给get/set方法的特殊形式起了一个名字而已。这个特殊形式就是去掉get/set单词,剩下部分首字母大写。
注意,property指的都是这种特殊的方法,get/set方法,专门用来取值和设置值的方法。
封装
隐藏代码的实现细节
对于调用者来讲,很多时候,这个代码实现的细节,我们是没有必要、也不需要知道,我们只要知道这个方法叫什么名字,怎么去调用,调用的时候需要传什么参数,返回的结果是什么样子,以及调用的过程中可能会抛出什么异常,每种异常代表了什么情况等信息就可以了。也有一些情况,是方法/接口的提供提供者也不愿意让我们知道它们的实现细节,例如这些都是有商业用途的或者软件不开源的等情况。
统一用户的调用接口
假如有三个用户:user、vip、admin
查看当前的页面信息:
三个用户查看的到的内容是不同的,所以需要三个不同的方法针对这个三种用户,返回不同的信息
user showInfo_user( ) vip showInfo_ vip( ) admin showInfo_ admin( )
可以进行封装:
public String showInfo_a11(){
//根据当前调用者角色身份,来确定主要执行的代码
if(role == 0){
//...........
}
else if(role == 1){
//...........
}
else if(role == 2){
//...........
}
return ... ;
}
提高系统的可维护性
从封装后的结果来看,对于调用者,需要调用的接口变少了,调用的方式也变简单了,提高了开发的效率,同时对于这些接口的提供者,我们维护接口的数量变少了,以前在很多地方编写的相同的代码,都封装起来,在其他地方进行调用,这样也减少了很多的维护工作量。
方法重载
重载和重写是java中和方法相关的两个非常重要的现象。
在一个类中,有多个方法的名字相同,但是方法的参数列表不同,这个情况就叫方法的重载。
例如,System. out. print1n中的println方法
总结:编译器在类中确认一个方法,只会通过方法名和参数列表,所以不同的俩个方法有三种情况:
1.方法名和参数类别都不同
2.方法名不同,参数列表相同
3.方法名相同,参数列表不同
如果一个类中出现了上面描述的第三种情况,那么就是方法的重载。
方法的参数列表不同,分为几种情况:
1.参数的个数不同
public void test(){}
public void test(int a){}
public void test(String s1,String s2){}
2.参数的类型不同
public void test(int a){}
public void test(String s){}
public void test(Student stu){}
3.参数的顺序不同
public void test(int a,String s){}
public void test(String s,int a){}
方法重载的要求:
1.在同一个类中
2.方法名相同
3.方法参数列表不同
4.修饰符、返回类型、抛出异常这些地方没有限制
重载的作用/意义
例如,我们一直使用的println方法 可以帮调用者输出数据,但是数据的类型有很多中,不同类型数据的处理方式还存在着差异,所以并不能使用相同的代码把所有类型的数据都处理掉,所以我们就需要分别处理了。然后就对println方法进行了重载,每种重载后的方法都是专门对其中一种数据类型进行处理的。
对于调用者来说,我们只需调用这个println,然后把我们手上的数据传给他,之后就是编译器或者JVM,根据这个方法的名字,以及我们所传的参数类型,自动的去查找定位这个要的调用的方法是重载的哪一个,找到之后就可以执行了。因为重载方法中包含我们所有的数据类型,所以调用者并不需要知道我们确定调用的是哪一个方法,我们只是把数据传给这个方法。
总结:一个方法,只能处理一种数据类型,但是java中有很多种数据类型,如果我们想让这个方法去处理不同的数据类型,那么方法的重载就是一个不错的选择。
实例:
public class OverLoadTest{
public static void main(String[] args){
OverLoadTest t = new OverLoadTest();
t.test(1,1);
}
public void test(int a,long b){
System.out.println("第一个方法被调用");
}
public void test(long a,int b){
System.out.println("第二个方法被调用");
}
public void test(){
}
public void test(int a){
}
public void test(String s){
}
public void test(int a,String s){
}
public void test(String s,int a){
}
private static int test()throws RuntimeException{
return 0;
}
}