目录
1 基础知识
2 区别不同
3 语法
3.1 数据类型
3.2 面向对象
3.2.1 继承 extends
3.2.2 super关键字
3.2.3 重写
3.2.4 多态
3.2.5 抽象类 abstract
3.2.6 final
3.2.7 接口 interface 与 implements
3.3 包的使用规则 package
3.3.1 jar的使用
3.4 异常处理
3.4.1 finally的作用:
3.4.2 自定义异常一个例子
3.5 小细节
3.5.1细节:类方法传参与类型检查
3.5.2 toString方法
3.5.3 String 与StringBuffer
3.5.4 equals方法
4 线程相关
4.1 什么是程序
4.2 进程
4.2.1 线程基本概念
4.2.2 线程控制的基本方法:
4.2.3 线程同步 Synchronized
4.2.4 notify和wait方法
5 用户界面GUI: 组件awi 或Swing
6 事件
7 匿名类使用场景
8 jar包生成
9 容器
9.1 容器API类图(Set List Map)
9.2 为什么需要容器
9.3 ArrayList与LinkedList区别
9.4 Hash Table 哈希表
9.5 为什么要重写hashcode方法?
1 基础知识java语言的历史:
最初是为了控制家用电器设计的,
网络的兴起(不同机器不同软硬件环境,java可以跨平台)让java火起来
java两大核心机制:
JVM:java虚拟机for windows/unix/linux,一次编译到处运行;也是一个软件
Garbage Collection: 垃圾自动回收
JDK:java开发工具包,包含了JRE
包含工具:编译源代码的javac.exe 运行java程序的java.exe
JRE: java运行环境,包含jvm和核心类库
java语言特点:
1)简单易学
摒弃了指针 结构 及内存管理:程序员只需要分配内存,不需要释放内存,jvm自动管理(在程序闲时自动释放)
类库丰富!!
完全面向对象!!
2)安全性高
强类型语言,类型检查必c/c++严格
垃圾自动回收
禁止非法内存访问
3)跨平台
作为一门网络语言:编译成结构中立的中间文件格式(与平台无关的字节码格式),在系统对应的jvm上运行
c/c++ 编译成 特定机器的机器语言(用户->高级语言程序->编译器->操作系统->硬件)
java: 编译成 与平台无关的字节码格式,由jvm来转换成 特定机器的机器语言
4)多线程
在语言上支持多线程的设计
java应用领域:
1)源代码以".java"结束;.java文件名称一般应该与文件中定义的public class类名保持一致;
并且一个java文件只能有一个public class类(启动类)
2) 编译命令: javac HelloWorld.java 编译时,使用文件名,会生成文件中以类名命令的.class文件
运行命令: java HelloWorld //=>注意没有后缀!!执行的是 类名命令的.class文件
3) 编译好后是.class文件 (与平台无关的字节码格式,由jvm来转换成 特定机器的机器语言)
4) java中的函数,也叫做方法,使用自己class对象,不需要定义形参
5) 不使用include ,使用import
6)环境变量:
7)cd命令 windows切换目录:cd 目标目录 enter后, 还需要输入目标目录的盘符!
cd .. 返回上级目录
cd \ 返回根目录
8) /** */ 用于将注释变成说明文档,用javadoc实现
9)java语言思想
面向对象:
是 一种哲学思想:
要解决问题,先创造对象,通过对象来模拟事务:
对象= 静态属性 + 动态行为
3 语法 3.1 数据类型%x 输出以16进制形式表示、小写 “#”表示输出数值前加0x
\u0030 u表示unicode编码方式
java中,类型所占用的字节数是确定不变的:(c/c++ 字节数只规定不能小于xxx,与机器有关的)
类的属性,也叫 类的数据成员,字段 或 域
- protected和 public可以通过类名访问,private不能通过类名访问
- 静态方法只能访问静态成员、静态方法
- C语言中,我们对一个功能函数要实现不同类型的调用时,就必须得取不同的名称; c++/java可以重载(只要函数形参列表(个数or类型)不一样即可),函数返回值不同,不能作为重载的条件
- 类中的属性,会被系统默认初始化;局部变量则不会被系统初始化。
- 内存空间分配:
同一个类的两个对象,放在栈空间,对象对应的属性值分别放在堆空间,类的方法放在代码区,只有一份!show方法通过this找到对应的对象的属性值,每个非static方法都还有一个this指针
- String 类型:字符串 S大写
- static: 定义类的静态属性或者方法,静态成员可以通过类名访问,也可以通过类的实例对象访问
- 若希望一个类没有实例对象,将其构造函数定义成private的即可
- 构造函数不能定义成static的即可
- 如何定义一个只能实例化一个对象的类(aa类似于链表中的指针,可以指向本身)
关键字 extends: 只支持单继承,不支持多继承(c#同样不允许,c++却允许)
理解: B是一个A吗?若是 则B可以继承A;
反映的是一般到特殊的关系,如(人->男人->男学生)
父类的私有成员不能被继承(物理上已经有继承,只是不能访问),所以继承要慎重,否则浪费内存空间
子类对象,可以调用父类的protected方法
- 只能在子类中的构造方法中使用,用于初始化继承自父类的属性;
- 前提是,父类中已经定义了相应签名的构造方法!
- 同时,若是子类在构造方法中不调用super方法,则默认使用“super();”调用父类的“A()”构造函数;此时,应确保父类A中,有显式定义了的构造函数“A(){…}”!
- 调用的super方法,应位于子类构造方法的最前面的语句,且只能调用一次super方法
- super代替父类的类名,在子类中调用父类的public或protected方法
子类的普通方法不能调用super方法
目的:对父类的方法不满意,想要更新或者拓展父类的方法:
注意:子类继承的方法的权限,不应比继承自父类的方法更严格(为了保证多态都能实现)下面的两个关键字应互换,否则会出错。
注意:返回值不能作为重载的条件,如下,会报错:因为子类中有了两个同名同参但不同返回值的方法!
父类=子类:因为子类可以当做父类看,所以可以把子类赋值给父类
可以定义一个抽象类的引用,A a; // ok
不可以定义一个抽象类的对象 A a = new A(); // error
3.2.6 final被final修饰的变量是常变量,类似 c++中的const修饰符
比抽象类要求更严格的抽象类,因此不能new出对象来
属性系统会默认赋值;局部变量定义后,不初始化是一个垃圾值(java语法不允许(使用未初始化的局部变量),c语法不检查)
接口的多态使用:
classpath:编译器去查找的当前使用的class类所在的路径;若当前使用的class类不在当前执行时的路径下,则应该通过cmd中设置“set classpath=你的用到class类的顶层路径;”来让编译器找到当前使用的类。
jar包之间的访问:
执行打包命令
如何使用jar包中的类
throws: 将本函数发生的异常交给调用者处理,自己不作处理,及向外抛出
a) 类里面 方法可以直接使用属性变量,而不用传参。
b) 严格类型:double跟int 不会隐式转换,会报错!又如if(3),会报错,数字就是数字,boolean就是布尔,不能混用。
3.5.2 toString方法printf 对比 printfln:
printf: 输出多个对象时,使用比较方便; 输出指定格式的数据时比较方便。
printfln: 输出自定义对象时比较方便(调用toString方法)
3.5.3 String 与StringBuffer同一个类的两个对象,即使两者的属性值都相等,这个两个对象也不相等,即a1.equals(a2) 返回的是false.
同一个list容器,可以放不同类型的数据(数组则只能放同类型的对象)
但是在set容器中(不允许元素重复),对于具有相同属性值得同一个类的两个对象,不会重复添加!
重写equals方法,让同一个类的相同属性的两个对象,返回相等的判断结果。
一个例子:new出来的string存在堆区,直接比“==”,比的是地址,不相等;赋值定义string, 存放在静态数据区(字符常量区),比“==” 比的是字符串常量,所以相等。
所谓的程序,是一个严格有序的指令的集合,程序规定了完成某一任务时,计算机所需要做的各种操作,以及这些操作的执行顺序。
4.2 进程进程3部分组成:程序段 数据段 PCB(进程控制块)
4.2.1 线程基本概念class Mythread extends Thread { }
class Mythread implements Runable { }
线程优先级:1~10, 主线程默认是5,子线程与父线程默认优先级相同。
推荐使用继承接口Runnable的方法,构造需要执行的多线程类。
原因如下:使用同一个类对象可以构造多个线程对象,这样,访问的是同一个类对象,便于使用同步机制。
网页界面: html + css
6 事件例子:
(onging) hereto: 100集 13min
参考: 郝斌 java视频教程