基础知识
环境配置
JDK 1.8.0
eclipse:免费但是插件比较少
STS 4.6.1:Spring的eclipse插件版本(本课应用)便于spring开发
IDEA:比较火,Java开发效率最快,付费版本费用高,环境高度集成,占内存
下面这几个都要装
navicat:数据库可视化,增删改查
powerdeginer:数据库设计工具
HBuilder X:当前最快的HTML开发工具,辅助提示比较强大
标识符
建议标识符不超过30个字母
Unicode字符集前256个是ASCII码及其扩展码
共有四类八种基本数据类型
保存批量数据:数组,枚举,集合,对象
两个byte类型的操作结果是一个int类型,需要byte类型要强制类型转换
游戏分区常用byte类型存
long类型常在时间转换为毫秒值的时候使用
小数末尾有f为float,没有的话是double类型
类型 变量名 [=值]; //声明可以不写值,使用前必须给值
final 类型 常量值 [=值]; //变量名全部大写,单词间下划线分割
短路运算符&&,||
使用快捷键 control+shift+f代码格式化
break跳出整个循环,continue跳出单次循环,循环嵌套可以加标签定位当前循环
动态数组定义时要确定数组大小
增强for循环
String[] num = {"1","2","3","4","5","6"};
for(String i: num){
System.out.println(i);
}
优点: 遍历集合和容器简单。
缺点: 在遍历集合过程中,不能对集合本身进行增删等操作,只能够循环遍历输出。
格式:for(Object obj : list) {
System.out.print(obj);
}
使用方法: for循环中第一个参数为数据类型(Object),第二个参数为随便定义的一个用作循环赋值输出的变量名,第三个参数为已定义并初始化的变量名(list)。
类和对象
对象:类的具体化
面向对象的特点:
- 封装性
- 继承性
- 多态性:不同类型的对象可以对相同的激励做出不同的响应
面向对象开发的两个步骤:
- 抽象出数据模版
- 模版具体化到对象
构造方法用于创建对象
类修饰符列表:
类修饰符 | 功能 |
---|---|
无 | 同包访问 |
public | 完全开放 |
abstract | 抽象 |
final | 没有子类 |
[修饰符] class 类名 [extends 超类名][implements 接口列表]{
类体;
}
成员变量的声明:
成员变量修饰符 | 功能 |
---|---|
private | 限制类外访问 |
无 | 同包访问 |
protected | 同包及子类访问 |
public | 完全开放 |
static | 静态 |
final | 常量 |
volatile | 可被多个线程访问 |
transient | 不序列化 |
[修饰符] 变量类型 变量名 [=值]
构造方法调用用new关键字
?在调用对象时没有指明方法,默认调用.toString(),(所有类都继承于Object?)
成员方法的声明:
方法修饰符 | 功能 |
---|---|
private | |
无 | |
protected | |
public | |
static | 静态 |
final | 不能覆盖 |
native | 本地方法 |
abstract | 抽象 |
synchronized | 同步方法 |
[修饰符] 返回值类型 方法名([参数列表])[thorws 异常类型列表]{
方法体;
}
方法命名一般采用动宾结构(是一种行为的抽象)
对象是类类型的变量,对象名相当于门牌号(Java中没有指针概念)
方法重载
出现原因:在同一个类中,不同对象的操作方法可能不同
同一类中,方法名相同,形参列表不同的多个方法之间构成方法重载
返回值类型可以相同也可以不相同
形参列表不同指:参数个数、参数类型或参数顺序不同
关键字this
表示当前对象
可以使用无参的构造方法调用有参的构造方法
public Student(){
this(9); //调用构造方法
this.eat(); //调用其他方法
}
public Student(int a){
this.age = a;
}
封装
信息隐蔽
实现:成员变量私有化,提供公有访问方法
常用于当前类是存储数据的(学生信息表)
public class Student(){
private int age;
public int getAge(){
return age;
}
}
static关键字
把成员变成类的属性,类成员共享的属性(count)
可以直接使用类调用
尽量不要使用,在类加载的时候进内存 占内存!!!
final关键字
常量,不可被覆盖,不可被继承
继承,多态,抽象类,接口与字符串
新类继承现有类的方法和属性,可以根据自身需要进行扩展
父类的私有成员子类虽然能继承,但在子类中不能直接使用(可以通过采用封装的方法解决)。final类不能继承
Java里继承为单继承
覆盖Override
覆盖 (override):也叫重写,就是在当父类中的某些方法不能满足要求时,子类中改写父类的方法。当父类中的方法被覆盖了后,除非用super关键字,否则就无法再调用父类中的方法了
父类子类方法重名,会构成重写
- 返回值类型相同
- 方法名相同
- 形参类型,个数,顺序相同
- 子类中方法的权限不小于父类中的权限
- 子类方法不能抛出新的异常
- 父类里的final方法不能被重写覆盖
Question: 重载和覆盖的联系与区别
多态
允许将子类类型赋值给父类类型
多态的特性:编译时接口缩小,运行时动态绑定
tip:删除当前行快捷键:alt+d
super调用父类方法,this调用本类方法
抽象类abstract
具有抽象方法的类一定是抽象类
抽象类未必包含抽象方法
抽象类只能被其他类继承
抽象类不能被实例化(不能被new)
public abstract class Person(){
...
public abstract void test();
}
如果一个类继承了抽象类,这个类必须实现抽象类的所有抽象方法(即方法覆盖),否则这个类必须声明为抽象类
abstract与final不能一起使用
接口
不是类,是一组对类的要求,(jdk8.0以后可以有细节)不带任何实现细节
在JDK8.0之后和抽象类差不多
分类:
- 标记性接口:什么都没有就是个标记,如Serilizable(序列化?),Cloneable等
- 常量群接口:只有常量(可以直接调用),没有方法,如SwingConstants
- 一般接口
接口的作用:
- 接口的使用弥补了Java单亲继承的特点
- 无关系的类不可能有同一个父亲,但可以有同一个接口
- 接口的使用使得项目中多个程序员可以并行开发
public interface Operator{
void fly(); //public abstract void fly();
public static void study(){}
}
接口中成员变量自动声明为:public static final
接口中成员方法两种声明:static、default,自动声明为public abstract
static可以直接通过接口调用,default要通过类调用,注意具体类(有接口缩小问题)
- 使用时一定要注意使用范围
- 接口不能实例化对象
- 接口只能继承接口
- 实现接口时必须实现接口中所有的方法,否则该类必须声明为抽象类
包
是一组类的集合
包名 | 用途 |
---|---|
java.lang | Language 语言包 |
java.awt | 抽象窗体工具包 |
java.awt.event | 事件包 |
javax.swing | 跨平台轻量级组件包 |
java.sql | 数据库访问包 |
java.io | 输入/输出流包 |
java.net | 网络包 |
java.util | 实用工具包 |
String字符串
字符串创建两种方式
String s = "崽崽";
String str = new String();
str = "崽崽";
区别:
方法1中,先在内存中查找有没有"11"这个字符串对象存在,如果存在就把s1指向这个字符串对象;
方法2中,不论内存中是否已经存在"11"这个字符串对象,都会新建一个对象。
一个String对象一旦构造后,其值是不可以改变的
String是一个final类
直接构造放在“常量池”中
==和equals()的区别
==:在比较对象时,比较的是对象的引用(地址)
String的equals():比较的是String对象的值是否相同
equals()参数为(Object obj)关于equals方法的重写
StringBuffer类
- 构造后大小可以改变
- 只能用构造器对它初始化
- StringBuffer对象的容量和它的长度是两个概念,其容量大于长度
- StringBuffer经常的再分配会产生内存碎片,且实现同步会降低执行效率,因此单线程中不常用
StringBuilder类
用法与StringBuffer几乎相同
不能保证同步,常在单线程中使用
- 运算次数少时使用String类足够
- 运算次数多时,建议:局部变量一般用StringBuilder,因为一般不会有多线程的问题;成员变量一般用StringBuffer,因为要考虑线程同步问题
- 必要时可对它们互相转换
查看API具体方法(看源码)
String 重点看String的常用方法