S2.2 学会使用Java面向对象编程

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
            • 未知异常
        • 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
          • 别人写好的工具
    • 第六章, #集合框架

      • 集合

      • List

        • ArrayList集合类
          • 遍历查询效率高
          • 增删效率低
        • LinkedList集合类
          • LinkedList是实现List、Collection接口,是链表方式进行构建的,根据开发要求不同,可以使用LinkedList实现栈(先进先出)和堆(先进后出)这样的数据结构
          • 没有下标
          • 遍历效率低
          • 增删效率高
          • 可以对最后一个和第一个的元素操作
            • addFirst(Object o) 在列表的首部添加元素
            • void addLast(Object o)在列表的尾部添加元素
            • Object getFirst() 返回列表的第一个元素
            • Object removeFirst() 删除并且返回第一个元素
          • 方法

        • List的重用方法

      • HashMap集合类
        • Map在存储数据的时候如果key相同,最后存入的数据会覆盖掉前一次数据
        • 用有键和值,键和值对应
        • add("键","值");
      • for : 循环有下标的集合
        • 增强for
          • 必须知道该集合的对象的类型
        • Iterator
          • 任何地方都可以用
      • 送代器 Iterator
      • 使用integer

      • 总结

 第七章, #多线程

  • 进程和线程
    • 进程:
      • 一个软件的实例
      • 有独立的内存空间和系统资源
    • 线程
      • 线程是程序执行流的最小单元,线程并不代表程序
      • Cpu调度和分派的基本单位
      • 进程中执行运算的最小单位,可完成一个独立的顺序控制流程
    • 什么是多线程
      • 如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为"多线程"
      • 多个线程交替占用CPU资源,而非真正的并执行
    • 多线程好处
      • 充分利用CPU的资源
      • 简化编程模型
      • 带来良好的用户体验
    • 多线程共享数据引发的问题
      • 多个线程操作同一共享数据时,将引发数据不安全问题
        • 使用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(); 用法

    • synchronized 关键字

      • 语法

      • 可以使代码同步 ,输出结果

      • 如果不加关键字

  • 第八章:IO流

    • 字节流:8位
      • 基类为:OutputStream
      • 读中文不太好,用于读取文件
    • 字符流:16位
      • 通常用于读写文本
      • 基类为: DataInputStream
    • Writer类
      • flush
        • 刷新输出流
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值