本节内容 :信息隐藏(封装),package,public default,private,protected 的区别(重点),以及容器,泛型和迭代器的一些内容.

1:信息隐藏,(封装)

小tip : 内存访问方式只有存与取,存和取我们可以实现两个函数。

如果我们不想让外界随意访问可在类内使用private

int age -> private int age

我们一般不想让外界随意调用,而是用函数去取,下面以学生类·为例:

public class Stu
{
    private int age;//私有的,只能在类内访问
    //下面实现存和取的函数
    public void setAge(int age)//好处:可以添加边界条件,比如设定年龄设置的范围
    {
        this.age = age;
    }
    public void getAge()
    {
        return age;
    }
}

基于上述几点,我们便可实现一个小功能,设定输入年龄合理性,判断输入者身份,返回年龄

import java.util.*;

public class Main
{
    public static void main(String args[])
    {
        Stu a = new Stu();
        Stu b = new Stu();
        a.setAge(160);//设置a的年龄为160,已经超出范围,故自动设置为1
        b.setAge(50);//设置b的年龄为50,在范围之内
        System.out.println(a.getAge());//输出年龄
        System.out.println(b.getAge());
        
    }
}

class Stu
{
    private int age;
    public void setAge(int age)
    {
        if(age > 0 && age < 150)//设置年龄区间
        {
            this.age = age;
        }
        else
        {
            this.age = -1;//不合理则设置为-1
        }
    }
    public int getAge()
    {
        System.out.println("请输入学生姓名 a/b");
        String cmd = KB.sc.next();
        if(cmd.equals("a"))
        {
            return age;
        }
        else if (cmd.endsWith("b"))
        {
            return age + 10;
        }
        else
        {
            return -1;
        }
    }
}
class KB
{
    static Scanner sc = new Scanner(System.in);
}

输入:a

           b

输出:-1

           60

可能会有疑问

endswith函数:

此方法测试字符串是否以指定的后缀 suffix 结束。

语法

此方法定义的语法如下:

public boolean endsWith(String suffix)

在该程序中用来判断cmd是否以"b"结束

此程序尚有问题,后面讲到后会改进.

小tip : 

1:Alt + 方向键可以将一行代码随意移动

2:Source -> Generate Getters and Setters 可以直接创建存与取的函数

2:Package 与文件夹 

小tip:1:package可以理解为在eclipse工作台中的文件夹,可以存放很多个java或是class文件

2:文件夹的两个作用分别为 : 分类存放,扩大命名空间

3:当你将java文件拖入package a中时,会自动在开头补上 package a

3:public default private protected 的区别

个人理解:

public

default

private

protected

访问方式

包内外均可

包内可访问

类内可访问

(但可通过函数进行调用)

包内 及 子类(必须是直接调用而非间接调用)

课上表格:

private

default

protected

public

同一类





同一包内




不同包子类



不同包不同类


下面讲讲Bank程序:

import java.util.*;

public class Main
{
    public static void main(String args[])
    {
        Bank bank = Bank.getBank();//由于是用函数调用,如上面表格所说,private可以通过函数调用,通过这种方式,我们既实现了信息的隐藏,又实现了外部的调用
        Bank bank2 = Bank.getBank();
        bank.number = 9;
        bank.add();
        System.out.println(bank.number);
        bank2.add();
        System.out.println(bank2.number);
    }
}

 class Bank
{
    static int number;
    private static Bank bank = new Bank();//私有的静态的创建一个Bank对象 bank
    //private static修饰成员变量,
    //private 限制了它的访问范围,只能在本类中被访问,static 控制了它不需要实例化就可以访问,在类加载时就已经存在了,属于类,是一个私有的共享的数据,
    private Bank() //构造函数,且是私有的,外界不能随便给它赋初始值
    {
    }
    public static Bank getBank()//这里的Bank理解为一种数据类型,类似于int return(返回) int类型,故此处返回Bank类型
    {
        return bank;
    }
    public void add()
    {
        number++;
    }
    
}

输出: 10

         11 

对比一下如果将

Bank bank2 = Bank.getBank(); 改为 Bank bank2 = new Bank();

则会报错:


error: Bank() has private access in Bank Bank bank2 = new Bank();


重点是思想:这便是其中一个思想,外界无法随意创建对象与调用,而必须要用getBank函数,进行信息的封装

3:多种容器 Array,Arraylist,Vector,HashMap,TreeMap

讲讲Arraylist<> 和Vector<>中的 <>我们称之为泛型,与c++类似,若是Vector<int>则该容器只能存入int类型的值,同理若是 Vector<A> 则该容器只能存入A类对象。

泛型的作用可以使我们不用强制类型转换从而减少出错的可能性

Vector<A> v = new Vector<>();
v.add(new A());//只能添加A类的对象

4:迭代器,简单讲讲

迭代器Iterator可以理解为是一个指针,它可以遍历容器中的所有元素,也可以对元素进行修改等操作。

第一个作用便是可以在for循环中使用,减少代码量,具体可以用eclipse的代码补全查看.

for(iterator ...)
for(iterator i : v)

与C++类似.