java
1、Java起源
- java Sun公司的,后期被甲骨文收购。
- Java之父,詹姆斯高斯林, Java语言早起名字叫做:Oak,由C++演变而来;
- Java 版本:jdk6 /7 最常用, 最新版本10;
2、Java三个平台:
- JavaSE(标准版,用于桌面应用开发)
- JavaEE(企业版,用于企业级应用开发)
- JavaME(微缩版,用于早期嵌入式开发)
3、JavaAPI
- 即Java应用程序接口
- Java API 1.6手册下载
4、Java语言的特性:
- 面向对象、
- 可移植性(一处编译,多处执行)、
- 跨平台性、
- 安全性(1、摒弃指针 2、GC垃圾回收机制:自动释放回收长时间不使用对象的内存)
- 并发性(支持多线程)
5、JDK &JRE
JDK(Java Development Kit Java开发工具包),JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE。其中的开发工具:编译工具(javac.exe) 打包工具(jar.exe)、执行工具(java.exe)等
JRE(Java Runtime Environment Java运行环境) ,包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。
6、配置环境变量(在任何位置都可以找到java环境)
- 最简单配置方式:
- 系统环境变量:PATH:C:\Program Files\Java\jdk1.7.0_13\bin; 后面保留
- CLASSPATH:C:\Program Files\Java\jdk1.7.0_13\lib;.后面保留
-
或者:
- PATH: %JAVA_HOME%\bin;
-
CLASSPATH:%JAVA_HOME%\lib;.
也可以设置JAVA_HOME
JAVA_HOME :C:\Program Files\Java\jdk1.7.0_13
验证是否配置成功: 进入命令行窗口, 执行java -version,成功显示版本号即成功配置
7、开发工具:
- Eclipse
- MyEclipse
- IntelliJ IDEA
8、Java程序的执行过程
- java源文件,编译器(javac命令)进行编译
- 生成class文件(存放的字节码)
- 然后解析器(执行java命令)解析class文件
- 最后生成计算机识别的二进制编码
9、Java有两种数据类型:
- 1、引用数据类型:数组、类、接口。
- 2、基本数据类型:
- 整型:byte、short、int、long (8位1个字节、16/2 、32/4、64/8)
- 浮点型:float、double(32/4 、64/8)
- 字符型:char(16/2)
- 布尔类型:boolean
- 级别从低到高为: byte,char,short(这三个平级)–>int–>float–>long–>double
- 自动类型转换:从低级别到高级别,系统自动转的;
-
强制类型转换:什么情况下使用?把一个高级别的数赋给一个别该数的级别低的变量;
Java中默认整数为int类型, 小数为double类型;
字符char是否可以存放一个汉字?可以,因为一个字符占2个字节,一个汉字两个字节;
整型初始值默认0 浮点型默认0.0 布尔类型默认false 引用数据类型默认null
10、java中是否有goto? 有,是保留字
11、标识符命名规则:
- 可以由数字、字母、下划线、$符号组成,但是不能是关键词,不能以数字开头
-
全局变量(成员变量、类变量)
- 可以供当前类的多个方法使用;
- 定义在类中;
- 成员变量存在于堆内存中,随着对象的产生而存在,消失而消失。
-
局部变量
- 定义在方法中或者方法参数
- 只能作用于当前方法
- 没有初始值
- 局部变量存在于栈内存中,随着所属区域的运行而存在,结束而释放。
- 常量: 只能声明在类中,使用final关键词声明,必须赋初始值,不能再次赋值;
12、Java中数据类型转换:
- 隐式转换:系统默认将其转换为我们需要的数据类型;
-
强制转换:=号两边数据类型不同时,可以通过,前面加(类型)转换
- 例如:int j=10;float f=100.123; int j=(int)f;
-
基本数据类型之间规则:
- (1)整型之间数据类型强制转换规则:long->int->short->byte
- (2)浮点型之间:double->float
- (3)char和整型 : 整型->char
- (4)char和浮点型: 浮点型->char
- (5)浮点型和整型 : (double/float)->(long/int/short/byte) 且小数点舍去
13、运算符:
- +
- -
- *
- /
- %
- 任何整数模2不是0就是1,所以只要改变被模数就可以实现开关运算。
- 位运算符:用于操作二进制位的运算符。
- & | ^ << >> >>>(无符号右移)
-
注意:
- (1)+号拼字符串:”字符串”+数字+数字 和”字符串”+(数字+数字)
- (2)分母不可以为0 否则报异常:ArithmeticException
- (3)java中数值运算时,位数多的与位数少的,做运算,最终结果类型为位数多的(long+double 返回double) 整型和浮点型运算,此时返回浮点型
- (4)java中1/2值为多少?02的三次幂如何计算?2<<2;java中1/2值为多少?02的三次幂如何计算?2<<2;
i++ 表示i先参与运算,然后在自身加1
- ++i 表示i先自身加1 然后在被使用
-
类似的 - -运算也是一样的
注意!注意!下面程序是否有错?
short i=10;
i=i+1;(错误,因为需要强转 short+int结果还是int类型)
i+=1;(正确) -
逻辑运算符(也叫作短路运算符):
- ||
- 或,两边条件有一个满足true,则结果为true
-
&&
- 与, &&两边条件必须返回boolean类型,两边同时为true则结果为true
例如:
int n=10; int m=100; boolean f_2=(n>m)&&((n=100000)<100); System.out.println(n);//n的值还是10 boolean f_3=(m>n)||((n=100000)<100); //n的值还是10
- 1
- 2
- 3
- 4
- 5
- ||
14、判断语句&循环语句break&continue
-
判断语句
if(条件){}
- switch选择判断语句点击查看更多
-
循环语句
for(;条件;){循环体}
while(){}
do{}while()
- break 表示退出整个循环或者判断
- continue 只能用于循环体中,表示退出当前循环,继续下一次循环
15、Java的核心包:即java.lang包
16、包装类:即基本数据类型所对应的类;
- int/double/float/byte/long/char/boolean 是一种值表示;
Integer/Double/Float/Byte/Long/Character/Boolean 包装类
-
常用方法:
- valueOf(“”)
- valueOf(int i)
- toString()
- parseInt(“”);
- 注意异常!注意异常! NumberFormatException
17、==比较和equals比较
- ==比较即比较内容也比较地址是否相同;
-
equals方法,比较两个对象内容是否相同
注意:
- (1)字符串比较,不允许用== ,只能通过equals方法
-
(2)如果Integer和Integer/int比较具体是否相等,此时绝对不允许使用==
-
补充:127 128 问题:
Integer a = 127; Integer b = 127; System.out.println(a==b);true //超一个字节会重新分配空间 Integer c = 128; Integer d = 128; System.out.println(c==d);false
- 1
- 2
- 3
- 4
- 5
- 6
- 7
-
补充:127 128 问题:
-
(3)注意:数字,和字符串比较是否相等;
String str="10"; Integer m=10; System.out.println(m.equals(str));//false System.out.println(m.toString().equals(str));//true
- 1
- 2
- 3
- 4
- 5
18、数组:
- 先定义、开辟空间、赋值在使用
- java中数组长度不可变
-
数组下标从0开始
数组的定义:- (1)
String[] items_0=null;//先定义 items_0=new String[4];//开辟空间
- (2)
String[] items_1=new String[4];
- (3)
String[] items_2={"JONES","SMITH","XIAOMING","SMI"};
-
(4)
String[] items_3=new String[]{"SMITH","JINES","DSFDSF"};
如何不通过第三个变量交换两个变量的值?如何不通过第三个变量交换两个变量的值?
int a=10; int b=20; a=a+b;//a:30 b:20 b=a-b;//a:30 b:10 a=a-b;//a:20 b:10
- 1
- 2
- 3
- 4
- 5
- (1)
-
二维数组:
String[][] items=new String[2][3]; //items[0]={"","",""};错误的 // items[0]=new String[4];对
- 1
- 2
- 3
19、类:是一类事物的描述,程序中为class;
- 属性:即一类事物具有的共有特点或者特性;程序中为全局变量(成员变量)
- 方法:一类事物具有的动作;
-
类的定义和使用
- class 类名称{
属性
方法
} - 使用关键字new就可以创建类对象,使用对象.方法,对象.属性就可完成调用
-
创建一个对象都在内存中做了什么事情?创建一个对象都在内存中做了什么事情?
- 1:先将硬盘上指定位置的Person.class文件加载进内存。
- 2:执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p。
- 3:在堆内存中开辟一个实体空间,分配了一个内存首地址值。new
- 4:在该实体空间中进行属性的空间分配,并进行了默认初始化。
- 5:对空间中的属性进行显示初始化。
- 6:进行实体的构造代码块初始化。
- 7:调用该实体对应的构造方法,进行构造方法初始化。()
- 8:将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)
- class 类名称{
-
抽象类: abstract
- 抽象类的特点:
- 1:抽象方法只能定义在抽象类中,抽象类和抽象方法必须由abstract关键字修饰(可以描述类和方法,不可以描述变量)。
- 2:抽象方法只定义方法声明,并不定义方法实现。
- 3:抽象类不可以被创建对象(实例化)。
- 4:只有通过子类继承抽象类并覆盖了抽象类中的所有抽象方法后,该子类才可以实例化。否则,该子类还是一个抽象类。
- 抽象类的细节:
- 1:抽象类中是否有构造方法?有,用于给子类对象进行初始化。
- 2:抽象类中是否可以定义非抽象方法?可以。其实,抽象类和一般类没有太大的区别,都是在描述事物,只不过抽象类在描述事物时,有些功能不具体。所以抽象类和一般类在定义上,都是需要定义属性和行为的。只不过,比一般类多了一个抽象方法。而且比一般类少了一个创建对象的部分。
- 3:抽象关键字abstract和哪些不可以共存?final ,private , static
- 4:抽象类中可不可以不定义抽象方法?可以。抽象方法目的仅仅为了不让该类创建对象。
- 抽象类的特点:
- 接口:interface
- 接口的特点:
- 1、接口interface**是特殊抽象类**,所有方法都是抽象方法
- 2、不能被实例化,方法abstract关键词可以省略,但实际上还是抽象方法
- 3、变量都是是常量,省略final关键词;
- 4、接口不能被实例化,只能通过implements来实现接口,一个实现类,可以实现多个接口
- 5、接口可以继承接口。
- 6、实现以后要重写所有抽象方法,包括接口继承接口中的抽象方法
- 接口的好处:
- 1、java由于单继承,接口可以弥补无法多继承的缺点
- 2、好的程序要求高内聚低耦合,接口可以实现程序的解耦
- 3、定义一种规范
- 接口的特点:
-
抽象类和接口的区别(4点):
- 抽象类只能被继承,而且只能单继承。
- 接口需要被实现,而且可以多实现。
- 抽象类中可以定义非抽象方法,子类可以直接继承使用。
- 接口中都有抽象方法,需要子类去实现。
- 抽象类使用的是 is a 关系。
- 接口使用的 like a 关系。
- 抽象类的成员修饰符可以自定义。
- 接口中的成员修饰符是固定的。全都是public的。
面向对象:即分析某一个事件中有哪些对象,分析他们的动作,具有的属性特点,通过这种方式来解决问题;
- 面向过程: 侧重点在于步骤,通过一步一步调用方法来实现操作
- 对象实例化: new 类(),即对象的创建;
20、static
- static 声明方法为静态方法,声明属性为静态属性;
- static 关键词:
- 1、static 修饰方法,该方法叫做静态方法(也叫做类方法),可直接通过这个类的类名打点直接调用;
- 2、静态方法中不能使用this/super关键词,静态方法不能直接调用当前类中的非静态方法(或非静态属性),必须通过new实例化后在调用。
- 3、static声明的方法和属性,该对象已经被实例化,且只能被实例化一次(单例模式)
- 4、static修饰的属性,被相同类的不同实例所共享;
21、this
- 表示当前类对象,表示当前类对象,不能用于static声明的方法中, 常用于区分全局变量和局部变量同名
22、super
- (1)使用super关键字,super代表父类对象super代表父类对象,只能用在子类中
- (2)可在子类构造方法中调用且必须是该方法中第一句
- (3)不能使用在static修饰的方法中
- (4)super的用处
- 访问父类构造方法
super();
super(name);
- 访问父类属性
super.name;
- 访问父类方法
super.print();
- 访问父类构造方法
23、访问修饰符:
24、面向对象三个过程:
- OOA面向对象分析
- OOD面向对象设计
- OOP面向对象编程
25、面向对象三个特性(属性)
-
继承
- 继承就是类之间的继承,使用extends来实现,从而实现代码的复用
-
多态
- 某一种事物有不同的具体的体现就是多态。
- 多态体现在:重写、重载、对象实例化。
- 多态的好处:提高了程序的扩展性。
- 多态的弊端:当父类引用指向子类对象时,虽然提高了扩展性,但是只能访问父类中具备的方法,不可以访问子类中特有的方法。(前期不能使用后期产生的功能,即访问的局限性)
-
封装
- 是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
- 好处:将变化隔离;便于使用;提高重用性;安全性。
- 封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。
26、构造方法
- 该方法与类名相同;没有返回值也不可以使用void 声明
- 默认public修饰
- 任何一个类,都有一个无参数的构造方法; 对象实例化时被执行
-
构造方法和普通方法的区别
- 构造方法是在对象创建时,就被调用,构造方法常用于初始化成员变量,而且初始化动作只执行一次。
- 一般方法,是对象创建后,需要调用才执行,可以被调用多次。
27、 程序的执行过程
-
单一类中:
- 1.初始化块2. 静态初始化块3.构造方法
- 执行顺序:静态初始化块(永远只被执行一次) 初始化块 构造方法
-
父类和子类中都有静态代码块,非静态代码块,构造方法时。
- 初始化子类对象时,调用顺序:父类静态,子类静态,父类非静态,父类构造,子类非静态,子类构造
28、方法重载:overload
- 当前类中方法名相同,参数个数或者参数类型不同;
- 为什么重载,重载有什么好处?
- 了解:好处便于记忆筛选,体现了java的多态
29、方法重写:override
- 发生在子类中,子类的方法与父类方法名、参数个数、参数类型,返回值类型完全相同,并且访问权限不能严于父类
- 什么时候使用重写?
- 1、当父类方法无法满足子类需求,此时可以在子类中重写父类方法
- 2、如果开发时,需要对父类方法功能拓展,此时还不想修改父类程序
则使用继承(定义一个类继承父类),然后通过子类重写该方法,
然后其他类进行调用这个子类方法;
30、继承:
- 子类继承父类,可以继承父类中非私有的方法和属性;
- 构造方法无法被继承;
- final修饰的类无法被继承;
Java中是单继承,所有类的超类(父类/基类)是java.lang.Object类
-
子类被实例化时,先实例化父类对象
-
java中是单继承,即一个类只能有一个父类;所有类的父类(超类)是java.lang.Object
-
继承的好处:
- 1、简化子类代码
- 2、使用继承可以不修改父类程序前提,完成对父类方法的拓展
-
缺点:
- 1、打破了封装(封装的目的是隐藏),父类向子类暴露了细节
- 2、过多的继承,会导致程序不便于维护
- 3、白盒重用,因为基类的内部细节通常对子类是可见的
-
-
31、所有类的父类Object类
- Object位于java.lang包下面
- 其中常用的方法有:
- toString(); 返回当前对象本身的有关信息,按字符串对象返回
- equals(); 比较两个对象是否是同一个对象,是则返回true
- hashCode(); 返回该对象的哈希代码值
- getClass(); 获取当前对象所属的类信息,返回Class对象
- equals方法的重写:
- 什么时候重写equals方法?
- 比较两个对象时候,需要重写equals方法,重新定义比较规则
- 什么时候重写equals方法?
- toString方法重写:
- 重写toString方法的目的是:让对象以某个字符串形式表示
32、主方法的分析
public static void main(String[] args){}
1)保证该类的独立运行。
2)因为它是程序的入口。
-
3)因为它在被jvm调用。
Public:访问权限最大。
static:不需要对象,直接类名即可。
void:主方法没有返回值。
main:主方法特定的名称。
(String[] args):主方法的参数,是一个字符串数组类型的参数,jvm调用main方法时,传递的实际参数是 new String[0]。
注意:主方法的存在,仅为该类是否需要独立运行,如果不需要,主方法是不用定义的。
33、Java内存的总结
-
java分了5片内存
- 1:寄存器。
- 2:本地方法区。
- 3:方法区。
- 4:栈。
- 5:堆。
栈:存储的都是局部变量 ( 方法中定义的变量,方法上的参数,语句中的变量 );只要数据运算完成所在的区域结束,该数据就会被释放。
-
堆:用于存储数组和对象,也就是实体。啥是实体啊?就是用于封装多个数据的。
- 1:每一个实体都有内存首地址值
- 2:堆内存中的变量都有默认初始化值。因为数据类型不同,值也不一样。
- 3:垃圾回收机制。
34、自动装箱,自动拆箱
- Java有8种基本类型,每种基本类型又有对应的包装类型。在Java中,一切都以对象作为基础,但是基本类型并不是对象,如果想以对象的方式使用这8中基本类型,可以将它们转换为对应的包装类型。基本类型和包装类型的对应
- 可以直接将整型赋给Integer对象,由编译器来完成从int型到Integer类型的转换,这就叫自动装箱。
- 与此对应的,自动拆箱就是可以将包装类型转换为基本类型,具体的转换工作由编译器来完成。
- 其他几种基本类型的转换也是类似的