S2.2 第一章,对象和封装
- 成员变量和和局部变量
- 成员变量有初始值
- 局部变量没有默认值,必须赋值才可以使用,不然报错
- 无参要点:
- 1. 方法名和类名一致
- 2. 访问修饰符是公开的
- 方法命名:
- 1. 方法名不能一致,当参数列表个数或者类型可以不一致(当出现多个同样的方法的时候,这个叫做方法的重载)
- 方法重载(overload)
- 1. 同一个类中
- 2. 方法名相同
- 3. 参数个数或类型不同
- 4. 与返回值,访问修饰符无关
- 方法重写(override)
- 在子类中可与根据需要对从基类中继承来的方法进行重写
- 重写的方法必须和被重写方法具有相同的方法名称,参数列表和返回类型
- 重写方法不能使用比被重写方法更严格的访问权限
- Object类
- Object类是所有Java类的根基类
- 如果在类的声明中未使用extends关键字致命其基类,则默认基类为Object类
- Super关键字
- Super是直接父类对象的引用.可以通过super来访问父类中被子类覆盖的方法或属性
- 普通方法:
- 没有顺序限制,可以随便调用
- 构造函数中:
- 任何类的构造函数中,若是构造函数的第一行代码没有显式调用super(..);那么java都会默认的调用super();作为父类的初始化函数
- 常量
- 优点:比较安全
- 关键字:Final (java) 应该和C#的(concost)差不多
- 1. 常量名通常大写
- 2. 不同字符使用下划线分割
- 3. 只能被赋值一次,通常定义时及对其初始化
- Scanner的常用方法
- String next()获得一个字符串
- Int nextInt() 获得一个整型数值
- Java自动类型转换举例:
- Int+double =(自动转大的)
- 规则:满足自动类型转换的条件
- 两种类型要兼容:
- 数值离线(整型和浮点型)互相兼容
- 自定义数据类型兼容(猫是父类,波斯猫是子类))
- 目标类型大于原类型:
- 比如:Double大于int
- 强制类型转换
- Double num2=9.1;
- Int num=(int) num2;
- 条件运算符
- (用来赋值)
- 条件?表达式1:表达式2
- 示例:
- Int min;
- Min=5<7?5:7;
- Min=19<7?10:70;
- 封装
- 封装的概念:
- 将类的某些信息隐藏在类部,不允许外部程序需直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
- 封装的两个大致原则
- 1. 把尽可能的东西藏起来,对外提供便捷接口
- 2. 把所有属性藏起来
- 封装的步骤
- 1. 修改属性的可见性 (private)
- 2. 创建公有的getter/setter
- 封装的概念:
-
第二章,继承
- 继承
- Java.lang.Object
- 语法:publicclass 子类名 extends 父类名{}
- Extends的意思是”扩展”.子类是父类的扩展
- 类是对对象的抽象,继承是对某一批类的抽象,从而实现对现实世界更好的建模
- 好处:提高代码的复用性
- 子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法)
- 不同的叫法:超类,父类,基类,子类,派生类
- 如果定义一个类时,没有调用extends,则他的父类是: Java.lang.Object
- 单继承
- Java中类只有单继承,单继承简单来说就是:一个儿子只能有一个父亲
- 一个类只能有一个直接父亲
- 多继承
- Java的多继承,可以通过接口来实现,C++有多继承(一个儿子可以有多个父亲)
- 坏处:多继承会引起混乱,父母亲,那是一个多么混乱的世界啊,比如:一个儿子有多个父亲儿子不知听谁的,多继承,就是为了实现代码的复用性,缺引入了复杂性,使系统类之间的关系混乱.
- 组合
- 组合就是new对象然后调用
- 组合和继承是可以相互替代的
- 什么是方法重写
- 方法的重写或方法的覆盖(overriding)
- 子类根据需求对从父类继承的方法进行重新编写
- 重写时,可以用super.方法的方式来保留父类的方法
- 构造方法不能被重写
- 方法重写的规则
- 1.方法名相同
- 2.参数列表相同
- 3.返回值类型相同或者是其子类(自动类型转换)
- 4.访问权限不能严于父类
- 5.父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法
- 6.子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法
- 7.父类的私有方法不能被子类覆盖
- 8.不能抛出比父类方法更多的异常
- 自动类型转换
- https://blog.csdn.net/a909301740/article/details/52084853
- 整数默认类型:int 小数默认类型:double
- 方法重写vs方法重载
- Object类
- Object类是所有类的父类
- 语法:public class Pet extends Object { …… }
- Object类被子类经常重写的方法
第四章,接口
- 好处
- 更加抽象
- 更加面向对象
- 提高程序灵活性
- 提高可维护性降低耦合
- 接口本质是一个类,且是一个完全抽象的类;
- 接口可以理解成一个usb接口
- 插入u盘时会读取数据
- 插入风扇时风扇会转,
- 不同的东西插入就会实现不同的方法
- 所有全部方法都是抽象的
- 接口特性
- 接口里只能定义静态常量。(不能用private修饰)
- 接口没有构造函数
- 方法都是公开的抽象方法(声明的成员全部自动设置为public)
- 接口不可以被实例化
- 类不能继承接口,可以实现多个接口
- 接口可以继承多个接口
- 实现类必须实现接口的所有方法
- 一个接口是可以通过extends继承多个接口
- implements、多个接口使用逗号隔开
- 接口中的变量都是静态常量(public static final)
- 好处
-
第五章, #异常
- 异常是指程序发生的报错异常,而程序员就需要去解决错误,给予正确的异常提示
- 运行时异常:
- 都是RuntimeException类及其子类异常, NullPointerException(空指针异常) IndexOutOfBoundsException(下标越界异常) ClassCastException(类型转换异常) 这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。
- 非运行时异常 (编译异常):
- 是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。
- IOException SQLException 用户自定义的Exception异常,一般情况下不自定义检查异常。
- 异常处理使用的方法
- ifelse
- 代码量较多
- 程序员要花很大精力堵漏洞
- 程序员很难堵住所有的漏洞
- 使用异常机制 : try,catch,finally,throw和throws
- 快捷键Alt+Shift+z
- void printStackTrace()
- 输出异常的信息,
- String getMessage()
- 返回异常信息描述字符串.该字符串描述异常产生的原因,是printStackTrace()方法输出信息的一部分
- catch()的方法
- InputMismatchException
- 输入的不是整数
- ArithmeticException
- 除数为0
- Exception
- 未知异常
- InputMismatchException
- system.exit(0)
- 正常退出
- system.exit(1)
- 使finally块不执行
- 强制退出
- throw和throws的三不同
- throw用于在程序中抛出异常;throws用于声明该方法内抛出了异常
- 使用的位置不同:throw位于方法体内部,可以作为单独语句使用;throws必须跟在方法参数列表的后面,不能单独使用
- 内容不同:throw抛出一个异常对象,而且只能是一个;throws后面跟异常类,而且可以跟多个异常类
- throw:抛出异常
- 在方法里面写
- 运行时异常,调用的地方可以不处理,不处理运行到该地方就会报错
- throw new Exception("");
- throws:声明异常(声明一个检查异常)
- 调用的地方必须处理,否则编译出错
- public static void divide() throws Exception {}
- Jar
- 别人写好的工具
- ifelse
-
第六章, #集合框架
- 集合
- List
- ArrayList集合类
- 遍历查询效率高
- 增删效率低
- LinkedList集合类
- LinkedList是实现List、Collection接口,是链表方式进行构建的,根据开发要求不同,可以使用LinkedList实现栈(先进先出)和堆(先进后出)这样的数据结构
- 没有下标
- 遍历效率低
- 增删效率高
- 可以对最后一个和第一个的元素操作
- addFirst(Object o) 在列表的首部添加元素
- void addLast(Object o)在列表的尾部添加元素
- Object getFirst() 返回列表的第一个元素
- Object removeFirst() 删除并且返回第一个元素
- 方法
- List的重用方法
- ArrayList集合类
- HashMap集合类
- Map在存储数据的时候如果key相同,最后存入的数据会覆盖掉前一次数据
- 用有键和值,键和值对应
- add("键","值");
- for : 循环有下标的集合
- 增强for
- 必须知道该集合的对象的类型
- Iterator
- 任何地方都可以用
- 增强for
- 送代器 Iterator
- 使用integer
- 总结
- 继承
第七章, #多线程
- 进程和线程
- 进程:
- 一个软件的实例
- 有独立的内存空间和系统资源
- 线程
- 线程是程序执行流的最小单元,线程并不代表程序
- Cpu调度和分派的基本单位
- 进程中执行运算的最小单位,可完成一个独立的顺序控制流程
- 什么是多线程
- 如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为"多线程"
- 多个线程交替占用CPU资源,而非真正的并执行
- 多线程好处
- 充分利用CPU的资源
- 简化编程模型
- 带来良好的用户体验
- 多线程共享数据引发的问题
- 多个线程操作同一共享数据时,将引发数据不安全问题
- 使用synchronized修饰的方法控制对类成员变量的访问
- synchronized就是为当前的线程声明一个锁
- 使用synchronized修饰的方法控制对类成员变量的访问
- 多个线程操作同一共享数据时,将引发数据不安全问题
- 多个并发线程访问同一资源的同步代码块时
- 同一时刻只能有一个线程进入synchronized(this)同步代码块
- 当一个线程访问一个synchronize(this)同步代码块时,其他synchronized(this)同步代码块被锁定
- 当一个线程访问一个synchronize(this)同步代码块时,其他线程可以访问该资源的非synchronize(this)同步代码
- 线程安全的类型
- 为达到安全性和频率的平衡 ,可以根据实际场景来选择合适的类型
线程安全:
StringBuffer 、HashTable(和HashMap功能都一样,唯一不一样的是:HashTable为线程安全和key/value不可以为null值)、Vector(JDK1.0时候出来)、stack(栈先进后出)
线程不安全:
StringBuilder(相比StringBuilder效率更高)、HashMap(可以有null,值但仅能有一个)、ArrayList - 常见类型对比
- 为达到安全性和频率的平衡 ,可以根据实际场景来选择合适的类型
- Thread类
- Java提供了java.lang.Thread类支持多线程编程
- 主线程
- main()方法即为主线程入口
- 产生其他子线程的线程
- 必须最后完成执行,因为他执行各种关闭动作
- 线程的5状态
- 新建状态、就绪状态、阻塞状态、运行状态、死亡状态。
- Thread 方法
- start
- 已启动的线程不能重复调用start()方法,否则会报IllegalThreadStateException异常。
- 启动线程的方法(运行状态)
- join
join()方法使调用该方法的线程在此之前执行完毕,也就是等待该方法的线程执行完毕后再往下继续执行。注意该方法也需要捕捉异常。- t.join(1000);//等待线程t 1000毫秒
- 可能抛出错误 InterrupedtException
- sleep
使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。注意该方法要捕捉异常。
例如有两个线程同时执行(没有synchronized)一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的线程执行完毕后,低优先级的线程才能够执行;但是高优先级的线程sleep(500)后,低优先级就有机会执行了。
总之,sleep()可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级的线程有执行的机会- sleep(1000);//睡眠5秒
- yield
yield意味着放手,放弃,投降。一个调用yield()方法的线程告诉虚拟机它乐意让其他线程占用自己的位置。这表明该线程没有在做一些紧急的事情。注意,这仅是一个暗示,并不能保证不会产生任何影响。- 该方法与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会。
- 堵塞状态
- Thread.yield(); 用法
- start
- synchronized 关键字
- 语法
- 可以使代码同步 ,输出结果
- 如果不加关键字
- 进程:
-
第八章:IO流
- 字节流:8位
- 基类为:OutputStream
- 读中文不太好,用于读取文件
- 字符流:16位
- 通常用于读写文本
- 基类为: DataInputStream
- Writer类
- flush
- 刷新输出流
- flush
- 字节流:8位