8种基本的数据类型
数据类型名 | 长度 | 范围 | 默认值 |
---|---|---|---|
byte | 1 byte(8个二进制位) | -158~127 | 0 |
short | 2 byte | -32768~32767 | 0 |
int | 4 byte | -2,147,483,648~2,147,483,647 | 0 |
long | 8 byte | 0 | |
float | 4 byte | 2^128 | 0.0f |
double | 8 byte | 2^1024 | 0.0d |
char | 2 byte | ‘\u0000’ | |
boolean | 1 byte | false |
char
计算机是无法表示字符的
人们就是发明了一种字符和数字的对应关系
65 -> A
66 -> B
97 -> a
从而形成一种编码,最早的编码就是 ASCII 编码
因为 ASCII 编码存放不了中文,就出现了 GBK,GB2312,UTF-8 等编码,能够存放中文,以及阿拉伯文等世界上的各种语言
+ , - , * , / , % , ++ , –
i++;
++i;
当单独使用的时候,++i,i++:都等同于 i=i+1
当组合使用的时候:
int i=12;
int c=i++;
首先执行赋值操作,将 i 的值赋值给 c ,然后执行 i++
c:12
int i=12;
int c=++i;
首先执行 ++ 操作,然后执行赋值操作
c:13
资料 |
---|
Java基础语法(讲课笔记).pdf |
第四章 程序入门之复杂选择结构.pptx |
第五章 程序入门之循环结构(一).pptx |
for 循环
for(int i=0;i<10;i++){
循环体;
}
i:循环变量
i++:迭代条件
i 的作用:控制循环体执行的次数
while 循环
do…while 循环
for…each 循环(处理数组的)
方法介绍
System.out.println("字符串"); // 能够输出一个字符串的值在控制台上
int n=random.nextInt(10); // 能够产生一个 10 以内的随机数,还能将这个随机数返回给 n 变量
// 这也是一个方法==函数
// 这个方法是系统的默认方法,当程序运行的时候自动的会去调用这个方法
public static void main(String[] args){
}
方法定义
修饰符( public static ) 返回类型(void,int...) 方法名(参数){
方法体;
}
方法调用
方法的参数
方法的返回值
递归调用
声明数组
int[] a;
分配空间
a=new int[10]; // 占 40 byte
向数组的元素赋值
a[0]=100;
a[1]=200;
对数组中的元素做一些操作
a[0]=a[0]%10;
数组中的常用定义方法
变量名[] 数组名=new 变量名[数组的长度];
int[] arr=new int[10];
int[] arr=new int[]{1,2,3,4,5};
int[] arr={1,2,3,4,5};
String[] menus={
"1.用户管理",
"2.产品管理",
"3.订单管理"
};
int[] arr2;
arr2=new int[5];
遍历
使用循环将数组的每个元素都访问一次
增强 for 循环:for…each
for(数组的类型 临时变量名 : 数组名){
操作临时变量名;
}
求最值
插入(在一个已经有序的数组中插入一个元素,仍然保持数组的有序性)
删除
查找
排序
资料 |
---|
八大排序算法 |
数据结构与算法分析 Java语言描述(原书第3版) |
附录:排序算法 |
Java数组3 |
二维数组
二维数组的定义
int[][] arr=new int[5][6];
第一个中括号表示的是行
第二个中括号表示的是列
数组的默认值:0
静态定义二维数组
int[][] arr=new int[][]{
{1},
{1,2},
{1,2,3},
{1,2,3,4},
{1,2,3,4,5}
};
int[][] arr=new int[5][];
System.out.println(arr.length); // 5
// 这种定义是非法的
int[][] arr=new int[][5];
System.out.println(arr.length); // 前面编译错误
资料 |
---|
oop.doc |
类和对象.ppt |
构造函数(方法)(重点)Constructor
引用类型
基本的数据类型:都是在栈中分配的内存
int a;
double b;
对象类型:在堆中会分配一个空间,然后用栈中的变量去指向
所有的对象类型都是引用类型
Student st=new Student();
方法的重载( overload )
对象数组
// 将多个对象放入到数组中,目的是为了方便操作(遍历,搜索,排序,查找)
Student[] arr=new Student[5];
注意点
重载 overload
在类中定义方法的时候,需要定义多个同名的方法,参数不同
参数不同:
参数的类型不同
参数的顺序不同
参数的个数不同
当我们编写代码的时候,发现很多方法功能类似但是参数不一致,这时候就可以使用重载了
重载:实现了一种多态的效果(是一种静态的多态)
注意:返回类型不构成重载的必要条件(下面两个构成重载)
public void cook(Chicken chicken){
}
public int cook(Water water){
}
封装
面向对象编程有三个重要的特征:
封装:将一些属性,行为包在一个类中,形成了一种封装
class Temp{
属性
构造方法
方法
}
public void sendEmail(Message message){
}
Message{
发送者,接收者,消息标题,消息的正文,发送时间,发送的 ip 地址
}
封装的第二个层次:封装可以实现消息的隐藏和保护
数据类型 | 初始值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0F |
double | 0.0D |
boolean | false |
char | ‘’ |
String | null |
资料 |
---|
Java面向对象之继承…pdf |
资料 |
---|
Java 之23种设计模式解析.pdf |
大话设计模式(带目录完整版).pdf |
深入浅出设计模式(中文版).pdf |
盛#男.exe |
第6章_面向对象编程(下).pptx |
阿里巴巴Java开发手册终极版v1.3.0.pdf |
private、默认、protected、public
修饰符 | 类的内部 | 类的外部(同包) | 包外子类 | 类的外部(不同包) |
---|---|---|---|---|
private | √ | × | × | × |
default | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
方法(类方法)
public static void show(){}
当我们不需要使用对象来调用的时候就用静态方法
一些工具类会使用静态方法,例如 Math 类中的所有方法都是静态的
静态方法通过类名调用,不需要使用对象去调用
static 的方法中没有 this,也没有 super
static 的方法只能访问静态的成员
public static void main(String[] args){
}
为什么 main 需要写成静态的
main 方法是由主线程来调用的,此刻并没有产生任何的 Java 对象,不通过对象调用方法就只能是静态的
String[] args:表示是命令行参数,有程序启动的时候来传递
属性(类属性)
该属性是对这个类的所有对象共享的,只能通过类去访问,目的是为了多个对象共享同一个数据
静态成员不需要对象可以访问(可以使用对象访问,. 的时候不会提示出来,
但是可以使用 对象.属性 强行调用(静态方法同理),只不过会有警告)
使用案例:
1.在线人数
2.统计总人数
静态代码段(块)
用于做一些类的初始化工作
static{
// Java 代码
}
内部类
// 懒汉式(存在线程安全问题)
public class Monitor {
private static Monitor instance;
private Monitor(){}
public static Monitor getInstance(){
if(instance==null) instance=new Monitor();
return instance;
}
}
// 饿汉式
public class Monitor {
private static Monitor instance=new Monitor();
private Monitor(){}
public static Monitor getInstance(){
return instance;
}
}
修饰属性:最终属性,不能被修改,常量
常量是不能被修改的量,所以一般会定义为静态的
命名一般为大写
static final
修饰方法:最终方法,不能被重写的方法
修饰类:最终类,不可以被继承
final class A{}
class B extends A{} // 报错
String,Math都是最终类
package:作用就是为了整理代码
一个包就是一个文件夹
com.xc.dao.User.java
com
xc
dao
打包
package com.xc.dao; // 位于代码的第一行
导入包:当你要使用的类和你不在一个包下的时候,就需要导入
import 包名.类名;
import 包名.*;
包的命名
公司域名的反写,小写字母
www.chinaedu.com
com.chinaedu.taobao.dao
public abstract void show();
含有抽象方法的类就是抽象类(抽象类中不一定含有抽象方法,但是有抽象方法的类一定是抽象类)public abstract class TimeTemplate{
// 防止子类修改
public final long getTime(){
// 获取系统的当前时间
long begin=System.currentTimeMillis();
code();
long end=System.currentTimeMillis();
System.out.println("用时:"+(end-begin)+"ms");
return end-begin;
}
public abstract void code();
}
public interface 接口名{
void show();
void hide();
}
public class Outer{
int i=10;
/**
*内部类
*/
class Inner{
int i=20;
public void show(){
int i=30;
System.out.println(i); // 30
System.out.println(this.i); // 20
// 此 Outer 是外部类的类名
System.out.println(Outer.this.i); // 10
}
}
}
如何生成对象:/**
*在别的类生成
*其中main 方法中也需要这样,是因为 main 方法是静态的,
*看不到非静态的内部类,如果内部类是静态的就可以看到
*/
public void creatInner(){
Outer outer=new Outer();
// 创建里面的对象
Inner inner=outer.new Inner();
// 或者一步到位
Inner inner=new Outer().new Inner();
}
/**
*在外部类的方法中生成
*/
public void creatInner(){
Inner inner=new Inner();
}
public class Outer{
public void sayHello(){
/**
*方法中的内部类
*/
class Inner{
int i=10;
public void show(){
System.out.println(this.i);
}
}
Inner inner=new Inner();
inner.show();
}
public static void main(String[] args){
Outer outer=new Outer();
outer.sayHello();
}
}
btn.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
System.out.println("点击");
}
});
用在事件处理方面使用比较广泛
new 接口(){
接口的方法(){
}
}
本质上是在 new 一个类的对象,只是这个类是没有名字的
Object 类
public class Object{
// 判断是否相等
public boolean equals(Object obj) { return ( this == obj); }
// 用于克隆对象
protected native Object clone() throws CloneNotSupportedException;
// 用于输出的
public String toString(){
return getClass().getName()+"@"+Integer.toHexString(hashCode());
}
// 多线程以后才会使用的方法
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long temeout,int nanos) throws InterruptedException{
// 代码
}
public final void wait() throws InterruptedException{
wait(0);
}
// 用来在垃圾收集之前执行的代码
protected void finalize() throws Throwable {}
}
重点方法
equals()
用来判断两个对象是否相等:
基本数据类型的比较可以使用 == 来判断
对象的比较使用 == 根本比较不出来,比较的结果永远是 false
两个对象如果需要比较,用 equals 来比较
如果我们依然使用祖宗的 equals 方法,那么得到的结论依然是错误的
如果真的需要比较两个对象是否相等,我们需要将祖宗的方法进行重写
toString()
该方法用于描述一个对象
System.out.println(student);
打印一个对象的时候,调用这个对象的 toString() 方法
clone()
@Override
protected Object clone() throws CloneNotSupportedException{
// 克隆第一级
Car car=(Car) super.clone();
// 克隆第二级
Girl girl=(Girl) car.girl.clone();
// 将新克隆的对象赋值
car.girl=gril;
return car;
}
单元测试
异常 | 说明 |
---|---|
Execption | 异常层次结构的根类 |
RuntimeException | 许多 java.lang 异常的基类 |
ArithmeticException | 算数异常,如:除数为0 |
IllegalArgumentException | 方法接收到非法参数 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
NullPointerException | 访问空引用 |
ClassNotFoundException | 不能加载所需的类 |
NumberFormatException | 字符串转换数字失败 |
IOException | I/O 异常的根类 |
FileNotFoundException | 找不到文件 |
EOFException | 文件结束 |
单词 | 说明 |
---|---|
try | 监视,考验,审问 |
catch | 捕捉,捕获 |
finally | 最后,终于,不可更改地 |
throw | 抛出,扔 |
throws | 抛出,扔 |
/**
* 把可能发生异常的代码放在 try 部分,当发生异常以后,
* 会触发 catch 部 分
*/
try{
}catch(异常对象){
}
/**
* 当 try 语句中如果发生多种类型的异常,我们在捕获的时候
* 为了精准的显示错误信息,所以会出现多个 catch 部分
*
* 放多个 catch 的时候不要将父类、高级别的异常类放在上面的位置
*/
try{
}catch{
}catch{
}
/**
* finally:最终部分,不论前面发生了什么,finally 部分的
* 代码都会执行(只要进入了 try,除非 System.exit(0),
* 否则都不能阻止 finally 的执行,不考虑 try 前被
* return 了)
*
* 应用场景:
* 1.一般用于资源的释放
* 2.数据库的连接
* 3.文件的句柄
* 4.窗口的句柄
*/
try{
}finally{
}
try{
}catch(){
}finally{
}