本节内容 :信息隐藏(封装),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++类似.