2020/3/13学习笔记-day18

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;
    }
​
​
}
​
发布了82 篇原创文章 · 获赞 52 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/iostream992/article/details/104849279