此笔记学习于慕课网:Java入门第一季-第三季,想学的可以点击链接进行学习,笔记仅为私人收藏

建议学习时间:2-3天(极速版)

数据类型

  • 基本数据类型存的是数据本身

  • 引用类型变量(class、interface、数组)存的是数据的空间地址

自动类型转换

  • 目标类型能与源类型兼容
  • 目标类型大于源类型

强制类型转换

  • 丢失数据(不 四舍五入)

常量

  • 语法:final 常量名 = 值;
  • 一般大写

注释

/**
* 这是文档注释
* @author laorenyang
* @version v1.0
*/ /*
* 这是多行注释
* aaa
* bbb
*/ //这是单行注释

怎么生成API文档

  • 我们可以通过javadoc命令从文档注释中提取内容,生成程序的API帮助文档
  • 使用javadoc标记

运算符

  • 比较运算符:比较后的值是布尔值
  • 逻辑运算符
  • 条件运算符 ?: String str = (8>5) ? "8>5" : "8 <= 5"

Scanner类 java.util

数组

  • 声明数组
int[] scores;
int height[];
  • (不规则数组)
int[][] num=new int[3][];
num[0] = new int[3];
num[1] = new int[2];
num[2] = new int[1];
  • 分配空间

scores = new int[5];

int[] scores = new int[5]

int[] scores = {1, 2};
int[] scores = new int[]{1, 2};
  • 长度

数组名.length

Arrays类 java.util 操作数组

  • Arrays.sort();
  • Arrays.toString();

foreach :for的简版

for(int num:nums) {
System.out.println(num);
}

方法(method)

  • 使用类中的方法
  • 方法的重载 一个类中有多个方法名相同的方法
  • 判断方法重载的依据:
  1. 必须是在同一个类中
  2. 方法名相同
  3. 方法参数的个数、顺序或类型不同
  4. 与方法的修饰符或返回值没有关系

随机数 Math.random()

0-1浮点数

  • 模板 抽象信息 描述
  • 类 对象的类型,一个模子
  • 一个类可以对应多个对象

对象

具体的信息

  • 对象的属性:对象有什么 特征
  • 对象的方法:对象执行的操作

定义类

  • 类的组成:属性和方法
  1. 定义一个类
  2. 属性(有什么)
  3. 方法(干什么)

对象

  1. 创建一个对象 : 对一个类进行实例化 new Telphone() (new + 构造方法())
  2. 使用对象: 引用对象的属性:对象名.属性;引用对象的方法:对象名.方法名()

属性(实例变量)

  • float型变量赋值时需加f,否则默认浮点数是double型

成员变量和局部变量

成员变量

  • 在类中定义
  • 被本类的方法,及其他跟本类相关的类中的方法使用

局部变量

在方法中定义

区别

  • 初始值不同:成员变量有默认的初始值,局部变量没有
  • 两类变量同名时,局部变量具有更高的优先级(就近原则)

构造方法

无返回类型 (不写)

  • 构造方法的重载
  • 构造方法不但可以给对象的属性赋值,还可以保证给对象的属性赋一个合理的值

static 静态

静态变量

  • 该类所有对象所共享,属于整个类(所以在系统第一次使用该类时,就会为其分配内存空间直至该类被卸载,才进行资源回收)
  • 可用类名来进行访问(或者对象名,推荐前者)
  • 修饰变量、方法、代码块

静态方法

  • 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员
  • 可以通过在方法里面 创建类的对象,然后通过对象来访问非静态变量,形式:hello.name
  • 在普通方法中两者皆可直接调用
  • 同理,静态方法中不能直接调用非静态方法,可以通过对象来访问非静态方法,形式:hello.show()

静态内部类

  1. 静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问
  2. 如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员
  3. 创建静态内部类对象时,不需要外部类的对象,可以直接创建内部类 对象名= new 内部类();

静态初始化块

  • 静态初始化块只在类加载时执行一次,且只能给静态变量赋值

初始化执行顺序

  • 静态初始化块 -> 初始化块 -> 构造方法

面向对象

三大特性

  • 封装 继承 多态

封装

  • 修改属性的可见性:设为private
  • 创建getter/setter方法:用于属性的读写
  • 在getter/setter方法中加入属性控制语句:对属性值的合法性进行判断

  • 全小写
  • protected 子类也可以用

this关键字

  • 代表当前对象
  • 当前对象的属性、方法
  • 封装对象属性时可用

内部类

  • 内部类( Inner Class )就是定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。
  • 内部类的主要作用如下:
  1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,[不允许同一个包中的其他类访问该类???(那怎么可以用public修饰)]
  2. 内部类的方法可以直接访问外部类的所有数据,包括私有的数据
  3. 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便
成员内部类
  • 使用外部类对象创建内部类对象 Inner i = o.new Inner();
  • 成员内部类的 .class 文件总是这样:外部类名$内部类名.class
  • 外部类是不能直接使用内部类的成员和方法滴
  • 可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法。
  • 如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用 this 关键字。这个外部类的对象的成员变量 Outer.this.name (静态内部类不用写this)
静态内部类
  • static修饰
方法内部类
  • 内部类定义在外部类的方法中
  • 由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符
  • 调用方法内部类的办法是:在所在的外部类方法里调用,在其他类调用该内部类方法时调用所在外部类方法即可

继承

  • 类与类的一种关系 is a 的关系
  • 一个类只有一个父类
  • 子类不能继承父类中private属性的东西

方法的重写

  • 返回值类型、方法名、参数类型及个数要一致

继承的初始化顺序

  • 初始化父类再初始化子类(构造方法)
  • 先执行初始化对象中属性,再执行构造方法的初始化

final

  • 最终的
  • 修饰类、方法、属性和变量
  • 修饰类,该类不允许被继承
  • 修饰方法,该方法不允许被覆盖(重写)
  • 修饰属性,该属性不会默认进行初始化,属性值被赋一次后不能变化,只能在一开始或者构造函数里进行人工的初始化。
  • 修饰变量,变量的值只能赋一次值,即声明的时候赋值,常量

属性与变量的区别?

super

  • 在对象的内部使用,可以代表父类对象

  • 调用父类的属性:super.age

  • 调用父类的方法:super.eat()

  • 子类的构造的过程当中必须调用其父类的构造方法,会有隐式的写有

  • 如果子类的构造方法没有显示调用父类的构造方法,则系统默认调用父类无参的构造方法

  • 如果显示的调用构造方法,必须在子类的构造方法的第一行

  • 如果子类构造方法中既没有显式的调用父类的构造方法,而父类又没有无参的构造方法,则编译出错!

Object类

  • 所有类的父类

toString()方法

  • 返回对象的哈希code码(对象地址字符串)
  • 可重写

equals()方法

  • 比较的是对象的引用是够指向同一块内存地址 Dog dog = new Dog()
  • 一般我们想比较的是两个对象的值是否一致,可重写
  • == 判断数据值是否相同,若判断引用值是否相同则也是比较地址值
  • 类对象obj.getClass()与类的对象obj,前者关注例如姓名年龄,后者关注阿宝20岁

多态

  • 对象具有多种形态
  • 继承是多态的实现基础

引用多态

  • 引用的指向:可以是本类,也可以是子类
  • 父类的引用可以指向本类或子类的对象

方法多态

  • 调用的方法:可以是本类,也可以是本类重写父类的方法或者是继承的方法

引用类型转换

  • 小类型到大类型的转换(自动类型)
  • 大类型到小类型的转换(强制类型)

强制类型转换

  • instanceof运算符:避免类型转换的安全性问题

抽象类

  • 用abstract修饰

  • 限制规定子类实现某些方法,但不关注里面的内容

  • abstract定义抽象类 或 抽象方法

  • 包含抽象方法的类必须是抽象类

  • 抽象类中可以有或者没有抽象方法

  • 抽象类不能直接创建,可以定义引用变量??

  • 抽象方法没有{},直接以;结束

接口

  • 特殊的类,由全局常量(public static final)和公共的抽象方法(public avstract)所组成
  • 定义了类所需要遵守的规范
  • 定义接口:使用interface关键字(不是class)
  • 接口的修饰符推荐是public
  • 接口可继承多个父接口

使用接口

  • implements

  • 一个类可以实现多个接口

  • 继承父类要在实现接口之前,即:extends 父类 implements 接口1,接口2...

  • 接口名 I打头

  • 接口的引用可以使用实现接口功能的类

  • 可以与匿名内部类配合使用

使用匿名内部类来实现接口

  • 没有名字的内部类
Interface i = new Interface(){
public void method(){
System.out.println("匿名内部类实现接口的方式");
}
};

UML简介

  • Unified Modeling Language 统一建模语言
  • 模型化软件开发的图形语言

常用UML图

用例图

  • 描述系统中出现的角色需要什么功能 角色与系统的功能联系起来

序列图(the seque diagram)

角色和计算机内存中对象的关系,及顺序怎样

类图(The Class Diagram)

业务逻辑和结构性的信息

类和类的关系,及里面的属性

    • 私有 + 共有
  • 数据模型分析

  • 业务模型分析

  • 显示和流程分析

异常与异常处理

处理异常

  • try-catch
  • try-catch-finally
try {
//代码
}catch(InputMismatchException e){
//处理 }catch(ArithmeticException e){
//处理 }
}finally{
//最终将要执行的一些代码,在catch块return之后执行
}

多重catch块注意事项

  • 顺序问题:从小到大, 子类到父类
  • 就近匹配

异常抛出及自定义异常

  • throw 将产生的异常抛出(方法体内,动作)
  • throws 方法名和参数之后,声明要抛出何种类型的异常(声明)

自定义异常

class 自定义异常类 extends 异常类型{

}

异常链

例:一个异常包装另一个抛出的异常后再抛出

经验总结

  • 在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常
  • 处理潜在的异常
  • 尽量去处理异常,而不是仅仅打印异常(printStackTrace())
  • 尽量添加finally语句块去释放占用的资源,尤其是有网络连接,和连接数据库的情况下

字符串

  • 一旦一个字符串在内存中创建,则这个字符串将不可改变。如果需要一个可以改变的字符串,我们可以使用StringBuffer或者StringBuilder(后面章节中会讲到)

  • 每次 new 一个字符串就是产生一个新的对象,即便两个字符串的内容相同,使用 ”==” 比较时也为 ”false”

String s1 = new String("imooc");
String s2 = new String("imooc");
  • imooc为常量字符串,多次出现时会被编译器优化,只创建一个对象
String s1 = "imooc";
String s2 = "imooc";
  • s1是变量,s4在运行时才知道具体值,所以s3和s4是不同的对象
public class HelloWorld {
public static void main(String[] args) {
String s1 = "imooc";
String s2 = "imooc"; //定义字符串s3,保存“I love”和s1拼接后的内容
String s3 = "I love" + s1; // 比较字符串s1和s2
// imooc为常量字符串,多次出现时会被编译器优化,只创建一个对象
System.out.println("s1和s2内存地址相同吗?" + (s1 == s2)); //比较字符串s1和s3
System.out.println("s1和s3内存地址相同吗?" + (s1 == s3)); String s4 = "I love" + s1;
//比较字符串s4和s3
// s1是变量,s4在运行时才知道具体值,所以s3和s4是不同的对象
System.out.println("s3和s4内存地址相同吗?" + (s4 == s3));
}
}

String类 - 常用方法

  • length()
  • indexof("") indexof('')
  • substring(3, 7)
  • split(" ")
  • 使用 substring(beginIndex , endIndex) 进行字符串截取时,包括 beginIndex 位置的字符,不包括 endIndex 位置的字符

StringBuffer 与 StringBuilder(值可变的字符串存储)

  • StringBuffer 是线程安全的,而 StringBuilder 则没有实现线程安全功能,所以性能略高。因此一般情况下,如果需要创建一个内容可变的字符串对象,应优先考虑使用 StringBuilder 类。
  • append
  • insert
  • toString

常用类

包装类

  • 让基本类型也具备对象的特性
  • 包装类主要提供了两大类方法:
  1. 将本类型和其他基本类型进行转换的方法
  2. 将字符串和本类型及包装类互相转换的方法

转换

  1. 装箱与拆箱
  • parseInteger intValue
  1. 字符串与其他
  • String.valueOf、toString、parseXXX、XXX.valueOf()、+ ""

时间

表示时间 Date 和 SimpleDateFormat 类

Date
  • java.util 包中的 Date 类:获取当前时间
  • 使用 Date 类的默认无参构造方法创建出的对象就代表当前时间
SimpleDateFormat
  • java.text 包中的 SimpleDateFormat类 :对日期时间进行格式化,如可以将日期转换为指定格式的文本,也可将文本转换为日期。
  • 相当于在Date对象外包装一层格式
  • 代码中的 “yyyy-MM-dd HH:mm:ss” 为预定义字符串, yyyy 表示四位年, MM 表示两位月份, dd 表示两位日期, HH 表示小时(使用24小时制), mm 表示分钟, ss 表示秒
  1. 使用 format() 方法将日期转换为指定格式的文本
  2. 使用 parse() 方法将文本转换为日期: Date date = sdf.parse(day);
  • df.format()成字符串 df.parse()成Date
注意事项
  • 调用 SimpleDateFormat 对象的 parse() 方法时可能会出现转换异常,即 ParseException ,因此需要进行异常处理
  • 使用 Date 类时需要导入 java.util 包,使用 SimpleDateFormat 时需要导入 java.text 包

处理时间 - Calendar 类

  • java.util.Calendar 类 抽象类
  • 可以通过调用 getInstance() 静态方法获取一个 Calendar 对象,此对象已由当前日期时间初始化,即默认代表当前时间,如 Calendar c = Calendar.getInstance();
  • 通过调用get() 方法获取日期时间信息,参数为需要获得的字段的值, Calendar.Year 等为 Calendar 类中定义的静态常量。
  • Calendar 类提供了getTime() 方法,用来获取 Date 对象,完成 Calendar 和 Date 的转换,还可通过 getTimeInMillis() 方法,获取此 Calendar 的时间值,以毫秒为单位。

使用 Math 类操作数据

  • java.lang 包
  • Math 类的所有方法都是静态方法
  • round() random() floor() ceil()

集合框架

Collection

  • 是List、Set和Queue接口的父接口

List接口及其实现类 - ArrayList

  • 有序可重复 序列
  • 数组序列:ArrayList 底层由数组实现
  • 对象存入集合都变成Object类型,取出需要类型转换
增删改查
  • add addAll get set remove removeAll
  • Arrays.asList()

迭代器接口

  • Iterator it = coursesToSelect.iterator();
  • 依赖于某个集合存在

泛型

  • 规定了某个集合只可以存放特点类型的对象,会在编译期间进行类型检查
   public List<Course> courses;

   public TestGneric(){
this.courses = new ArrayList<Course>();
}
  • 泛型集合:泛型类型 泛型子类型
  • 泛型集合中的限定类型不能使用基本数据类型

Set接口及其实现类——HashSet

  • 元素无序且不重复(重复也会变为第一个),被称为集
  • 没有set()方法,因为它是无序的,找不到索引
  • 遍历Set中的元素只能用foreach或iterator方法,用不了get()方法
  • 可以add(null)

Map和HashMap

  • 映射关系,元素以键值对(key-value)的形式存储
  • 键值对Entry类型的对象实例形式存在
  • key值不可重复,value值可以
  • 支持泛型 Map<K, V>

增删

  • put putAll
  • remove

返回

  • keySet() 返回key值的集合
  • values() 返回value值的集合
  • entrySet() 返回映射关系的集合

HashMap

  • 基于哈希表实现
  • 其中的Entry对象是无序排列的
  • Key值和value值都可以为null,但是一个HashMap只能有一个key值为null的映射(key值不可重复)

Collection List Set

  • contains(需要重写equals方法)

  • containsAll

  • set:hashCode + equals()

  • 索引位置:indexOf lastIndexOf

Map

  • containsKey() containsValue()

Collections 工具类

  • sort() 排序

Comparable 与 Comparator

  • Comparable 默认比较规则
  • Comparator 临时比较规则

Comparable接口 可比较的

  • 实现该接口的类:实例可比较大小,可进行自然排序(默认的比较规则)
  • 需实现compare To()方法 + - ==

Comparator接口 比较工具接口

  • 定义临时比较规则
  • 其实现类需要实现compare()方法
  • 可将其传递给Collection sort方法

Java集合框架

  • Collection接口 | Collections工具箱
  • Map接口 | Comparator接口
  • Comparable接口

字符串的比较与整数的比较不同 如 1000 与 233

综合练习- 洗牌发牌小程序

功能描述

1. 创建一副扑克牌:

  • 包括四种花色(黑桃、红桃、梅花、方片)
  • 十三种点数:2-10,J、Q、K、A,不考虑大小王

2. 创建两名玩家

  • 玩家至少要有ID、姓名、手牌等属性,手牌为扑克牌的集合

3. 洗牌

  • 将之前创建的“一副扑克牌”打乱顺序

4. 发牌

  • 将洗牌之后的扑克牌集合,从第一张开始,发给两名玩家,按照一人一张的方式,每人发两张

5. 游戏

  • 比较两名玩家手中的扑克牌,规则为:取两人各自手中点数最大的牌进行比较,点数大的赢;若两人各自的点数最大的牌相等,

初步设想

  1. 创建一个player类设置玩家信息,其中手牌套用ArrayList类,手牌间比大小的方法重写Comprable接口中的compare to()方法
  2. 创建一个poker类设置单张扑克牌信息,其中含有属性:String类的花色和String类的数值
  3. 一副扑克牌用Set定义(HashSet)
  4. 打乱顺序:直接利用Set是无序的这个特点来做,每次取出的元素都是不定的

【私人向】Java复习笔记的更多相关文章

  1. java复习笔记

    本笔记(无异常处理与网络编程部分)整理自<java程序设计>-黄岚 王岩 王康平 编著 java数据     UI     I/O      java线程      数据库操作 Java数 ...

  2. JAVA复习笔记分布式篇:zookeeper

        前言:终于到分布式篇,前面把JAVA的一些核心知识复习了一遍,也是一个JAVA程序员最基本要掌握的知识点,接下来分布式的知识点算是互联网行业的JAVA程序员必备的技能:     概念:ZooK ...

  3. Java复习笔记--java中this 关键字

    Java中this关键字,this可以调用类的成员变量和成员方法,this还可以调用类中的构造方法.使用这种方式值得注意的是, 只可以在无参构造方法中的第一句使用this关键字调用有参构造方法. pu ...

  4. 【Java】Java复习笔记-第四部分

    反射 反射: 在运行时动态分析或使用一个类进行工作. java.lang.Class类:描述类信息的类. 类对象:描述一个类信息的对象,当虚拟机加载类的时候,就会创建这个类的类对象并加载该对象,Cla ...

  5. 【Java】Java复习笔记-三大排序算法,堆栈队列,生成无重复的随机数列

    冒泡排序 package com.lcw.bubble; public class BubbleSort { /** * 冒泡排序 * @param args * @author 成鹏致远 */ pu ...

  6. 【Java】Java复习笔记-第三部分

    修饰符abstract 抽象的,定义框架不去实现,可以修饰类和方法 abstract修饰类: 会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型,也就是编译时类型 抽象类 ...

  7. 【Java】Java复习笔记-第二部分

    类和对象 类:主观抽象,是对象的模板,可以实例化对象 习惯上类的定义格式: package xxx; import xxx; public class Xxxx { 属性 ······; 构造器 ·· ...

  8. 【Java】Java复习笔记-第一部分

    配置java环境变量 JAVA_HOME:配置JDK的目录 CLASSPATH:指定到哪里去找运行时需要用到的类代码(字节码) PATH:指定可执行程序的位置 LINUX系统 (在" .ba ...

  9. JAVA复习笔记分布式篇:kafka

    前言:第一次使用消息队列是在实在前年的时候,那时候还不了解kafka,用的是阿里的rocket_mq,当时觉得挺好用的,后来听原阿里的同事说rocket_mq是他们看来kafka的源码后自己开发了一套 ...

随机推荐

  1. procedure of intall and setup centos 6.5

    select webserver install option,and select ,uncheck the postgresql option selected some “… platform” ...

  2. Access用OleDbParameter无法更新数据解决方案

    昨天遇到了一个非常郁闷的问题,这个问题我几乎花了一天的时间才找到了造成问题的症结并解决. 问题是这样,原本一个使用Sqlserver数 据库的系统,我要让它实现Access数据接口,即我可以很方便地把 ...

  3. memcached的操作

    memcached是一个高性能的分布式内存对象缓存系统,用于动态web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库次数,从而提高动态.数据库驱动网站的速度.memcached基于 ...

  4. ipconfig命令一览

    前文用到了ipconfig /displaydns和ipconfig /flushdns,加上之前经常ipconfig查ip,今天看了一下别的命令,用的不多,仅作备忘~~ 命令行窗口中输入ipconf ...

  5. Python新式类和经典类的区别

    @Python新式类和经典类的区别 class ClassicClass(): pass class NewStyleClass(object): pass x1 = ClassicClass() x ...

  6. Why Reactive(Cocoa)?-时间线、输入、输出、复杂性、异步、状态、聚合

    To put it another way, the output at any one time is the result of combining all inputs. The output ...

  7. BZOJ1079:[SCOI2008]着色方案(DP)

    Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块. 所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个 ...

  8. linux日志log查询常用命令

    一般的log文件都是需要过滤 1.grep 过滤查找 查询ip 221.2.100.138的log grep '221.2.100.138'  web.access.log grep 221.2.10 ...

  9. web测试--测试点

    转载自:51Testing 首先,查找需求说明.网站设计等相关文档,分析测试需求,制定测试计划,确定测试范围和测试策略,一般包括以下几个部分:功能性测试:界面测试:性能测试:数据库测试:安全性测试:兼 ...

  10. HDFS的Write过程

    hadoop中重要的组成部分HDFS,它所发挥的重要作用是进行文件的后端存储.HDFS针对的是低端的服务器,场景为读操作多.写操作少的情况.在分布式存储情况下,比较容易出现的情况是数据的损害,为了保证 ...