Java基础1

来源:互联网 发布:淘宝保暖卫衣长款 编辑:程序博客网 时间:2024/06/07 00:17

2017.4.24笔记

快捷键

  • Ctrl
    • Ctrl+D:一键回到桌面
    • Ctrl+X:剪切
    • Ctrl+C:复制
    • Ctrl+V:粘贴
    • Ctrl+A:全选
    • Ctrl+Z:回撤
    • Ctrl+y:重做
    • Ctrl+W:关闭标签页
    • Ctrl+N:新建标签页
    • Ctrl+Shift+鼠标左键:分段选择
  • Shift
    • Shlft+鼠标右键:光标多选
    • Shlft+鼠标左键:分段选择
    • shlft+Home:光标向左移动
    • Shlft+End:光标向左移动
    • Shlft+Right:向右移动并选中
    • Shlft+Left:向左移动并选中
  • Ait+F4:关闭软件
  • Windows+D:切换到桌面

  • cd

    • cd . 本目录
    • cd .. 父目录
    • cd 直接把目录名拷贝进去
    • cd 直接把文件夹拖进去
    • 在需要打开的文件夹的目录栏里输入cmd
  • dir:显示目录下的文件

  • 主流电脑系统

    • Windows linux macosx
  • 所以的可执行文件(.exe)都可以通过命令来运行

  • 文件后缀是告诉计算机用哪个软件打开它

  • 查看局域网内MAC地址

    • arp -a IP地址 制定IP的信息
    • arp -a 所有ip的信息
  • 查看局域网内所有计算机

    • net view

2017.04.25笔记

java语言概述

- java语言是sun公司开发的- java之父是高斯林

java的三种技术架构

- java EE 企业版(基于java SE)- java SE 标准版(java基础也是核心)- java ME 小型版(早期安卓应用)

java的应用

- 企业级应用- Android平台应用

java语言的特点

1. 面向对象2. 特点跨平台性    1. 写一份代码,可以在不同系统上运行    2. 通过虚拟机来翻译在不同系统运行    3. 因为java有不同版本的虚拟机(JVM)3. 特点健壮性

java开发的几个概念

- jre(java runtime enviroment)运行环境    - JVM(JAVA虚拟机)    - 类库- jdk(java development kits)开发工具包    - jre    - 开发工具

java程序初开发

(HelloWorld)

- java文件(是让程序员看的)    - 作用域 { } 一对大括号内    - System 系统    - out 输出- 编译(把java文件编译为class文件)    - 通过javac来编译    - 编译文件时需要加后缀- class文件(是让虚拟机看的)    - 执行(通过java执行)    - 执行.class文件不需要后缀

环境变量

- PATH(相当于给文件创建一个快捷方式)- 计算机属性->高级系统设置->高级->    环境变量->administrator的变量->    新建PATH->值为JDK的bin目录->> ok- 命令寻找流程    - 先在此目录找,此目录没就去的PATH寻找- PATH的功能    - 用来寻找命令    - 如果有多个命令,用英文分号来分割- CLASSPATH的功能    - 用来寻找.CALSS文件的    - CLASS文件的寻找        - 没配置,就在当前目录寻找        - 配置过,只会在CLASSPATH里寻找        - 配置过不会在本目录寻找,要添加.;- set的功能    - set是用来查找或者临时设置环境变量的    - 查找         - set 环境变量名        - 如 set path    - 设置        - set 环境变量名=XXX        - 清空 环境变量名=

java基本语法

- -encoding "utf-8"   中文编码- 注释 //    - 多行注释 /* 开始    */结束        - 多行注释不能嵌套- 变量的作用域    - 一对大括号之间生效

常见错误

- 编码GBK不可映射字符    - 编译的时候加 -encoding "utf-8" 参数    - 例:javac -encoding "utf-8" xx.java- 非法字符    - 一般是因为有中文符号- 找不到或无法加载主类    - classpath设置错误    - 类名写错

2017.4.26笔记

  • 计算机数据储存的方式:二进制

进制

  • 十进制
    • 满十进一
    • 每一位最大的数是9
  • 二进制
    • 满二进一
    • 每一位最大的数是1
    • 一乘二的零次方为一
  • 十六进制
    • 满十六进一
    • 10到15用A到F表示
    • 每一位最大的数是15->F
    • 每4位二进制位1位十六进制
    • java中十六进制用0x表示
    • 转换二进制不够4位则高位补0

整数类型

  • byte 1字节(范围-128~127)
  • short 2字节(范围-32768~32767)
  • int 4字节(范围-2^31~2^31-1)
  • long 8字节(范围-2^63~2^63-1)
  • 数值的最高位是符号是,原码(0)~补码(1)

    • 负数就补码
    • 获取数值的原码
    • 取反加一
    • 求补码
    • 整数转二进制
      • 如果是正数,直接就原码
      • 如果是负数,求补码
    • 二进制转整数
      • 如果是正数,则直接转换
      • 判断当前数值是什么类型
      • 如果是负数
      • 减一取反,补符号
  • 给byte,short赋值时虚拟机会检查值是否超出

字符类型

  • 字符类型可以运算,因为有对应的Unicode值

2017.4.27笔记

自动类型转换

  • 不能丢使数据

  • 类型匹配

    • 比如:boolean无法给数值类型赋值
    • int 可以给float赋值,为了方便书写
    • 表示long需要在数值后加L

类型提升

  • 运算过程中,两边运算的数据类型不同,会有低类型向高类型提升
  • 两个int相加可能会超出int范围,但是为了书写,这种错误没有检查,其他整形不可以

运算符

  • 取余左边为正数得出的值为正数
  • 取余左边为负数得出的值为负数

++自增

  • a++:先读取后自增

  • ++a:先自增后读取

- -自减

  • a–:先读取后自减
  • –a:先自减后读取

比较运算符

  • 比较运算符运算的结果是布尔类型

逻辑运算符

  • & 与
    • 两边条件都为true结果才为true
    • 只要有一个为false结果就为flase
    • 无论左侧结果是什么,右侧结果总会执行
  • | 或
    • 两边条件一个为true结果才为true
    • 两边条件都为false结果才为false
    • 无论左侧结果是什么,右侧结果总会执行
  • ^ 异或
    • 不一样就是true
  • !非
    • false的时候结果为true
    • true的时候结果为false

短路

  • &&
    • 左侧为false时右侧表达式则不在执行
  • ||
    • 左侧为true时右侧表达式则不在执行

三元运算符

  • 有三个表达式

    • 格式:条件表达式 ?表达式1:表示2
    • 如果条件表达式运算结果为true,则执行表达式1,否则执行表达式2

2017.4.28笔记

位运算符

  • 是用来运算整数的二进制的
  • << 左移运算符
    • 左移一位相当于乘2
    • 左移后补零
  • 右移运算符>>
    • 如果是正数,空出的位置补0
    • 如果是负数,空出的位置补1
    • 取反
  • 无符号右移>>>
    • 无论是正数还是负数全部补0

流程控制语句

  • 只能控制一条语句
  • 格式: if (条件表达式) 要控制的语句
    • 如果条件满足,执行控制的语句,
    • 如果条件不满足,执行else,或不执行

switch语句

  • 也算是开关语句,当switch里的变量与其中一个case相同,就从相同的case开始顺序执行,如果想执行完相同的case时停止,就在上break;

  • 格式:

    • switch(变量)
    • {
    • case: 常量1;
      • 语句1;
    • case: 常量2;
      • 语句2;
    • default:
    • }
  • switch如果跟case里的其中一个一样,则从它开始顺序执行,如果case里没有一样的,则执行default语句
  • 先判断表达式,在执行循环体

while循环

  • 判断条件表达式,为true则进入循环,进入循环后执行语句

do while循环

  • 格式:
    • do 循环语句
    • whilt(条件表达式)加分号
  • 先执行循环体,在判断表达式
  • do_循环最少执行一次

2017.5.2笔记

for循环

  • 格式
    • for(初始化表达式;条件表达式;循环后表达式)
    • {循环体}
  • 流程
    • 1:执行初始化表达式
    • 2:判断条件表达式是否满足条件
    • 如果满足条件,执行循环体.如果不满足,退出循环
    • 3:循环体执行完之后,执行循环后表示式
    • 4:跳回第2步继续判断条件表达式
    • 如果满足条件,执行循环体.如果不满足,退出循环
    • 5;再次进去循环体

方法

方法声明流程

  • 明确方法的功能

  • 确定有没有未知内容参与运算

  • 需不需要运算结果

方法的重载

  • 方法的标识由方法名以及参数列表组成

  • 方法的重载只和方法名,参数列表有关系

  • 在一个类里,有多个方法的方法名相同,参数列表类型,数量不同即为方法的重载
  • 方法的重载与返回值类型无关

方法的递归

  • 递归的定义
    • 函数直接或间断调用了函数本身,这就是递归
    • 注意栈溢出
  • 明确
    • 明确递归方法的功能
    • 明确退出条件

栈内存结构

  • 内存连续
  • 栈内存较小
  • 先进后出

  • 方法中定义的变量都在栈内存

堆内存结构

  • 内存不连续
  • 内存较大
  • 顺序

数组

  • 说有new出来的对象都在堆内存

  • 创建数组

    • 1:类型[ ] 变量名 = new 类型[长度]
    • 2:类型[ ] 变量名=new 类型[ ]{数据1,数据2,数据3};
  • 数组的静态初始化
    • 类型[ ] 变量名={数据1,数据2,数据3};

2017.5.9笔记

面向对象

  • 面向对象语言 c++ java c# oc

  • 面向过程语言 c

理解面向对象
  • 将功能封装成对象,强调具备了功能的对象

  • 面向对象是基于面向过程的

类与对象
  • 类是对某种事物的一个描述

    • 比如:狗,恐龙
  • 对象是某个事物的具体实例

    • 比如:你家的狗,没见过恐龙实例
  • 如果要描述一个类

    • 有什么 -> 属性 -> 变量
    • 会干什么 -> 功能 -> 方法

  • 如果类用public修饰,那么当前类名必须与文件名相同
变量的分类
  • 如果声明在方法的变量是局部变量
  • 如果声明在类里的变量是成员变量

  • 在类的声明的方法与变量统称为成员

创建对象

  • 类名 变量=new 类名()
  • 访问成员
    • 变量 . 成员
局部变量和成员变量的区别
  • 声明的位置不同
    • 局部变量声明在方法
    • 成员变量声明在类里
  • 作用域
    • 局部变量在当前大括号内生效
    • 成员变量随着对象而存在
  • 存在内存中的位置不同
    • 局部变量在栈上
    • 成员变量随着创建的对象,存在于堆上
  • 初始化
    • 局部变量必须初始化
    • 成员变量可以不显式初始化,可以进行默认初始化
    • 基本数据类型初始化的值为0
    • 引用型数据类型初始化的值为null

匿名对象

  • 创建格式
    • new 类名()
  • 访问类中的成员
    • new 类名( ).成员名( )
  • 如果这个对象只使用一次的时候,就可以使用匿名对象

封装

封装的流程
  • 把要封装的属性用privage来修饰
  • 提供public的get和set方法,方便外部访问
  • 如果获取的属性是boolean类型的,使用isXXX,如果其他类型使用getXXX

构造函数

  • 构造函数的名称必须与类名完全一致
  • 构造函数不加任何返回值
    • 如果添加返回值声明,则该方法不在是构造函数
  • 构造方法是在创建对象的时候被调用
  • 构造函数的作用: 用来初始化成员变量

this关键字

  • this(参数);
    • 在构造函数里调用另外重载的构造函数
    • 调用重载构造函数必须放在第一条语句
    • 一般调用规则是:参数少的调用多的

static修饰符

  • 与对象无关
    • 不用创建对象也可以访问
    • 访问方法
      • 类名. static 修饰的变量,或者被static修饰的方法
      • 也可以通过对象来访问
      • 同一个类里访问静态方法的时候不需要加类名
  • 静态方法无法访问非静态变量,和非静态方法
  • 非静态的方法可以访问静态的变量和静态的方法
  • 存放于内存方法区里的常量区
  • 与普通成员变量的区别
    • 存储位置不同
    • 生命周期不同
    • 静态变量随着类加载而加载,
    • 成员变量随着对象创建而创建,随着对象消亡而消亡
    • 访问方式不同

构造代码块

  • 格式
    • 类里一对大括号{初始化语句 }
    • 在构造函数调用之前,会默认调用构造代码块
  • 构造代码块与对象有关
    • 只要调用构造函数,构造代码块就会执行
    • 执行顺序与代码放置有关
  • 构造代码块可以有多个
  • 使用场景
    • 如果创建对象的时候,不管使用的是哪个对象,都必须执行的
  • 所有的非静态成员变量前都可以加一个 this.
  • 所有的静态成员变量前都可以加一个 类名.

静态代码块

  • 静态代码块与类有关,不论有几个对象只执行一次

隐式构造函数

  • 如果一个类里,没有显式的声明过构造函数,则会有一个默认的隐式的空参数的构造函数

普通函数与构造函数的区别

  • 格式不同
    • 构造函数:没有返回值,方法名必须与类名相同
    • 普通函数:需要声明返回值类型,如果没有,声明为void,方法名没有限制
  • 调用时机不同
    • 普通函数可以随时,多次的调用
    • 构造函数只有在创对象的时候会被调用一次

单例模式()

  • 也称为设计模式

  • 设计模式是为了解决某种类型的问题,总结出来的某种固定的写法

  • 解决的问题

    • 让某个类只能创建一个对象
  • 代码流程

    • 构造函数私有化:防止外部随便创建该类的对象
    • 创建一个静态的当前类引用类型的变量
    • 创建一个公共静态的方法,用来获取当前类的对象
  • 组合

    • 一个类有另一个类

继承

  • super() 可以在子类构造函数里调用父类的构造函数
  • 哪个类里声明的变量就在哪个类的初始化
  • 对super的调用必须在构造函数的第一条语句
  • this( ) 与super在一个构造函数里只能有一个
  • 如果在子类里构造函数里没有显示调用过父类的构造函数,则会有一个隐式的调用父类空构造函数的super存在

重写

  • 子类覆盖父类方法的时候权限不能低于父类的权限

final 关键字 —>不可修改

  • 变量
    • 不可以重新赋值,可以初始化
    • 被fianl修饰的成员变量必须显示初始化,或者在构造函数里初始化
    • 被final修饰的类无法被继承
    • 如果整个 类都不行被修改,则可以使用final
    • 被final修饰的方法无法被重写

接口

  • 接口的声明
    • 关键字 interface 接口名
  • 接口的使用

    • implements
  • 接口里的抽象方法都是 public abstract的

  • 接口里的变量都是 public static final的
  • 接口与接口建立联系只能用继承

  • 什么时候用接口

    • 如果有一个抽象类,所有的方法都是抽象方法,没有成员变量,则这个抽象类就可以声明为接口

抽象类

  • abstract
  • 抽象方法的定义
    • public astract int getName();
    • 被修饰的方法不需要函数体

内部类

  • 类可以定义在方法或者代码块里的类:称为局部内部类
  • 成员内部类:定义在类里的
  • 类可以定义在任何地方
  • 访问方法
    • 1 : new 外部类().new 内部类().
    • 2 : 外部类 保存外部类的变量= new 外部类()
    • ​ 外部类点内部类 变量= 保存外部类的变量点new 内部类()
  • 内部类可以与外部类互相访问私有成员
  • 内部类可以直接访问外部类的成员
  • 外部类访问内部类成员必须创建内部类对象
  • 所有在类里对成员变量的访问都可以改为 类名.this.成员名
  • 所有修饰成员的关键字都可以修饰内部类

  • 静态内部类
  • 访问 new 外部类点内部类()

匿名内部类

  • 创建格式
    • 父类或者接口名或者不写 new 父类的类名 或者接口名(父类的构造函数接收的参数)
    • {
    • 子类要覆盖或实现的代码
    • } 加分号//因为匿名内部类相当于语句
    • 相当于创建了一个匿名的父类的子类的对象
  • 匿名内部类没有构造函数,只能使用父类的构造函数

匿名实现类

  • 创建格式
    • new 实现的接口名(调用object类的构造函数)

帮助文档的制作

  • instancrof
    • 和向下转型一起用

  • 关键字 package
  • 创建包格式
    • package 路径;
    • 编译时加 -d . 或者路径
    • 调用 java 包名点文件名
  • 类的全称是报名加类名
  • 包的命名规则
    • 域名倒着写
    • com.公司名.项目名,详细功能项目
    • 如果要使用一个类,需要用它的全名,如果有多级包名则用点分割

导包

  • 关键字 import 包名;
  • import 包下的所有类
  • 如果下通过import.* 导所有的包,必须先给此文件创建包

  • 可以用同级文件夹下的class文件

异常

  • throw

java 的权限控制

  • public 哪里都可以访问 访问权限1
  • protecrad 在不同包子类里可以访问 访问权限2
  • default 只有同一个包里可以访问(包保护) 访问权限3
  • private 只有当前类里可以访问 访问权限4

线程

  • 创建线程

    • 通过对API的查找,java已经提供了对线程这类事物德尔描述,就Thread类
    • 创建线程的第一种方法
    • 定义类继承Thread类
    • 对Thread中的Run方法进行重写
      • 目的: 讲自定义代码储存在Run方法,让线程运行
    • 调用线程的start方法
      • 作用
      • 启动线程
      • 调用run方法
    • 创建线程的第2种方法
    • 实现Runnable,并重写Run方法
    • 调用
      • 先new一个此类的对象,赋给a或其他变量
      • 在new一个匿名的Thread(把a的地址创递过去). 在调用start();
      • 格式
      • 例:
      • Dome a=new Dome();
      • new Thread(a).start();
  • start : 开启线程并执行该线程的Run方法

    • 如果直接调用了Run方法,仅仅只是对象调用了方法,而线程创建了,并没有运行
  • 每次运行结果都不同

    • 因为多个线程都在获取CPU的执行权,CPU执行到谁,谁就运行
    • 在某一时刻,只能有一个程序在执行(多核除外)
    • 因为CPU在做着快速切换,以达到看上去是同时运行的效果
    • 我们可以形象的吧多线程的运行行外在互相抢夺CPU的执行权
    • 这就是线程的特性: 随机性,谁抢到谁执行,至于执行多长,CPU说的算

为什么要覆盖Run方法?

  • Thread类用来描述线程
  • 该类就定义了一个功能,用于存储线程要运行的代码,该储存功能就是Run方法
  • 也就是说Thread类中的Run方法,用于储存线程要运行的代码

线程的几种状态

  • 被创建 运行 临时状态 冻结 消亡

  • 被创建—>通过调用start( )来—>运行—>通过sleep(time)来控制线程—>冻结—>sleep(time)时间到—>继续运行—>消亡: {stop( ) 停止},或者Run方法结束

  • 临时状态(阻塞)

    • 具备运行资格,没有执行权
    • 当有多条线程时,CPU在做着快速切换的同时,未被切换到执行的线程就处于临时状态
  • 冻结状态

    • 也就是没有执行资格,暂时放在一边不管它
    • 放弃了执行资格
    • 如果冻结时间到或者遇到notify的时候首先由冻结状态变为临时状态,也就是拥有了执行资格,执行权还未拿到
  • 或者线程运行中遇到{wait()等待}—>冻结—>{notify()唤醒 }—>运行

  • 有执行资格没有执行权是 临时(阻塞)状态

  • 有执行资格也有执行权是 运行状态
  • 没有执行资格也没有执行权是冻结状态
  • 执行资格:有执行资格还没有 执行权(运行权)
  • 执行权: 有执行资格的线程可以运行就是拿到了执行权(运行权)

线程名称

  • getName() 返回该线程的名称

  • 线程的默认名称

    • Thread-编号 该编号从0开始
  • 自定义线程名称,通过构造函数接受传递的值,

    • 格式

    • Dome a=new Dome(“线程1”);


    • class Dome
    • {
      • Dome(String name)
      • {
      • super(name);
      • }
    • }
  • 自定义线程名称2

    • setName();
  • 获取当前线程对象

    • static Thread currentThread();
  • sleep

    • thread.sleep(毫秒值);睡眠

同步代码块

  • 同步代码块
    • 那些语句在操作共享数据,就可以使用同步代码块
  • 对象如同锁,持有锁的线程可以在同步中执行
  • 没有持有锁的线程即使获取Cpu的执行权,也进不去,因为没有获取锁
  • 同步的前提

    • 必须要有两个或者两个以上的线程
    • 必须是多个线程使用同一个锁
  • 必须保证同步中只能有一个线程在运行

  • 好处:解决了多线程的安全问题
  • 弊端:多个线程需要判断锁,较为消耗资源
同步代码块格式Synchronized(对象)//同步锁{    需要被同步的代码}

同步函数

  • 把同步函数synchronize作为修饰符修饰方法

    public synchronize void run(){}
  • 同步函数用的是哪一个锁?

    • 函数需要被对象调用,那么函数都有一个所属对象引用,就是this.
    • 所有同步函数使用的锁是this

如何找问题

  • 1:明确哪些代码是多线程运行代码

  • 2:明确共享数据

  • 3:明确多线程运行代码中哪些语句是操作共享数据的

原创粉丝点击