Java学习笔记

目录

学习目标

 7/24

extends和implements区别

什么是interface

什么是多态性

7/24小结

7/25

7/26

多态

抽象类

实训:实现员工类代码

final

static

接口

Java常用工具

Java常用API

7/26小结

7/27 

2. Scanner类

3. String类

4. StingBulider 和 StringBuffer

5. Date 和 Calendar 类

基本类型的包装类

7/27小结 

7/28 

集合

增强for 

迭代器

泛型

Collection工具类

Set集合

Map 集合

实训:模拟斗地主发牌

异常

I/O流

File类

字符流读数据

字符流写数据

7/28小结

7/29

字符流拷贝文件

字符缓冲流读写文件

字节流读写文件

字节缓冲流拷贝文件

实训:模拟文件上传功能


学习目标

 7/24

extends和implements区别

extends 是继承某个类, 继承之后可以使用父类的方法,但是继承只能继承一个类,implements可以实现多个接口,implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用

什么是interface

Interface就是接口 从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。

什么是多态性

假如要计算对象的面积,这时这个对象可能是长方形,也可能是三角形,所谓多态,就是这个对象可以指向长方形,从而计算长方形的面积,也可以指向三角形,从而计算三角形的面积。

例如 Java提供的List中就有Array List和Linked List。

实现一个多态:

  1. 有一个大类 就像Java中的List一样
  2. 在这个大类中定义构造函数和方法 例如要计算面积的方法area()
  3. 创建继承这个大类的几个子类 调用父类构造函数 重写父类方法area()
  4. 最后就可以使用这个多态类了 就像Java的List一样

7/24小结

1. 掌握多态性 接口 extends和implements等概念 

2. super方法 

7/25

我服了 Ctrl+S不能保存 寄了

7/26

多态

概念

多态是同一个行为具有多个不同表现形式或形态的能力。

实现步骤

多态应用场景

多态关系中成员变量使用

多态的弊端

抽象类

概述

 抽象类代码

 

抽象类的特点

抽象类的成员特点

实训:实现员工类代码

public class Test {
    public static void main(String[] args) {
        Employee em = new Coder();
        em.work();

        Employee em2 = new Manager();
        em2.work();

        System.out.println("------------");

        // 快速实例化
        Coder c = new Coder("张三", 30000, "研发部001");
        Manager m = new Manager("李四", 300000, "销售部001", 100000);
    }
}

// 抽象类 员工类 父类
public abstract class Employee {
    // 成员变量
    private String name;
    private int salary;
    private String id;
    
    // 无参构造
    public Employee() {
    }

    // 有参构造
    public Employee(String name, int salary, String id) {
        this.name = name;
        this.salary = salary;
        this.id = id;
    }

    // getXxx and setXxx
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    // 抽象方法 工作
    public abstract void work();
}
//子类 程序员类
public class Coder extends Employee {
    // 重写
    @Override
    public void work() {
        System.out.println("程序员在敲代码");
    }

    // 构造函数
    public Coder() {
    }

    public Coder(String name, int salary, String id) {
        super(name, salary, id);
    }
}
// 子类 经理类
public class Manager extends Employee {
    // 重写
    @Override
    public void work() {
        System.out.println("经理正在喝茶");
    }
    
    // 成员变量
    private int bonus;

    // 构造函数
    public Manager() {

    }

    public Manager(String name, int salary, String id, int bonus) {
        super(name, salary, id);
        this.bonus = bonus;
    }

    // getXxx and setXxx
    public int getBonus() {
        return bonus;
    }

    public void setBonus(int bonus) {
        this.bonus = bonus;
    }
}

final

 static

用static修饰的方法 不用 new 出对象 就可以通过 类名.方法名 使用 但要注意的是 static修饰的方法 不能由非静态成员

public static final (公共的静态常量)

接口

概念

用于描述类具有什么功能 但并不给出具体实现 类要遵从接口描述的同意规则进行定义 所以 接口是对外提供的一组规则 标准。

接口的定义

 特点

接口和类之间的关系

 

接口成员的特点

 

 Java常用工具

Java常用API

1. Object类

toString 用来将对象转成其对应的字符串形式 输出语句直接打印对象 默认调用了该对象的toString()方法。

getClass 可以用来比较两个对象是否为同一个类型 

7/26小结

学习了 多态 抽象类 两个关键字 final 和 static 接口以及Java常用API之一的Object类

7/27 

2. Scanner类

 

3. String类

构造 和 判断方法

获取方法

 转换方法

数据转字符串

字符串 -> 其他基本类型

 可以用 基本类型的parseXxx()方法 例如 将 字符串"123" 转换成 byte 类型

byte b = Byte.paseByte("123");

 4. StingBulider 和 StringBuffer

5. Date 和 Calendar 类

  

 创建Calendar对象 并获取年月日信息

 设置年月日信息

基本类型的包装类

八个包装类

 装箱 和 拆箱

parseXxx() 将字符串 转换成 其他基本类型

7/27小结 

学习了常用API Scanner String StringBuilder StringBuffer Date Calendar 以及基本类型的包装类 Byte Short Integer Long Character Float Double Boolean 装箱 拆箱 parseXxx()函数

7/28 

集合

什么是集合?

简称集,是用来存储多个元素的 容器

Java集合体系

单列集合(Collection)

        List: ArrayList

        Set: HashSet

双列集合(Map:key, value)

        Map: HashMap

 List集合的特点

有序 可重复

使用集合的步骤

  1. 创建集合对象
  2. 创建元素对象
  3. 将元素对象添加到集合对象中
  4. 遍历集合

创建集合对象 元素对象

将元素对象添加到集合对象中 遍历集合

增强for 

迭代器

使用步骤

  1. 由集合对象 获取 其对象的迭代器对象
  2. 判断迭代器中是否由元素
  3. 如果有就获取元素

 

列表迭代器

列表迭代器是List体系中独有的遍历方式 可以在对集合遍历的同时进行添加 删除操作

泛型

什么是泛型

即泛指任意类型 又叫参数化类型 对具体方法的使用起到辅助作用 类似于方法的参数

集合类泛型的解释

规定集合中的数据类型

 Collection工具类

Collection简介

针对集合进行操作的工具类

成员方法

Set集合

特点

不可重复 无序

应用

与List步骤相同 要注意的是 Set 的 “去重”依赖 equals() 和 hashCode() 这两个方法 所以 要注意对元素类中 的 这两个方法 进行 重写

 

Map 集合

特点

双列集合 元素由键值对构成

应用

与Set步骤相同 要注意的是 遍历方法 相对复杂些 因为 要先通过 keySet() 的方法获取所有的键值key 才能遍

 实训:模拟斗地主发牌

// 模拟斗地主发牌
// 步骤:
//  1. 买牌
//  2. 洗牌
//  3. 发牌
//  4. 看牌

import java.util.*;

public class SendPoker {
    public static void main(String[] args) {
        //1.买牌
        //1.1定义双列集合 键:表示牌编号 值:表示牌 规则:编号越小 牌越小
        Map<Integer, String> pokers = new HashMap<>();
        //1.2定义一个单列集合 用来存储所有牌的编号
        List<Integer> list = new ArrayList<>();
        //1.3具体买牌动作
        // 普通牌52
        String[] colors = {"♠", "♥", "♣", "♦"};
        String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
        int num = 0;
        for (String number : numbers) {
            for (String color : colors) {
                String poker = color + number;
                // 将牌的编号 具体的牌放入双列集合中
                pokers.put(num, poker);
                // 将牌的编号放入单列集合中
                list.add(num);
                // 每添加1,编号加一
                num++;
            }
        }
        // 添加小王
        pokers.put(num, "小王");
        list.add(num++);
        // 添加大王
        pokers.put(num, "大王");
        list.add(num);

        //2.洗牌
        Collections.shuffle(list);

        //3.发牌
        //3.1 定义4个集合 分别表示三个玩家 底牌
        List<Integer> player1 = new ArrayList<>();
        List<Integer> player2 = new ArrayList<>();
        List<Integer> player3 = new ArrayList<>();
        List<Integer> dipai = new ArrayList<>();

        //3.2 具体的发牌动作 将索引 和 3 取模 决定 具体发给谁
        for (int i=0; i<list.size(); i++) {
            //获取编号
            Integer pokerNum =  list.get(i);
            if (i >= list.size() - 3) {
                dipai.add(pokerNum);
            } else if (i % 3 == 0) {
                player1.add(pokerNum);
            } else if(i % 3 == 1) {
                player2.add(pokerNum);
            } else if (i % 3 == 2) {
                player3.add(pokerNum);
            }
        }

        // 3.3查看玩家 底牌的编号
        System.out.println(player1);
        System.out.println(player2);
        System.out.println(player3);
        System.out.println(dipai);

        // 4.看牌
        // 定义一个方法
        System.out.println("player1的牌:" + printPoker(player1, pokers));
        System.out.println("player2的牌:" + printPoker(player2, pokers));
        System.out.println("player3的牌:" + printPoker(player3, pokers));
        System.out.println("低牌:" + printPoker(dipai, pokers));
    }

    public static String printPoker(List<Integer> nums, Map<Integer, String> pokers) {
        // 1. 对牌的编号进行升序排列
        Collections.sort(nums);
        // 2. 遍历牌 的编号集合 获取每一个编号
        StringBuilder sb = new StringBuilder();
        for (Integer num : nums) {
            // 3. 根据编号 去双列集合 找对应具体牌
            String poker = pokers.get(num);
            sb.append(poker + " ");
        }
        //5. 最后拼接结果返回
        return sb.toString().trim();
    }
}

异常

即非正常情况 通俗地说 异常就是程序出现的错误

异常的分类

异常的处理方式

方式一 捕获 自己处理 try..catch.finaly

方式二 throws 抛出异常 交给调用者处理

方法名后面 加上 thorws Exception 即可

抛给调用者后 处理异常有两种方式

        第一种 继续抛出 异常

        第二种 用 try..catch 处理

I/O流

什么是I/O流

指数据像连绵的液体一样进行传输

I/O流能干嘛

在本地磁盘和网络上操作数据

I/O流的分类

按数据流向分:输入流 输出流

按操作方式分:

        字节流:

                InputStream

                OutputStream

        字符流:

                Reader

                Writer

I/O流体系

File类

概念 

文件,文件夹,一个File对象代表磁盘上的某个文件或文件夹 也就是说 File类是用来操作文件路劲的

构造方法

成员方法

创建功能

判断功能

isDirectory() isFile() exists()

获取功能

 字符流读数据

 字符流读数据——按单个字符读取

1. 创建字符输入流对象

2. 读取数据

 

3. 释放资源

reader.close()

字符流读数据——按字符数组读取

 1. 创建字符输入流对象

 2. 读取数据

 3. 释放资源

reader.close()

字符流写数据

字符流写数据——按单个字符写入

1. 创建字符输出流对象

2. 写数据

 3. 释放资源

writer.close()

7/28小结

学习了 集合 List Set Map 增强for 迭代器 列表迭代器 泛型 Collections工具类 异常 I/O流字符流Reader 和 Writer   File类  

7/29

字符流拷贝文件

字符流拷贝文件——按单个字符拷贝

字符流拷贝文件——按字符数据拷贝

 字符缓冲流读写文件

一次读写一个字符

一次读取一行

字节流读写文件

一次读写一个字节

一次读写一个字节数组 

字节缓冲流拷贝文件

实训:模拟文件上传功能

1. 获取图片路径

2. 判断头像是否已存在

3. 如果存在 提示头像已存在 上传失败

4. 如果不存在 上传头像

反射

什么是反射?

在程序运行过程中分析类的一种能力

反射能做什么

        分析类

                加载并初始化一个类

                查看类的所有属性和方法

        查看并使用对象

                查看一个对象的所有属性和方法

                使用对象的任意属性和方法

反射的应用场景

        构建通用的工具

        搭建具有高度灵活性和扩展性的系统框架

类加载器(ClassLoader)

负责将类的字节码文件(.class文件)加载到内存中,并生成对应的Class对象

Class对象

java.lang.Class类的对象,也叫字节码文件对象,每个Class对象对应一个字节码文件

类的加载时机

        创建类的实例

        访问类的静态成员

        初始化类的子类

        反射方式创建类的Class对象

获取Class对象的三种方式

        Object类的getClass()方法

        类的静态属性

        Class类的静态方法

反射方式获取构造方法并使用

1. 获取Student类的字节码文件对象

 

2. 根据第一步获取的字节码文件对象,获取指定的构造器对象

 

3. 根据构造器对象和参数,创建对应的Student对象

反射方式获取成员方法并使用

1.  获取Student类的字节码文件对象

2.  获取该类的构造器对象,然后创建Student类的对象

 

3.  获取该类的成员方法对象 然后调用此方法

 

 

实训:获取setter方法给对象的属性设值 

通过反射方式获取成员变量并使用

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值