一、java基础:
1、java简介
(1)java历史
(2)重要概念
javaSE(标准版) javaEE(企业版) javaME(微型版)
JDK(java开发工具包)JRE(java运行环境)IDE(集成开发环境)
- JavaSE(javaPlatform,Standard Edition)。Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。java se 包含了支持 Java Web 服务开发的类,并为 Java Platform,Enterprise Edition(Java EE)提供基础。 J2SE就是做那种桌面安装程序样的,像QQ,WORD那种应用程序。
- java ee(Java Platform,Enterprise Edition)。这个版本以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端 Java 应用程序。Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web 2.0 应用程序。 J2EE 就是做基于Internet的应用程序,像选课系统,企业网站,银行系统之类的。
- Java ME(Java Platform,Micro Edition)。这个版本以前称为 J2ME。Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。 J2ME就是做嵌入式系统开发的,像手机游戏之类的,像现在流行的Android操作系统。
- JDK(Java Development Kit)。
- JRE(Java Runtime Environment)
- IDE(Ind Depvelopment Environment)
2、环境搭建
JDK、Eclipse
(1)下载
(2)安装
(3)配置
3、数据类型
(1)基本数据类型
byte char boolean short int long float double
简单说明:byte 8个bit 因为是有符号的所以取值范围(-128~127) ;char和short 16个bit,char是无符号的取值范围(0~65535) ; int和float 都是32个bit ;long和double都是64个bit
byte和char的区别:1.Char是无符号型的,可以表示一个整数,不能表示负数;而byte是有符号型的,可以表示-128—127的数;2.char可以表中文字符,byte不可以;3.char、byte、int对于英文字符,可以相互转化
基本数据类型 | 分类 | 大小 | 取值范围 | 默认初始值 |
---|---|---|---|---|
byte | 整型 | 1字节 8bit | 【-128 127】 | 0 |
int | 整型 | 4字节 32bit | 【-2*10^31 2*10^31-1 】 | 0 |
short | 整型 | 2字节 16bit | 【-2*10^15 2*10^15-1 】 | 0 |
long | 整型 | 8字节 64bit | 【-2*10^63 2*10^63-1 】 | |
char | 字符型 | 2字节 16bit | 【-2*10^31 2*10^31-1 】 | |
float | 浮点型 | 4字节 32bit | 【3.402823e+38 ~ 1.401298e-45】 | |
double | 浮点型 | 8字节 64bit | 【1.797693e+308~ 4.9000000e-324】 |
(2)对象/引用数据类型
String 和 自定义类 接口 抽象类
String、StringBuffer和StringBuilder三者的区别:1.String是常量,StringBuffer和StringBuilder是变量,修改时不生成新的对象,内存使用上占优势;2.StringBuffer是线程安全的,StringBuilder非线程安全;3.执行速度:(StringBuilder,StringBuffer)>String;
综上所诉:1.当数据量不是很大的时候用String;2.单线程用StringBuilder;3.多线程用StringBuffer
4、命名规范
只有确保了命名的唯一性和描述性,才能保证资源之间不相互冲突并且便于理解记忆。
① 标识符的组成:字母,数字,下划线,$,不能以数字开头,不能使用关键字和保留关键字。ps:关键字是指java中已经定义的具有特定功能的标识符,不能用作普通标识符
② 包的命名
Java包的名字都是由小写单词组成。每一名Java程序员都可以编写属于自己的Java包,为了保障每个Java包命名的惟一性,最新的Java编程规范要求程序员在自己定义的包的名称之前加上惟一的前缀。由于互联网上的域名是不会重复的,所以程序员一般采用自己在互联网上的域名作为自己程序包的惟一前缀。
例如:net.frontfree.javagroup。
③ 类的命名
类的名字必须由大写字母开头,一个单词中的其他字母均为小写。如果类名称由多个单词组成,则建议将每个单词的首字母均用大写,例如TestPage。如果类名称中包含单词缩写,则建议将这个词的每个字母均用大写,如:XMLExample。由于类是设计用来代表对象的,所以建议在命名类时应尽量选择名词。
④ 方法的命名
方法的名字的第1个单词应以小写字母开头,后面的单词则建议用大写字母开头(驼峰原则)。
例如:sendMessge()。
⑤ 常量的命名
常量的名字应该都使用大写字母,并且指出该常量完整含义。如果一个常量名称由多个单词组成,则建议用下划线来分割这些单词。
例如:MAX_VALUE。
⑥ 参数的命名(驼峰原则)
参数的命名规范和方法的命名规范相同,而且为了避免阅读程序时造成迷惑,请在尽量保证在参数名称为一个单词的情况下,参数的命名尽可能明确。**注意:**1、类的属性允许不进行初始化;2、方法内部的变量要进行初始化
⑦ javaDoc注释
Javadoc注释是一种多行注释,以/*开头,而以/结束,注释可以包含一些HTML标记符和专门的关键词。使用Javadoc注释的好处是编写的注释可以被自动转化为在线文档,省去了单独编写程序文档的麻烦。
在每个程序的最开始部分,一般都用Javadoc注释进行程序的总体描述以及版权信息。在主程序中可以为每个类、接口、方法、变量添加Javadoc注释,每个注释的开头部分先用一句话概括该类、接口、方法、变量所完成的功能,这句话应单独占据一行以突出其概括作用,在这句话后面可以跟随更加详细的描述段落。
在描述性段落之后还可以跟随一些以Javadoc注释标签开头的特殊段落,例如上面例子中的@auther和@version,这些段落将在生成的文档中以特定方式显示。
虽然添加注释不会使一个设计低劣的程序变成好的程序,但是如果按照编程规范编写程序,并且为程序添加良好的注释,却可以帮助编写出设计优美、运行高效且易于理解的程序,尤其在多人合作完成同一项目时,编程规范非常重要。俗话说”磨刀不误砍柴工”,花费一点时间去适应一下Java编程规范是有好处的。
5、流程控制
分支语句(条件语句)
循环语句()
6、类和对象
(1)辨析成员变量、局部变量和全局变量
成员变量:在类体的变量部分中定义的变量,也称为属性。
局部变量:是指在程序中,定义在特定的方法或语句块的变量,是相对与全局变量而言的。
实例变量和类变量的区别
1.实例变量:不用static修饰,它只能通过对象调用而且所有对象的同一个实例变量是共享不同的内存空间的;
2.类变量:又叫静态变量,用static修饰,它可以直接用类名调用也可以用对象调用,而且所有对象的同一个类变量都是共享同一块内存空间的;
(4)Java的构造方法
1.程序运行的时候构造方法就被加载;2.每个类都有构造方法,如果程序员给类提供构造方法,编译器会自动创建一个默认的构造方法;
3.构造方法重载类似于方法的重载,一个类可以有多个构造方法,但参数列表必不同。
(5)static(静态变量、静态方法和静态初始化块)
含义:“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。Java中static方法不能被覆盖, 因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。
是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就会一直存在。这样做有什么意义呢?
在Java程序里面,所有的东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用他的成员,那么普通情况下必须先实例化对象后,通过对象的引用才能够访问这些成员,但是有种情况例外,就是该成员是用static声明的(在这里所讲排除了类的访问控制)
静态变量和静态方法:
1.静态变量可以直接被类和对象调用;2.静态方法中不能直接调用非静态变量和非静态方法,可以通过创建对象调用;3.普通方法中可以直接调用 类中的静态和非静态变量;
(8)按值传递和引用传递
参数按值传递,传递的是值的拷贝,也就是说传递后就互不相关了,不会影响原值。
参数按引用传递,传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间),因此,外部对引用对象所做的改变会反映到所有的对象上。
按值传递和引用传递详解
(9)Object类(是java所有类的超类)
Object()
默认构造方法
clone()
创建并返回此对象的一个副本。
equals(Object obj)
指示某个其他对象是否与此对象“相等”。
finalize()
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
getClass()
返回一个对象的运行时类。
hashCode()
返回该对象的哈希码值。
notify()
唤醒在此对象监视器上等待的单个线程。
notifyAll()
唤醒在此对象监视器上等待的所有线程。
toString()
返回该对象的字符串表示。
wait()
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
wait(long timeout)
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。
wait(long timeout, int nanos)
导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。
(10)UML
二、java进阶
1、Java面向对象编程(OOP)
面向对象的编程优点:代码开发模块化,易于维护和理解,代码复用性,增强代码的可维护性和灵活性,
- 封装:将对象封装成类,类隐藏内部的实现细节,统一提供属性和方法,便于代码的维护。
java中的访问修饰符: 1.private:只有本类内部可以访问,且不能被访问(继承);2.默认(不加访问修饰符),只能在本类和同一包中使用 3.protected:能在本类,同一包(package)下,和该类的子类被访问(该子类可以不和父类在一个包下);4.public:公开的,都可以被访问(继承)内部类:??????
- 继承:继承是类与类之间的一种关系,子类可以使用父类的属性和方法(父类的属性和方法不能是privata),增加了代码的复用性,也为多态的实现提供了前提。
注意:1.java中只能实现单继承;2.super()代表在子类中调用父类的构造方法;3.this.属性/this.方法,表示访问本类中的属性和方法,this()代表调用本类的构造方法;3. 类与类之间的关系:继承关系;依赖关系(该类对象作为另 一个类中一个方法的参数)实现关系(实现是类与接口之间最常见的关系)类与类之间的关系详解4.final关键字:可以修饰类、方法、属性和变量,
修饰类该类不能被继承,修饰方法该方法不能被覆盖,修饰属性该属性不能自动初始化,修饰变量该变量只能赋一次值
5.java中继承的执行顺序:父类属性初始化–>父类构造方法–>子类属性初始化–>子类构造方法
多态总结: 方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。
2、抽象类和接口
抽象类(抽象类是约束子类必须拥有哪些方法,并不关注子类的实现):
抽象类总结:1.包含抽象方法的类一定抽象类,定义了抽象类(abstract class A)不一定有抽象方法,抽象类中也可以定义普通方法;
2.抽象类必须用public或protected修饰;
3.抽象类不能用来创建对象;
4.如果一个类继承了抽象类则子类必须实现父类的所有抽象方法方法。
接口(接口泛指供别人调用的方法或者函数):
接口总结:1.接口中的方法都是抽象方法;2.一个类可以实现多个接口,一个非抽象的类实现了某个接口就必须实现接口中的所有方法(换
句话说:对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法);
抽象类和接口的区别:
以下实例实现了一个会报警门,门的开关是门这一类事物特有的属性,但报警并不是(所有的门并不一定都是会报警的门),报警仅仅可以说是一种行为,一种门可能会有也可能不会有的行为,所以用接口去定义这种行为,你的门有报警功能就去实现(implements)这个接口呗,反之这不去实现。
区别总结:1.抽象类里可以有非抽象方法,而接口内的方法都是抽象的(public abstract);2.抽象类多用来对一类事物共有属性的抽象,接
口只是提供对扩展行为的;3.接口里定义的属性都是final的,接口定义的方法只能是public ;4,一个类可以实现多个接口但只
能继承一个抽象类;
抽象类和接口详解
3、包和修饰符
4、常用类
(1)String类
(2)包装类
基本数据类型对应的包装类:byte char boolean short int long float double
Byte Character Boolean Short Integer Long Float Double
目的:把基本数据类型转化成对象类型,java是面向对象的语言,对象类型可以承载更多的信息和操作,另外包装类都实现类Compareable接口可以实现对象之间的比较。
equals() 比较的是两个对象的值(内容)是否相同。
“==” 比较的是两个对象的引用(内存地址)是否相同,也用来比较两个基本数据类型的变量值是否相等。
(3)Date类
(4)Math类
5、集合框架
java集合类
java集合类中基本的接口:
Collection:是集合类的上级接口,继承与他的接口主要有Set 和List.
List:以特定次序来持有元素,可有重复元素;
Set:无法拥有重复元素,内部排序(无序);
Map:键值对key–value,value可多值
集合类特性(几个常用类的区别)