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:明确多线程运行代码中哪些语句是操作共享数据的
- Java基础--基础语法1
- Java基础-1、基础语法
- 1-1 java基础
- java基础(1)
- Java基础学习1
- JAVA基础1
- java基础(1)
- Java 基础题1
- java基础1
- Java线程基础1
- java基础1、2
- java基础整理1
- java基础加强1
- java基础1
- Java基础1 概述
- java基础加强1
- java基础笔记1
- java 基础1
- 排座位 二分图最大匹配 搜索
- BZOJ4952 [Wf 2017] 二分答案 解题报告
- (转)理解javascript的同步与异步模式
- 11.4解题报告
- 最长无重复子串
- Java基础1
- B
- 11.4 总结
- 第八周——“对称矩阵压缩存储的实现与应用”
- OSI 七层 及相关协议
- 装饰器、迭代器、生成器
- spring:控制反转
- NIO-结合Selector设计一个简易WebServer
- 滑动条