文章目录
一、对象和类的概念
1.对象和类的含义
2.对象和类的理解
3. 对象的解析
4. oop特性
5. 程序分析
- 事例
-
创建对象
-
让对象做事
-
不同的对象
- 用同一类制造的对象是不同的对象
6. 成员变量和成员函数
- 成员变量的含义
- 函数与成员变量
- this
- 调用函数
- 本地变量与成员变量
7. 对象初始化
- 定义初始化
- 构造函数
- 函数重载
二、对象交互
1. 对象交互案例
-
创建Display类:
Display类创建了一个显示器,使值(value)达到一定限制(limit)时归零;
limit需要通过传参获取,使Display类可以符合时钟的时和分两个对象public class Display { private int value = 0; private int limit = 0; //构造函数,得到限制条件 public Display(int limit) { this.limit = limit; } //增加value值和清零 public void increase() { value++; if(value == limit) { value = 0;//达到限制value清零 } } //得到现在的value public int getValue() { return value; } public static void main(String[] args) { // TODO Auto-generated method stub Display d = new Display(24);//每24清零 for(;;) { d.increase(); System.out.println(d.getValue()); } } }
-
创建Clock类:
Clock类的作用是统合通过Dispaly类创建的两个对象——hour和minutepublic class Clock { private Display hour = new Display(24);//创建小时和分钟的对象 private Display minute = new Display(60); public void start() { while(true) { minute.increase();//分钟+1 if(minute.getValue() == 0) {//分钟达到60 hour.increase(); } System.out.printf("%02d:%02d\n", hour.getValue(), minute.getValue());//输出时分 } } public static void main(String[] args) { // TODO Auto-generated method stub Clock clock = new Clock(); clock.start(); } }
2. 访问属性
- 封闭的访问属性
- 开放的访问属性
3. 包
- 创建一个新的包
- 包就是用来管理java文件的文件夹
- java文件在包的下级目录中
- 其它包里的类的使用
-
在一个包里面使用另一个包里面的类
-
方法一:
用import插入另一个包里面的类
-
方法二:
不使用import插入,而是在使用另一个包里面的类时,使用全称(加上另一个包的名字)
-
方法三:
用通配符 * 来插入另一个包里面的所有类
-
考虑到重名的情况,不建议使用 *
- 包里面的包
- 在包里面也可以创建一个包
- 在插入包里面的包的类时,需要将所有层次的包全部依次插入
4. 类变量和类函数
- 类变量
- 类函数
- 类变量和类函数只会初始化一次,也就是在类装载的时候初始化一次
三、容器
1. 顺序容器——泛型容器类ArrayList
- 记事本案例
- 接口设计
- 容器类
- 用来存放任意数量的对象
- 代码
import java.util.ArrayList;
public class Notebook {
private ArrayList<String> notes = new ArrayList<String>();//范型类
//添加记录
public void add(String s)
{
notes.add(s);//ArrayList里的函数add(String),用来向ArrayList里面存入字符串
}
public void add(String s, int location)
{
notes.add(location, s);
//ArrayList里的函数add(int, String),用来向ArrayList的位置location处里面存入字符串
//如果location位置有其它数据,则插入该位置,原数据集体向后移动一位
}
//得到记录条数
public int getSize()
{
return notes.size();//ArrayList里的函数size(),返回ArrayList的长度,类型为int
}
//得到储存的记录
public String getNote(int index)
{
return notes.get(index);//ArrayList里的函数get(),可以根据索引返回ArrayList里面
//存放的数据,此处返回String类型
}
//删除记录
public String removeNote(int index)
{
return notes.remove(index);//ArrayList里的函数remove(int),可以根据索引删除ArrayList
//里面存放的数据,返回删除的数据String
//删除该数据后,该数据后面的数据依次前进一位
}
//列出所有记录
public String[] list()
{
String[] a = new String[notes.size()];
// for(int i = 0; i < a.length; i++)
// {
// a[i] = notes.get(i);
// }
notes.toArray(a);//ArrayList里的函数toArray(a),自动将ArrayList里面的数据填入a
return a;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Notebook nb = new Notebook();
nb.add("first");//只能依次按顺序添加
nb.add("second");
nb.add("third", 1);
System.out.println(nb.getSize());
System.out.println("_______");
for(int i = 0; i < nb.getSize(); i++) {
System.out.println(nb.getNote(i));
}
System.out.println("_______");
System.out.println("删除了" + nb.removeNote(0));
System.out.println(nb.getNote(0));//测试现在notes的0处的数据
System.out.println("_______");
String[] a = nb.list();
for(String s : a)
{
System.out.println(s);
}
}
}
- ArrayList的操作(有些返回类型是根据ArrayList的元素类型改变,此处均设置为String)
- add(String s) :
ArrayList里的函数add(String),用来向ArrayList里面存入字符串 - add(int location,String s ) :
ArrayList里的函数add(int, String),用来向ArrayList的位置location处里面存入字符串
(如果location位置有其它数据,则插入该位置,原数据集体向后移动一位) - size():
ArrayList里的函数size(),返回ArrayList的长度,类型为int - get(int index):
ArrayList里的函数get(int),可以根据索引返回ArrayList里面存放的数据,此处返回String类型 - remove(int index):
ArrayList里的函数remove(int),可以根据索引删除ArrayList里面存放的数据,返回删除的数据String
(删除该数据后,该数据后面的数据依次前进一位) - toArray(a):
ArrayList里的函数toArray(String[] a),自动将ArrayList里面的数据填入a
更多操作请查看:Java ArrayList | 菜鸟教程
2. 对象数组
- 对象管理者
- 对象数组中的每个元素都是对象的管理者而非对象本身
- for-each
- 基本类型的数组运用for-each循环不能改变数组本身,因为for-each每轮循环的都是数组值的复制品
- 对象数组运用for-each循环能改变数组本身,因为for-each每轮循环的是对象数组的真正的对象
3. 集合容器HashSet
- 原理同顺序容器
- 定义:HashSet<String> s = new HashSet<String>();
- 集合容器与顺序容器不同的是:
集合容器无排列顺序,不能用get(int index)获取集合容器的元素,但可以用contains(String)来判断元素是否存在,返回true/false
对比输出:
ArrayList<String> a = new ArrayList<String>();
a.add("first");
a.add("second");
a.add("first");
// for(String k : a)
// {
// System.out.println(k);
// }
System.out.println(a);//两个容器都可以直接输出
System.out.println("----------");
HashSet<String> s = new HashSet<String>();
// s.add("first");
s.add("second");
s.add("first");
// for(String k : s)
// {
// System.out.println(k);
// }
System.out.println(s);
更多操作请查看:Java HashSet | 菜鸟教程
- 顺序容器和集合容器可以直接输出容器里面的内容
- 原理:
- ArrayList和HashSet也实现了toString函数,可以直接输出容器里面的内容
4. 散列表HashMap
-
HashMap 是一个散列表,它存储的内容是键值对(key-value)映射
-
HashMap 同HashSet,是无序的,即不会记录插入的顺序。
-
事例:输出钱币对应的英文名称
private HashMap<Integer, String> coinNames = new HashMap<Integer, String>(); //HashMAp(key, value),以下HashMap方法均用对应的键和值替换 //Integer不能是Int,因为容器里面的所有类型必须是对象 public Coin() { coinNames.put(1, "penny");//put(Integer, String)方法,向HashMap中存入数据 coinNames.put(10, "dime"); coinNames.put(25, "quarter"); coinNames.put(50, "half-dollar"); coinNames.put(50, "五毛");//Integer相同,会被替换 System.out.println(coinNames.keySet().size());//keySet()方法, //返回hashMap中所有Integer组成的集合视图(HashSet)。 System.out.println(coinNames);//HashMap也可以直接输出 //遍历HashMap for(Integer k : coinNames.keySet()) { String s = coinNames.get(k); System.out.println(s); } } public String getName(int amount) { if(coinNames.containsKey(amount))//containsKey(Int)方法,检测HashMap中 //是否存在Inteter对应的String,返回true/false return coinNames.get(amount);//get(Int)方法,返回HashMap中对应的String,没有则返回null else return "Not Found"; } public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); int amount = in .nextInt(); Coin coin = new Coin(); String name = coin.getName(amount); System.out.println(name); }
更多操作请查看:Java HashMap | 菜鸟教程
四、总结
1. 对象和类的概念
- 用类制造对象
- 定义类
- 成员变量和成员函数
- 对象初始化
2. 对象交互
- 访问属性
- 包
- 类变量和类函数
3. 容器
-
顺序容器ArrayList
-
集合容器HashSet
- 用法几乎与顺序容器一样,只是集合容器里面不能有重复的值以及没有顺序排列
- 直接输出内容的原理:
-
散列表HashMap
无