JavaEE | 语言基础部分、对象与类
1 Java语言基础
1.1 Java语言特点
简单性 解释性
面向对象 高性能
分布式处理 多线程
健壮性 多态
结构中立 安全性
开源
跨平台
1.2 Java语言跨平台原理
- java的跨平台指的是java编写的程序可以在不同的平台上运行
- java跨平台的前提是平台上安装了JVM(java虚拟机,Java Virtual Machine),JVM控制java程序在不同平台上的运行,不同平台上的JVM是不同的。
- JAVA语言是跨平台的,而JVM不是跨平台的。
1.3 JRE和JDK的概述
- JRE(Java Runtime Environment ,Java运行环境):包括JVM和一些核心的库。有了JRE就可以运行一个java程序了;
- JDK(Java Development Kit ,Java开发工具包):包括java的开发工具和JRE。有了JDK,就可以开发一个java程序了;
- JDK包含JRE的原因:
开发的程序需要运行一下结果;
java的开发工具也是一个需要运行的java程序,为了方便使用才打包成exe文件,如果没有JRE,那么这些工具是运行不了的。
1.4 关键字
java中的关键字都是小写;
注意:goto和const是java语言的保留字
1.5 标识符
- 组成规则:英文大小写字母;数字;下划线和$
- 注意:不能以数字开头;不能是关键字;区分大小写
- 标识符中常见的命名规则
A:包(就是文件夹,它的存在是为了解决我们同一个目录下不能同时存在两个相同名称的文件。)
字母都是小写 itcast
B:类或者接口
一个单词: 首字母大写,其余字母小写 Student , Teacher , Spring , Struts , Hibernate
多个单词: 每一个单词的首字母都是大写,其余字母小写 StudentName , UserLoginController
C:方法或者变量
一个单词: 字母全是小写 name , age
多个单词: 从第二个单词开始,首字母大写,其余字母小写 getName , getAge
D:常量
一个单词: 字母全是大写 NAME , AGE
多个单词: 字母全是大写,每一个单词之间使用 _ 隔开 STUDENT_MAX_AGE
1.6 变量
变量实际上是内存中个一块空间。
1.7 数据类型
决定变量在内存中所占的空间大小。
分类:
- 基本数据类型:byte(1),short(2),int(4) ,long(8),char(2),double(8字节),float(4字节)等
- 引用数据类型: 数组 , 类 , 接口
注意:整数默认是int类型的 , 浮点数默认是 double类型的
1.8类型转换
-
自动类型转换
实线表示无信息损失;虚线表示有信息损失。 -
强制类型转换:
double a=(int) b => 存在截断
double aa=Math.round(b) =>四舍五入
面试题:看下面的程序是否有问题,如果有问题,请指出并说明理由。
short s=1;
s = s+1;//报错,因为s+1自动转换为int,再赋给s时要强制类型转换
//正确写法:s = (short)s+1;
short s=1;
s+=1;
1.9 输入输出类
- 输入类
一般用Scanner类即可,但在输入密码时,在控制台可见。java提供了一个Console类专门输入密码,但是:Java.io.Console 只能用在标准输入、输出流未被重定向的原始控制台中使用,在 Eclipse 或者其他 IDE 的控制台是用不了的。
1.10 中断控制
- break:退出循环语句
- continue:结束当前循环,跳到最内层循环的首部。
1.11 大数值
为了解决整数和浮点数的精度问题,引入大数值,可以实现任意精度的整数和浮点数运算。
- BigDecimal
- BigInteger
大数值的加、乘不能直接用+和,要用特定的add和multiple.*
1.12 数组
- 声明
int[] a; //常用
int a[];
int[] aa=new int[100];
- 数组遍历 for each
for (int ele : a) //a为一个数组
{
sout(ele);
}
tip1:如果不希望遍历所有的元素,或者在循环内部需要使用下标,使用for循环即可。
tip2:需要打印数组中的所有元素:sout(Arrays.toString(a));
-
数组的长度可以为0,这和null不同
-
数组拷贝
bb=Arrays.copyOf(aa,aa.length); -
数组排序
Array.sort(a); -
多维数组
- 声明
double[] [] balances;
balances= new double[10] [10] ;
- 遍历二维数组,要用两个for each循环
- 打印二维数组
Arrays.deepToString(a);
- 不规则数组
数组的每一行有不同的长度。
int[][] odds=new int[10][];
for(int i=0;i<=10;i++)
{
odds[i]=new int[i+1];
}
2.对象与类
- 对象与对象变量:对象是可以被new出来的,而对象变量可以引用一个对象;一个对象变量没有包含一个对象,而仅仅是引用一个对象
2.1 时间与时间点类
Java中将时间与日历分开进行设计
2.1.1 Date类
- 导包 java.util.Date;
- 打印:toString方法
2.1.2 GregorianCalendar类
- GregorianCalendar类中,月份是从0开始计的
- 获取年月日信息:get方法
- 设置年月日:set方法
- 指定日期增加天数,星期数:add方法
2.1.2 GregorianCalendar类与Date类转换
- 访问器方法:getTime
- 更改器方法:setTime
- 已知年月日,需要构造一个这个时间值的Data对象:先创建一个GregorianCalendar对象,然后用getTime方法获得一个Data对象
GregorianCalendar calendar = new GregorianCalendar(2020,2,13);
Date time = calendar.getTime();
- 希望获得Data对象中的年月日信息:先创建一个GregorianCalendar对象,用Data设置时间,然后调用get方法
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date);
int month = calendar.get(Calendar.MONTH);
2.2 用户自定义类
- 在一个源文件中,只能有一个公共类(public)
2. 构造器
- 构造器与类同名
- 构造器总是伴随着new操作符的执行被调用的
- 构造器没有返回值
- 每个类可以有多个构造器
不要在构造器中定义与实例域重名的变量,否则这些变量只能在构造器内部使用,从而屏蔽了同名的实例域
3.this
隐式参数可以将实例域与局部变量分开
-
方法
-
域
- 实例域建议用private关键字
- 需要设置或者获得实例域的值只要提供以下内容
- 私有的数据域
- 公有的域访问器方法
- 公有地域修改器方法
- 不要编写返回引用可变对象的访问器方法,否则调用更改器方法可以自动的改变原来的私有属性,破坏封装性!如果必须返回可变对象的引用,首先对其进行克隆(clone)。
7. 基于类的访问权限
一个方法可以访问所属类的所有对象的私有数据
8. final
将实例域定义为final。构建对象时必须初始化这样的域。即必须确保每一个构造器被执行之后,这个域被设置,并且在后面的操作后,不能对他进行修改。
Final修饰符大都应用于基本数据类型,或不可变类的域。
2.3 静态域和静态方法
1.静态域static
如果将域定义为static,每个类中只有这样的一个域,每个对象对于所有实例域却有自己的一份拷贝。
静态域属于类,不属于任何一个对象。,所以静态域又称为类域。
2.静态常量
静态变量用的较少,但静态常量用的较多。
ex1: Math类中
public static final double PI=3.141592653;
ex2:System.out
public static final PrintStream out=…;
一般情况下,不要将域设置为public,防止每个类的对象都对这个域进行修改,但是共有常量(final域)没有问题。
3.静态方法
静态方法是一种不能向对象实施的方法。如Math.pow(x,a)就是一个静态方法。在使用该方法时,没有任何隐式参数。
静态方法可以访问自身类中的静态域,直接通过类名调用该方法,访问自身类中的静态域。
使用静态方法的两种情况:
- 一个方法不需要访问对象状态,所需参数数显示的
- 只需访问类的静态域
静态方法的另一种用途:NumberFormat类使用工厂模式产生不同风格的格式对象。
总结:所谓静态,指的是属于类且不属于类的对象的变量和函数。
2.4 方法参数
值调用:方法接收的调用者提供的值;
引用调用:方法接收的是调用者提供的地址变量;
一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。
java总是采用值调用,即方法所得到的是所有参数值的一个拷贝。
方法参数有两种基本类型:
1.基本数据类型
2.对象引用
一个方法不能修改一个基本数据类型的参数,但是可以修改对象引用的参数。原因是方法得到的是对象引用的拷贝,对象引用及其他的拷贝同时引用同一个对象。
在java中,对象引用进行的是值传递。
Java中,方法参数的使用情况:
1.一个方法不能修改一个基本数据类型的参数;
2.一个方法可以改变一个对象参数的状态;
3.一个方法不能实现让对象参数引用一个新的对象。
2.5 对象构造
-
重载:多个方法,有相同的名字,不同的参数;
方法的重载需要指出方法名和参数类型,但不包括返回类型;即不能有两个方法名和参数类型相同,但返回值不同的参数。 -
默认域初始化:如果在构造器中没有赋初值,系统会赋默认值
局部变量必须初始化,注意区分 -
默认构造器:如果没有编写构造器,系统会自动生成一个构造器,自动赋默认值(0,false,null)
-
显示域初始化
在执行构造器之前,先执行赋值操作 -
参数名
用this.salary访问实例域
public Employee(String name,double salary)
{
this.name=name;
this.salary=salary;
}
-
调用另一个构造器
如果构造器的第一个语句形如this(…),那么构造器将调用同一个类的另一个构造器。
优点:公共的构造器代码部分只编写一次即可。 -
初始化块
初始化数据域的方法:
- 在构造器中设置
- 在声明中设置
- 初始化块
静态代码块(static):在类第一次加载时,会进行静态域的初始化。
2.6 包作用域
- public:可以被任意类使用
- private:只能被定义它的类使用
- 没有public,private:可以被同一个包的所有方法访问。
对于变量来说,必须显示的标记为private,不然默认为对包可见。 - 权限修饰符范围:public>protected>缺省的>私有的