- 对象和封装
- 类和对象
- 使用对象的目地:
- 用计算机语言描述现实世界
- 用计算机语言解决现实世界的问题
- 使用面向对象的好处:
- 交流更加流畅
- 提高设计和开发效率
- 怎样实现面向对象编程
- 找出类
- 找出属性(变量)
- 找出行为(方法)
- 类图:
- “+”为public 公开的
- “-“为private私有的
- this关键字,是对一个对象的默认引用,用以区分同名成员变量
- this关键字,代表当前对象(当前成员变量)
- 使用对象的目地:
- 构造方法和重载
- 首先对象实例化
- 构造方法
- 无参构造
- 语法
- 访问修饰符 构造方法名(){}
- 作用
- 给成员属性默认赋初始值
- 语法
- 有参构造
- 语法
- 访问修饰符 构造方法(参数列表....){}
- 语法
- 无参构造
- 构造方法特点
- 方法名与类名同名
- 无返回值
- 与反问修饰符 无关
- 构造方法
- 重载
- 特点
- 方法名相同,参数列表不同(个数,类型,顺序)
- 在同一个类
- 参数变量与类中的成员变量同名,必须使用this关键字
- 特点
- 自定义一个列表有参构造,系统就不在默认分配无参数构造,使用无参数构造时必须手动添加无参构造的定义
- 首先对象实例化
- static定义方法
- 调用方法
- 1实例化对象,对象,静态方法
- 对象.静态方法
- 2类名 属性 方法
- static 定义代码块
- 静态代码块只能给static属性赋值
- 运行永远 比构造方法先执行
- 在程序中任何变量或者代码都是在编译时由系统自动分配 内存存储
- 静态属性.类变量
- 所谓的静态就是指在编译后所分配的内存会一直存在直到程序退出,内存才会释放这个空间,也就是程序运行,那么这代码块一直存在
- 1实例化对象,对象,静态方法
- static的方法以下几天限时
- 它们仅能调用其他static方法
- 它们仅能访问static数据
- 它们不能以任何方式引用this或super
- 封装
- 步骤
- 设为私有的 private
- 创建共有的public 的get set 方法用于属性的读写
- 在get属性中加入属性控制语句
- 步骤
- 调用方法
- 总结
- 现实世界是面向对象的,面向对象就是采用现实模以的方法设计和开发程序
- 面向对象设计是目前计算机软件开发中最流行的技术,面向对象设计的过程就是抽象的过程
- 类是对某一事物的描述,是抽象的,概念上的定义。对象是实际存在的该是的个体,是具体是,现实的
- 如果同一个类中包含了两个或两个以上的方法,他们的方法名相同,方法参数个数或者类型不同则该方法成为方法的重载
- 构造方法用于创建类的对象构造方法的主要作用就是在创建对象时执行一些初始化操作,可以通过构造方法重载来实现多种初始化行为
- 封装就是将类的成员声明私有的,同事提供公有的方法对该属性的存取操作
- 封装的好处
- 隐藏类的实现细节
- 让使用者只能通过程序规定的方法来访问数据
- 可以方便的加入存取控制语句,限制不合理操作
- 类和对象
- 继承
- 什么是继承?
- 子类和父类是is-a的关系
- 语法
- 访问修饰符 class 类名 extends 父类{}
- java继承的关键字 extends
- c#继承的关键字 :
- 子类访问父类的成员
- 访问父类的构造方法
- super();无参数构造
- super(参数); 有参数构造
- 访问父类的属性
- super.属性
- 访问父类的方法
- super.方法
- 注意:
- 使用super关键字,super代表父类对象
- 在子类构造方法中企鹅调用必须是第一句
- 实例化子类对象,默认会先执行父类的无参数构造,在执行子类的无参数构造
- 实例化子类的有参数构造时,使用super(参数)重复调用,父类中有参数构造,默认直接调用父类中有参数构造,不会调用父类中的无参数构造
- 子类不能继承父类中私有的变量和私有方法
- 访问父类的构造方法
- 访问修饰符
- private 成员
- 子类不能继承
- 子类与父类在不同包使用默认访问权限成员
- protrcted 成员
- 可以修饰属性和方法
- 本类 同包 子类可以访问
- public 公开的
- 可以修饰
- 在所有类中都能访问
- private 成员
- 方法重写
- 调用父类的方法,不能显示子类中的属性
- 子类重写父类
- 构造方法不能重写(因为不能被继承所以不能重写)
- 特点
- 方法名相同
- 参数列表相同
- 返回值类型相同或者是其子类
- 位置在子类中
- super关键字
- super只能出现在子类的方法和构造方法中
- super调用构造方法时只能是第一句
- super不能访问父类的private成员、
- final关键字
- 用final修饰的类不能在被继承
- 用final修饰的方法不能在被重写
- 用final修饰的变量将变成常量,只能赋值一次
- 抽象类和抽象方法
- 特点
- 抽象类和抽象方法都是通过abstract关键字来修饰
- 抽象类不能被实例化,抽象类中可以没有,有一个或者多个抽象方法,甚至全部方法都是可以是抽象方法
- 抽象方法只有方法声明,没有方法实现,有抽象方法的类必须声明为抽象类,子类必须重写所有抽象方法才能实例化,否则子类还是一个抽象类
- 抽象类中可以有构造方法吗?
- 抽象类中可以有构造方法,其构造方法介意被本类的其他构造方法调用若此,构造方法不是有private修饰,可以被本类的子类的构造方法调用
- 特点
- 总结
- 继承是Java中实现代码重用的重要手段之一,Java中只支持单继承,就是一个类只有一个直接父类。java.lang.Object类是所有Java类的祖先
- 在子类中可以根据实际需求对父类继承的方法进行重新编写,成为方法的重写或者覆盖
- 子类中重写的方法和父类中被重写的方法必须具有相同的方法名,参数列表,返回值类型,必须和被重写方法的返回值类型相同或者是子类
- 如果子类的构造方法中没有通过super显示调用父类的有参构造方法,也没有通过this显示调用自身的其他构造方法,则系统会默认先调用父类的无参构造
- 抽象类不能被实例化,抽象类中可以有多个零到多个抽象方法,非抽象类若继承抽象类,则必须重写父类的所有抽象方法
- 用final修饰的类,不能在被继承,用final修饰的方法,不能被子类重写,用final修饰的变量将变成常量,只能在初始化时进行赋值,不能在其他地方修改
- 什么是继承?
- 多态
- 什么是多态
- 父类引用子类成为多态
- 向上转型
- 规则
- 将一个父类的引用指向一个子类对象,称为向上转型,自动类型转换
- 此时通过父类引用变量调用的方法是子类覆盖或者继承父类方法,不是父类的方法
- 此时通过父类引用变量无法调用子类特有的方法
- 规则
- 使用多态的两种形式
- 使用父类作为方法形参实现多态
- 使用父类作为返回值实现多态
- 实现多态的条件
- 继承的存在(继承是多态的基础,没有继承就没有多态)
- 子类重写父类的方法(多态下调用子类重写后的方法)
- 父类引用变量指向子类对象(子类到父类的类型转换)
- 向下转型
- 将一个指向子类对象的父类引用赋给一个子类的引用,称为向下转型,等于强制类型转换
- instanceof运算符
- 语法
- 对象 instanceof 类或者接口
- 说明
- 用来判断一个对象是否属于一个类或者实现一个接口,结果为true或者是false,在强制类型转换之前通过instanceof运算符检查对象的真实性,在进行相应的强制类型转换,可以提高代码的健壮性
- 语法
- 总结
- 通过多态可以减少类中的代码量,可以提高代码的可扩展性和可维护性,继承是多态的基础,没有继承就没有多态
- 把子类转换为父类称为向上转型,自动类型转换,把父类转换为子类称为向下转型,必须强制类型转换
- 向上转型通过父类引用变量的方法覆盖或继承方法,通过父类引用变量无法覅用子类特有的方法
- 向下转型可以访问子类特有的方法,必须转换为父类指向的真实子类类型,否则将出现类型转换异常ClassCastException。
- instanceof运算符用于判断一个对象是否属于一个类或实现一个接口
- instanceof运算符通常和强制类型转换结合使用,先通过instanceof进行类型判断,在进行相应的强制类型转换
- 使用父类作为方法形参和使用父类作为返回值类型是使用多态的常用方式
- 什么是多态
- 接口
- 什么是接口?
- 接口是一种约定
- 接口是一种能力
- 接口的语法
- 【修饰符】 interface 接口名 extends 父接口 ,.......{//常量定义,//方法定义}
- 【修饰符】 extends 父类名 implements 接口1........{//类成员}
- 接口的特性
- 接口中所有的方法都是抽象方法,接口中方法都会自动用 public abstract 修饰,接口全局抽象方法
- 和抽象类一样,接口也不能实例化,接口中不能有构造方法
- 接口之间可以通过extends实现继承关系,一个接口可以继承多个接口,但接口不能继承类
- 接口的实现类必须实现接口的全部方法,否则定义为抽象类
- 接口的方法不能私有
- 接口中的变量都是常量
- 接口是一种能力
- 体现在接口的方法上
- 继承是is-a的关系
- 接口则是has-a的关系
- 接口是一种约定
- 参数,注释,名称
- 本章总结
- 接口中的属性都是全局静态常量,接口中的方法都是全局抽象方法,接口中没有构造方法
- 类只能继承一个父类,但是可以实现多个接口,一个类如果实现了一个接口,则必须实现接口中的全部方法,否则必须将其定义为抽象类,Java通过实现接口达到了多重继承的效果
- 接口是一种约定,接口表示一种能力,接口体现了约定和实现相分离的原则
- 抽象类利于代码复用,接口利于代码维护
- 通过面向接口编程,可以降低代码见的耦合性,提高代码的可扩展性和可维护性
- 面向接口编程意味着;开发系统时主体架构使用接口,接口构成系统的骨架,这样就可以通过更换实现接口的类来实现更换系统
- C#中接口的成员主要是方法和属性接口中不能包含常量和变量,构造方法和任何静态成员,定义接口时显示指定任何修饰符是非法的
- 什么是接口?
- 异常
- 什么是异常?
- 子程序运行过程中所发生的不正常事件
- Java异常处理五个关键字
- try catch finally throw throes
- 常见的异常
- 算术异常类:ArithmeticExecption
- 空指针异常类:NullPointerException
- 类型强制转换异常:ClassCastException
- 数组负下标异常:NegativeArrayException
- 数组下标越界异常:ArrayIndexOutOfBoundsException
- 违背安全原则异常:SecturityException
- 文件已结束异常:EOFException
- 文件未找到异常:FileNotFoundException
- 字符串转换为数字异常:NumberFormatException
- 操作数据库异常:SQLException
- 输入输出异常:IOException
- 示例
-
- 日志
- 三类
- sql日志:记录系统执行的sql语句
- 异常日志:记录系统运行中发生的异常事件
- 业务日志:记录系统运行过程
- log4j是一个非常优秀的日志记录工具
- 三类
- 总结
- 异常是由Java应用程序抛出和处理的非严重错误,他可以分为Chencked异常和运行时异常两类
- Chencked异常必须捕获异常或者声明抛出,否则无法通过编译,运行时异常不要求捕获或者声明抛出
- Java的异常处理是通过五个关键字 try catch finally throw throws
- 即使try块 catch块中存在return语句finally块中语句也会被执行,finally块中语句不被执行的唯一情况是,在异常处理代码中执行system.exit(1);
- 可以在一个try语句后面跟多个catch语句块,分别处理不同异常,但排列顺序必须是从特殊到一般,最后一个一个为Exceotion类
- log4j是一个优秀的日志记录工具,常用使用方式是配置log4j.properties文件,从而控制日志的输出级别,目的地和输出格式
- 什么是异常?
- 集合框架
- Java集合框架包含的内容
- Java集合框架分为两大类
- Collection和Map
- collection分为
- set和list
- set 接口:存储唯一,无序的对象
- list接口:存储不唯一,有序的对象
- collection接口存储一组不唯一,无序的对象
- Map接口:存储一组成对的键值对应,提供key到value的映射,Map中的要求不重复,有序,value不要求有序 允许重复
- set和list
- collection分为
- list接口
- ArrayList
- ArrayList集合存储数据的方式和数组相同
- 方法
- boolen add(Object o) 在列表末尾顺序添加元素,起始索引位置从0开始
- void add(int index,Object o) 指定索引位置添加元素
- int size( ) 返回列表中元素个数
- Object get(int index) 返回指定索引位置处的元素
- boolean contains(Object o) 判断列表中是否存在指定元素
- boolean remove(Oject o ) 从列表中删除元素
- Object trmove(int index) 从列表中删除制定位置元素,起始位置从0开始
- linkedList
- linkedList采用链表存储方式,优点在于插入,删除元素时效率比较高,它提供了额外的addFirst (),addLast()....方法
- linkedList特殊方法
- void addFirst 在列表的首部添加元素
- void addLast 在列表的末尾添加元素
- Object getFirst 返回列表中的第一个元素
- Object getLast 返回列表中的最后一个元素
- Object removeFirst 删除并且返回列表中的第一个元素
- Obect removeLast 删除并且返回列表的最后一个元素
- ArrayList
- Map接口
- Map接口存储成对一组的键-值对象
- Map的常用方法
- Object put 已键值对的方式进行存储,注意:键必须是唯一的
- Object get 根据键返回相关联的值,若不存在指定的键,则返回null
- Object remove 删除指定的键映射的键值对
- int size 返回元素个数
- Set keySet 返回键的集合
- Collection values 返回值的集合
- boolean containsKey 若存在指定的键映射的键值对则返回true
- void clear 从此映射中移除所有映射关系
- 迭代器iterator
- Collection 接口的itertor方法返回一个iterator有两个方法组成
- boolean hasNext();判断是否存在另一个可访问元素
- Object next(); ;返回要访问的下一个元素
- Collection 接口的itertor方法返回一个iterator有两个方法组成
- 泛型集合
- jdk1.5中通过泛型有效解决问题增加泛型的支持
- 总结
- 集合弥补了数组的缺陷,它比数组更加灵活更加实用,可大大提高了软件的开发效率,而且不同的集合可适用于不同的场合
- 集合框架为表示和操作集合而规定的一种统一的标准体系结构。集合框架包含三大块内容,对外的接口,接口实现和对集合运算的算法
- 通常说Java的集合框架中有两大雷接口,即Collenction 和Map。其中Collenction有两个子接口,即list和set,
- 区别
- collenction 接口存储一组不唯一,无序的对象
- set接口继承collenction接口,存储一组唯一,无序的对象
- list接口继承collenction接口,存储一组不唯一,有序的对象
- Map接口存储一组成对的键值对象,提供key到valu的映射,key不要求有序,不允许重复,value同样不要求有序,但允许重复
- ArrayList和数组采用相同的存储方式,它的优点在于遍历元素和随机访问元素的效率比较高,LinkedList采用链表存储方式,优点在于插入,删除元素时效率比较高
- HashMap是最常见的Map实现类,它的存储方式是哈希表,优点是查询指定元素效率高
- iterator为集合而生,专门实现集合的遍历,他隐藏了各种集合实现类的内部细节,提供了遍历集合的统一编程接口
- 使用泛型集合在创建集合对象时指定集合中元素的类型没在从集合中取出元素时无需进行类型强制类型转换,避免了classCaseException异常
- Java中共有八个包装类:byte short integder long float double boolean character
- Collection和Map
- Java集合框架分为两大类
- Java集合框架包含的内容
- 多线程
- 进程:
- 应用程序的执行实例,有独立的内存空间和系统资源(动态的,并发执行,独立单位)
- 线程
- CPU调度和分派单位,进程中执行运行的最小单位,真正在CPU的运行的是线程
- 两者关系
- 线程在进程里面线程是进程内部执行单元,多个任务称为多线程;进程能跑多个线程(抢占资源)在同一个时刻只有一个线程执行!一个线程可以创建一个线程也可以删除一个线程称之为调度。
- 使用多线程的好处
- 合理的使用线程
- 减少开发和维护的成本
- 改善复杂应用程序的性能
- 充分利用CPU的资源
- 简化编程模型
- 带来良好的用户体验
- 线程的分类
- 1, 系统线程(知道就行)
- 2, 用户线程(重点)
- 创建线程的两种分类
- 继承java.lang.Thread包
- 实现java.lang.Runnable接口
- 继承
- 创建线程的步骤
- 定义一个线程
- 创建线程对象
- 启动线程
- 终止线程
- 主线程
- main方法即为主线程入口
- 产生其子线程的线程
- 必须最后完成执行
- 创建线程的步骤
- 接口
- 定义在java.lang.Runnable包中,声明一个抽象方法run
- 步骤
- 定义接口,实现接口,重写run方法
- 创建对象
- 创建Thread对象
- 启动线程
- 创建线程的两种分类
- 线程的状态
- 五种
- 创建 就绪 运行 阻塞 死亡
- 创建(创建Thread对象)
- 就绪(启动线程)
- 运行(输出)
- 阻塞(sleep方法)
- 死亡(终止)
- 阻塞状态的条件
- 由于线程优先级比较低,因此不能获取CPU资源
- 使用sleep方法使线程休眠
- 通过调用wait方法,使线程等待
- 通过调用yield方法,线程显示出让CPU控制权
- 线程由于等待一个文件;I/O事件被阻塞
- 创建 就绪 运行 阻塞 死亡
- 五种
- 线程的调度
- 优先级
- 优先级从1~10 1表示最低,10为最高 默认值是5
- 优先级高的线程优先执行效率概率更加的高
- 优先级
- 线程的休眠
- 线程休眠使用sleep方法
- public static void sleep(毫秒);
- 线程的强制执行
- 使用join方法
- 语法
- public final void join();
- public final void join(long miils);
- public final void join(long mills ,int nanos);
- 线程礼让
- 使用yield()方法;
- 语法
- public static void yield ();
- 可以暂停当前线程执行
- 线程同步
- 语法
- 访问修饰符 synchronize 返回值类型 方法名(参数列表){//方法体}
- synchronize 访问修饰符 返回值类型 方法名(参数列表){//方法体}
- 方法体
- synchronize(this){}
- synchronize 块中的代码必须获得对象synchronize的锁才能执行,具体机制与同步方法一致
- 语法
- 线程安全类型
- 将Array对象中添加数据
- 将索引指加1,即为集合扩容,确保可装入新元素
- 在新增位置存放数据
- 对比hashtable和hasMap
- 继承关系不同
- 两者都实现了Map接口
- 是否线程安全
- 是否允许出现null值
- 效率比较
- 继承关系不同
- 对比String和StringBuilder
- 都是用来存储字符串的变量,是可变的对象,区别是StringBuilder的线程更加的安全
- 将Array对象中添加数据
- 总结
- 多线程允许程序员编写最大程度利用CPU的高效程序
- 在Java程序启动时,一个线程立刻运行,该线程通常称为程序线程的主线程。主线程的重要性体现在
- 他是产生其它子线程的线程
- 通常它必须最后完成执行,因为它执行各种关闭动作
- 可通过两种方式创建线程
- 声明一个继承Thread类的子类,在此子类中实现Thread类的run方法
- 声明一个实现Runnable接口的类,然后实现run方法
- 每一个线程创建和死亡之前,均会处于,创建,就绪,运行,阻塞,死亡状态之一
- 在Java实现的多线程应用程序中,可以通过调用Thread类中的方法来实现对线程对象的操作
- 调整线程的优先级:Java线程有优先级,在同等情况下,优先级高的线程会获得较多的运行机会,Java线程的优先级用1~10的整数表示
- 线程睡眠:sleep方法使线程转到阻塞状态
- 线程的强制运行:join方法可以强制某一线程运行
- 线程礼让:yield方法,暂停当前正在执行的线程对象,把执行机会给相同或者更高优先级的线程
- 当线程对象操纵同一共享资源时,要使用synchronized关键字来进行资源的同步处理,可以使同步方法和同步代码块来实现线程同步
- File/IO
- 文件
- 使用File类操作文件或者目录
- Java中了 java.io包提供了一些接口和类
- File对象既可以表示文件也可以表示目录
- 创建File文件对象语法
- File file =new File(path);
- File类中最常用的方法
- exists 判断文件或者目录是否存在
- isFile 判断是否是文件
- isDirectory 判断是否是目录
- getPath 表示文件的相对路径
- getAbsoutePath 表示文件的绝对路径
- getName 表示文件或者目录的名称
- delect 表示对象指定的文件或者目录
- length 表示文件的长度,单位为字节
- Java中的流
- 什么是流?
- 把指定文件中的数据读取或者写入到内存中
- Java中的输出主要是由outputsream 和Writer 输入主要是由inputstream 和reader作为基类
- 字节流建议用于二进制,字符流用于文本
- 四个基类都是抽象类
- 读写文本文件
- 使用字节流读取文本文件
- 字节输入流inputstream类
- 步骤
- 引入相关的类 如 File file =new File(“D:\\我的世界.txt”);
- 创建一个文件输入流对象 如: Inputstream ist=new FileInputstream(file);
- 利用文件输入流的方法读取文本文件的数据 如:ist.read();//读取文件的数据
- 关闭流 如:ist.close();
- 步骤
- 字节输入流inputstream类
- 使用字节流写入文本文件
- 字节输出流outputstream类
- 步骤
- 引入相关的类 如 : File file =new File(“D:\\我的世界.txt”);
- 创建一个文件输出流对象
- 文件输出流的方法把数据写入文本文件中
- 关闭流
- 使用字符流读取文本文件
- 字符输入流是reader类
- 步骤
- 引入相关类
- 创建一个FileReader对象
- 利用FileReader类的方法读取文本文件的数据
- 关闭相关流
- 步骤
- 使用FileReader和BufferedReader读取文本文件
- 步骤
- 引入相关类
- 创就按一个BufferedReader对象
- 利用BufferedReader类的方法读取文本文件的数
- 关闭相关流
- 步骤
- 字符输入流是reader类
- 使用字符流写入文本文件
- 字符输出流Writer类
- 步骤
- 引入相关类
- 创就按FileWriter对象
- 利用FileWriter类的方法写文本文件
- 关闭相关流
- 使用BufferedWriter和FileWriter写文本文件
- 步骤
- 引入相关类
- 构造一个BufferedWriter对象
- 利用方法写文本文件
- 关闭相关流
- 步骤
- 使用字节流读取文本文件
- 二进制文件的读写
- 使用DateinputStream读二进制
- 步骤
- 引入相关类
- 构造一个数据输入流对象
- 利用数据输入流对象读取二进制的数据
- 关闭数据输入流
- 步骤
- 使用DateOutputStream写二进制
- 步骤
- 引入相关类
- 构造一个数据写入流对象
- 利用数据输出流对象写入二进制的数据
- 关闭数据输出流
- 步骤
- 使用DateinputStream读二进制
- 总结
- File类用于访问文件或目录的属性
- 流是指一连串流动的字符,是以先进先出的方式发送信息的通道,程序和数据源之间是通过流联系起来的
- 流可以分为输入流和输出流,也可以分为字节流和字符流
- FileInputstream和FileOutputStream以字节流的方式读写文本
- BufferedReader和BufferedWriter以字符流的方式读写文本文件而且效率更加的高
- DateInputstream和DateOutputStream可用于读写二进制文件
- 什么是流?
- 文件
- 进程:
Accp8.0 S2 02使用Java实现面向对象编程
![](https://img-home.csdnimg.cn/images/20240711042549.png)