1. 第一次开发Java前需要做的步骤
a. 下载安装JDK(8)
b. 配置环境变量
c. 测试环境变量(执行javac和java命令)
2. 开发一个java应用程序
a. 创建一个后缀名为.java的文本文件
b. 注意:文件操作后要保存!!!
c. 代码的基本框架
d. 编译java程序,产生二进制文件(字节码文件)(后缀名为.class)
e. 运行,使用java命令
f. 每次修改java源代码文件,都需要重新编译
g. main方法是Java应用程序运行的入口
3. 其他需要注意的
a. println输出并换行
b. print只输出不换行
c. 转义字符
\n换行
\t tab键的距离
\"“
\\ \
d. 注释
i. 单行注释以//开头,行尾结束
ii. 多行注释
iii. 文档注释
4. Java中的数据类型
a. 基本数据类型(8种)
i. 4种整数类型
1) byte
2) short
3) int
4) long 数字后面需要添加L
ii. 2种浮点类型(小数)
1) float(数字后面加F)
2) double
iii. 1种存储单字符的类型
1) char 值必须使用单引号引起来
iv. 1种表示真假(是否)的类型,只有两个值true和false
1) boolean
b. 引用数据类型(N种)
i. 字符串类型 String,值必须使用双引号引起来
5. 关于变量的知识点
a. 变量在使用之前是必须有值的(先赋值再使用)
b. 整数类型支持8进制和16进制
c. 小数默认为double类型
d. java中的boolean类型不支持使用0和1来表示
e. 运算的元素没有字符串那么+就是数学中的加号,有字符串参与才是连字符
f. 表达式中最大的数据类型决定了结果的数据类型
g. 表达式只要有字符串参与的运算结果总是字符串
h. 关系运算符运算结果总是boolean类型
i. String的比较不能使用==,而要使用equals方法进行比较
j. ==对于String类型来说比较的是内存的地址,equals方法比较的是String的值
k. switch语句中的变量必须是int类型或char类型,jdk7之后变量可以是String类型,switch多重选择只能做等值判断
6. 循环结构
a. while循环
b. for循环
c. do..while循环,无论初始条件如何,总会执行一次循环体
7. 数组
a.用来存储多个类型相同的数据
b.每个数据在数组中被称作元素,一个数组可以存放元素的容量称为数组的长度,
每个元素在数组中有一个唯一的索引(下标)值。索引从0开始。
c. 数组是引用数据类型
d. 数组的下标在没有赋值的情况下是有默认值的
i. int、long、short、byte类型为0
ii. double和float为0.0
iii. boolean为false
iv. String为null
e. 数组长度不可变
f. java.lang.ArrayIndexOutOfBoundsException 数组下标越界异常,当使用的数组下标
为负数或超过了最大下标时,会引起该异常
g. 可以通过数组.length获取该数组的长度
8. 类和对象
○ 面向对象是为了让代码复用
○ 要想使用类中定义的属性或方法,必须先声明类的对象(实例),通过对象来调用类中属性或方法
○ 类的对象具有类中定义的属性和方法,通过.操作符来调用
○ 类可以有多个对象
○ 属性又称为实例变量
○ 在方法内部声明的变量称为局部变量
○ 类是引用数据类型
○ 每个类的对象拥有的属性值是不同的
○ 类的属性在没有赋值的情况下是有默认值,例如String的默认值为null,int的默认值为0
○ 对象的属性初始值和类中定义的属性默认值一致
○ 方法中局部变量名称和实例变量名称相同时,默认优先使用局部变量
○ 如果方法中定义的局部变量和实例变量的名称相同,那么调用实例变量时需要通过this关键字来调用
○ 如果方法定义有参数,那么调用者必须在调用的时候给方法传入符合条件的参数
○ 符合条件:类型、数量、顺序
○ 如果方法定义有返回类型,那么方法必须返回类型相符的值
○ 一个方法同时只能返回一个值
○ 方法的返回值是为了让调用者获得返回值后进行其他的运算
○ 在一个类的内部调用其它方法,不用创建类的对象,直接调用即可
○ private访问修饰符可以修饰类的属性和方法,被private修饰的属性或方法只能在类的内部去使用
○ 引用类型之间的赋值赋的都是内存地址
○ 如果类的对象为null,不能调用该对象的任何属性或方法,如果调用将会导致
NullPointerException异常
• 构造方法
○ 构造方法是方法的一种特殊形式
○ 构造方法唯一调用方式就是在创建类的对象的时候,当前就是通过new关键字来调用
○ 构造方法名称必须和类名相同,而且大小写都得一样
○ 构造方法不能有返回值,连void都不能写
○ 当一个类没有显示声明一个构造方法时,JVM在运行时会自动创建一个没有参数
(参数列表为空)并且方法体为空的构造方法
当开发者声明了类的构造方法,那么JVM就不会在运行时自动创建构造方法
○ 当开发者声明了类的构造方法,那么JVM就不会在运行时自动创建构造方法
○ 构造方法可以有参数,如果参数是类必须的,那么就可以在构造方法的参数列表
中出现;如果参数是类可选的,那么可以考虑使用set方法
○ 构造方法可以进行方法重载
○ 在构造方法中可以调用普通方法,在普通方法中不能调用构造方法
○ 构造方法之间的调用形式通过this(参数列表)的形式来进行
○ 在构造方法中调用其他的构造方法必须是第一行代码
○ 构造方法调用其他构造方法时,不能将类的属性作为参数进行传递
• 方法的重载(overload)
○ 在同一个类中,方法的修饰符、返回类型、方法名相同,参数列表不同,这种形式叫做方法的重载
○ 参数列表不同:
○ 数量不同
○ 类型不同
○ 顺序不同
○ 普通方法和构造方法都可以进行方法的重载
• 不定项参数
○ 对于方法内部来说,不定项参数实质上还是数组
○ 不定项参数在传参时可以传入类型相同的数组
○ 传参时可以传入N个类型相同的值,N可以为0
○ 不定项参数只能在参数列表中存在一份,并且必须是最后一个参数
• 面向对象的三个特征
○ 封装
○ 继承
○ 多态
• 继承
○ 继承的目的就是代码的复用
○ 继承可以进行多层次继承
○ 子类只能有一个直接父类
○ 子类也具有间接父类的属性和方法
○ 继承具有单根性和传递性
○ 使用extends关键字来表示继承关系
○ 子类可以使用父类中的属性和方法,但是父类不能使用子类中的属性和方法
○ 在Java中当没有使用extends关键字来显示声明一个类的父类时,那么当前类的父类就是java.lang.Object类
○ 子类可以根据需要去重写(overrides)父类中的方法(子类中有个和父类方法
签名(修饰符+返回值+方法名+参数列表)相同的方法)
○ 如果发生方法重写,子类对象在调用该方法时调用的是重写后的方法。父类对象调用的是父类中的方法
○ JDK5.0后推荐在重写的方法上面添加@Override注解来表示重写方法
○ 在子类中通过super关键字来调用父类的方法和属性
○ 创建子类对象时会先创建父类对象,默认调用父类无参数的构造方法
○ 如果父类没有无参数的构造方法,那么在子类构造方法中必须要告诉子类调用父
类的哪个构造方法来创建父类对象
○ 通过super(参数列表)形式在子类构造方法中调用父类的构造方法,该代码必须是子类构造方法的第一行
• 多态
○ 父类指向子类对象时,该对象只能调用父类中定义的方法,如果该方法在子类得到了重写,那么就调用重写
后的方法;如果没有重写,那就调用父类中的方法。
该对象不能调用子类中特有的方法
○ 高内聚,低耦合
○ 当父类作为方法的参数,可以传入父类对象及其子类对象
○ 当父类作为方法的返回值,可以返回父类对象及其子类对象
○ 当父类作为方法的返回值,并且方法返回的是具体的子类对象,在调用时可以使
用父类对象接受或使用对应的子类对象接受(需强制类型转换)
• 抽象类
○ 抽象类使用关键字abstract来声明
○ 抽象类不能被实例化(不能通过new关键字来创建对象)
○ 抽象类存在的意义就是为了当父类
○ 抽象方法的原因
• 在所有子类中存在
• 所有子类对方法的实现是不同的
○ 抽象方法使用abstract来声明,不能有方法体({}都不能存在)
○ 抽象方法不能是private
○ 只有抽象类中可以存在抽象方法,含有抽象方法的类必须是抽象类
○ 当一个类继承自抽象类,必须要实现该抽象类中定义的所有抽象方法;除非这个类也是抽象类
• 接口
○ 所有的方法都是抽象方法,不允许普通方法和属性存在
○ 接口不能实例化
○ 接口使用interface关键字来声明
○ 类使用implements关键字来实现一个接口
○ 当一个类实现一个接口时,需要实现这个接口中定义的所有方法,除非该类是抽象类
○ 当接口指向实现类对象时,只能调用接口中定义的方法
○ 接口作为方法的参数,可以传入接口所有的实现类的对象
○ 接口作为方法的返回类型,可以返回接口所有实现类的对象
○ 一个类只能有一个父类,但是可以同时实现多个接口
○ 类不能多继承,但是接口可以多继承
• 包
○ 包的作用
• 分类
• 防止命名冲突
○ 包名推荐使用所在公司或组织的域名倒置,例如Google的包名为com.google.xxx
○ 包名应该是全小写的,不能使用.开头或结尾
○ 包名的命名习惯 com.kaishengit.功能 或者 com.kaishengit.模块.功能
○ 使用package关键字来声明类所在的包
○ 使用不在同一个包中的类
• 导入
• 使用类的完全限定名(包名+类名)
○ 所有的类会默认导入java.lang包中的所有类和接口
• 常量
○ 一旦获得初始值后值不能改变的变量叫做常量○ 常量使用final修饰符来表示
○ 常量的名称为全大写
○ 接口中可以存在常量
○ 方法的参数可以是常量,表示方法调用者传入的参数值在方法内部不能修改
○ final关键字的更多用途
• 修饰变量,变量成为常量
• 修饰方法,方法不能被子类重写
• 修饰类,类不能被继承
• 静态
○ 静态方法使用关键字static来修饰
○ 如果方法的运行不依赖类的实例变量(属性),那么就可以将该方法写成静态方法
○ 静态方法的调用使用类来进行,格式为类名.方法名(参数列表)
○ 可以使用类的对象来调用静态方法,但是该形式不推荐使用
○ 静态方法中不能调用属性;静态方法中不能去调用非静态方法;非静态方法中可以调用静态方法
○ 使用static来修饰的实例变量称为静态变量
○ 静态变量使用类直接调用,格式为类名.静态变量
○ 静态变量也可以使用类的对象来调用,但是该形式不推荐
○ 实例变量每个类的对象一份,但是静态变量整个只有一份(所有对象共享这个值)
○ 静态方法中可以调用静态变量;非静态方法也可以调用静态变量
○ 如果一段代码对应整个类只调用一次,那么这段代码可以写在静态代码块中
○ 静态代码块中的程序会在第一次使用这个类之前自动执行,而且只执行一次
○ 静态代码块中可以调用静态变量和静态方法,不能调用实例变量和非静态方法
○ 常量一般写成静态的形式
• 单例模式
○ 设计模式的一种,为了限制类的对象只有一份
○ 实现单例模式
• 构造方法私有化
• 提供一个公有的静态方法用于获取当前类的实例
○ 写法1(饿汉式):
○ 写法2(懒汉式):
• 包装类(封装类)
○ 解决基本数据类型和字符串之间相互转换的问题
○ 包装类
• int ->Integer
• float -> Float
• long -> Long
• double -> Double
• short -> Short
• byte -> Byte
• boolean -> Boolean
• char -> Character
○ Integer为例
• int转换为Integer的方法
□ Integer in = new Integer(int类型参数);
□ 自动装箱 Integer in = 12;
• String类型转换为Integer的方法
□ Integer in = new Integer(String类型参数);
• Integer转换为int的方法
□ intValue()方法
□ 自动拆箱
• Integer转换为String的方法
□ toString()方法
• String直接转换为int的方法
□ parseInt()方法
○ 包装类值的比较使用equals方法
• Object类
○ 是Java中所有类的根类
○ 在System.out.println中输出一个对象,默认会调用该对象的toString方法
○ 自定义的类使用equals默认比较的依然是内存地址
○ 使用instanceof关键字判断一个对象是否是一个类的对象
• String
○ String类型在字符串改变、和字符串连加时性能差
○ StringBuffer和StringBuilder连加性能极高
○ StringBuffer是线程安全的类,StringBuilder非线程安全
○ 正则表达式 http://deerchao.net/tutorials/regex/regex.htm
• 集合框架
○ Java中集合框架的两个大分支,分别为Collection和Map都来自java.util包
○ Collection接口中常用的子接口为List和Set
○ List接口有序,可以通过下标(索引)来精确控制元素的插入位置以及获取元素
○ List接口允许重复元素
○ ArrayList是List接口的数组大小可变的实现类,允许null元素的存在
○ ArrayList是一个非线程安全类
○ Vector类是线程安全的List接口的实现类
○ LinkedList类是List接口的链表实现
○ 基本数据类型在泛型中使用的是对应的包装类
○ Set接口不允许重复元素
○ HashSet类是Set接口的实现类,该类存放的元素是无序的,允许null元素的存在
○ HaseSet不是线程安全的类
○ TreeSet类是Set接口有序的实现
○ Map在Java中表示一个键值对的映射集合,常用的实现类有HashMap和HashTable
○ 在Map中键值不能重复,但是值可以重复
○ HashMap类是Map接口的实现类,允许null键和null值,无序,非线程安全类
○ HashTable类是Map接口的实现类,线程安全类
后续持续更新~
一个学习Java的小白