java的核心配置:JDK
JDK主要包括三个部分
1、Jre:java的运行环境
2、Java的工具:java的编译器(java.c.exe)、 java执行解释器
3、Java的类库
java开发环境
JDK Java开发工具
JVM Java虚拟机
JRE Java运行环境
java程序运行过程
编写一个.java文件格式的源文件,源文件经过编译器编译成字节码文件(.class文件),字节码文件为二进制,为什么要编译为二进制呢,是因为我们编写的java文件计算机看不懂,计算机只能读取二进制,所以要编译成二进制,毕竟是计算机帮我们运行程序,那么首先得先转换成它能看懂的文件,然后由执行解释器将字节码文件加载到java虚拟机中,.class文件就会在java虚拟机中运行。
这里就清楚的看到编译和运行的区别,一般在ecilpse中,当点击文件保存时,eclipse会自动将代码进行编译此时已经生成.class文件,点击运行时,编译好的.class文件才会运行。所以,才会有编译错误和运行错误,编译错误在保存.java源文件时,就会出现错误提示,并且程序无法运行,有时候程序编译没有问题,但是运行后出现问题,结果不对,这就是运行错误。
java语言的好处
java语言最大的好处应该就是跨平台(操作系统)运行了, java源代码编译成字节码文件是不需要平台支持的,但是每个操作系统的JVM是不一样的,不同的JVM都能够翻译二进制文件,所以当你的程序由wondows系统转移到Linux系统时,只需要安装不同的JVM版本,不用更改源代码,就能够将程序跨平台运行。即实现了一次编译,到处运行。
java运行原理
标识符(记住)
- 标识符是用于类名、变量名、方法名、对象名、数组名等的命名;
- 可以使用英文、数字、下划线_、$符号;
- 不能以数字开头;
- 不能使用Java关键字或保留字;
- 区分大小写;
注意事项:
(1)当声明的类使用public关键字修饰时,源文件名必须和类名保持一致;
(2)一个.java源文件中可以声明多个类,但是只能有一个public修饰的类,文件名要和public修饰的类名保持一致;
(3)类中可以继续声明类,称为内部类;
类的声明与实例化
类必须先定义才能使用。类是创建对象的模板,创建对象也叫类的实例化。
下面通过一个简单的例子来理解Java中类的定义:
public class Dog
{
String name;
int age;
void bark()//汪汪叫
{
System.out.println("汪汪,不要过来");
}
void hungry()
{
System.out.println("主人,我饿了");
}
}
对示例的说明:
- public 是类的修饰符,表明该类是公共类,可以被其他类访问。
- class 是定义类的关键字。
- Dog是类的名称。
- name,age是类的成员变量,也叫属性;bark(),hungry()是类中的函数,也叫方法。
- 一个类可以包含以下类型变量:
- 局部变量:在方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
- 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化(分配内存)。成员变量可以被类中的方法和特定类的语句访问。
类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。static也是修饰符的一种
构造方法
在类实例化的过程中自动执行的方法叫做构造方法,它不需要你手动调用。构造方法可以在类实例化的过程中做一些初始化的工作。
构造方法的名称必须与类的名称相同,并且没有返回值。
每个类都有构造方法。如果没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认的构造方法。
public class Dog
{
String name;
int age;
//构造方法,没有返回值
Dog(String name1,int age1)
{
name = name1;
age = age1;
System.out.println("感谢主人领养了我");
}
//普通方法,必须有返回值
void bark()
{
System.out.println("汪汪,不要过来");
}
void hungry()
{
System.out.println("主人,我饿了");
}
public static void main(String[] args)
{
//创建对象时传递的参数要与构造方法参数列表对应
Dog myDog = new Dog("花花",3);
}
}
运行结果:
感谢主人领养了我
package day23;
/*构造方法
- 作用是用于初始化参数
- 所有的数字变量全部设置为0
- 所有的boolean类型全部设置为false
- 所有的对象变量全部设置为null
*/
/*
- 设计自己的构造方法
- 方法名称必须和类的名称相同
- 没有返回值
*/
/*
- 如果自己写了有参的构造方法,那么编译器不会再提供
- 默认的构造方法了
- 如果我们还想用无参的构造方法,
- 那么需要手动实现
*/
public class People
{
String name;
String sex;
int age;
//无参的构造方法(可以不写编译器自动加上,前提是没有任何其他构造方法)
People()//构造方法(可删掉,编译器默认加上)
{
// name = null;
// sex = null;
// age = 0;
}
//有参的构造方法
People(String name,String sex,int age)
{
this.name = name;
this.sex = sex;
this.age = age;
}
//部分初始化
People(String name)
{
this.name = name;
}
People(String name,int age)
{
this.name = name;
this.age = age;
}
public static void main(String[] args)
{
People p = new People();
System.out.println(p.name);
System.out.println(p.sex);
System.out.println(p.age);
People p1 = new People("张三","男",30);
System.out.println(p1.name+","+p1.sex+","+p1.age);
People p2 = new People("老王");
System.out.println(p2.name);
People p3 = new People("小老虎",3);
System.out.println(p3.name+","+p2.age);
}
}
说明:
构造方法不能被显式调用。
构造方法不能有返回值,因为没有变量来接收返回值
创建对象
对象是类的一个实例,创建对象的过程也叫类的实例化。对象是以类为模板来创建的。
在Java中,使用new关键字来创建对象,一般有以下三个步骤:
声明:声明一个对象,包括对象名称和对象类型
实例化:使用关键字new来创建一个对象。
初始化:使用new创建对象时,会调用构造方法初始化对象。
例如:
Dog myDog;//声明一个对象
myDog = new Dog("花花",3);//实例化
也可以在声明的同时进行初始化:
Dog myDog = new Dog("花花",3);
访问成员变量和方法
通过已创建的对象来访问成员变量和成员方法,例如:
//实例化
Dog myDog = new Dog("花花",3);
//通过点号访问成员变量
myDog.name;
//通过点号访问成员方法
myDog.bark();
下面的例子演示了如何访问成员变量和方法:
public class Dog
{
String name;
int age;
Dog(String name1,int age1)
{
name = name1;
age = age1;
System.out.println("感谢主人领养了我");
}
void bark()
{
System.out.println("汪汪,不要过来");
}
void hungry()
{
System.out.println("主人,我饿了");
}
public static void main(String[] args)
{
Dog myDog = new Dog("花花",3);
//访问成员变量
String name = myDog.name;
int age = myDog.age;
System.out.println("我是一只小狗,我名字叫" + name + ",我" + age + "岁了");
//访问方法
myDog.bark();
myDog.hungry();
}
}
运行结果:
感谢主人领养了我
我是一只小狗,我名字叫花花,我3岁了
汪汪,不要过来
主人,我饿了
变量声明与使用
变量概述
在程序执行的过程中,在某个范围内其值可以发生改变的量
从本质上讲,变量其实是内存中的一小块区域
变量定义格式
声明语法:
数据类型 变量名 ;
赋值:
变量名 = 值;
数据类型 变量名 = 初始化值; //定义变量就是在内存中分配一块区域用来存放值,数据类型就是规定这块内存区域只能存放指定类型的值
public class Hello{
public static void main(String[] args){
//声明整数类型的a,在内存中创建这个变量
int a;
double b;
double c;
//给变量赋值
a = 1;
b = 2;
System.out.println(a/b);
}
}
函数声明与使用
访问修饰符 返回值类型 函数名称(参数类型 参数名称){
函数体
}例如
public void setXXX(String a){//无返回值的带参函数
this.a = a;
}
public String getXXX(String a){//有返回值的带参函数
return a;
}
public void setXXX(){//无返回值的无参函数
String a;
this.a = a;
}
public String getXXX(){//有返回值的无参函数
String a = "";
基本数据类型
基本数据类型(四类八种)
引用数据类型(类,接口,数组)
浮点类型原理:
float和double的范围是由指数的位数来决定的。
float的指数位有8位,而double的指数位有11位,分布如下:
float:
double:
V=(-1)^符号位 * 尾数位 * 2^指数位
所以,float的指数范围为-128~+127(-2^7~2^7-1),而double的指数范围为-1024~+1023(-2^10~2^10-1),并且指数位是按补码的形式来划分的。
其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。
float的范围为-2^128 ~ +2^127,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1023,也即-1.79E+308 ~ +1.79E+308。
float和double的精度是由尾数的位数来决定的。尾数的取值范围为取值范围为[1,2)或[0,1)。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
float:2^23 = 8388608,一共七位,由于最左为1的一位省略了,这意味着最多能表示8位数: 2*8388608 = 16777216 。有8位有效数字,但绝对能保证的为7位,也即float的精度为7~8位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为16~17位。之所以不能用f1==f2来判断两个数相等,是因为虽然f1和f2在可能是两个不同的数字,但是受到浮点数表示精度的限制,有可能会错误的判断两个数相等!
注意事项:
整数默认是int类型,浮点数默认是double类型.
定义long数据类型的时候,要加l或者L,建议加L. long i = 10000000000; 会报超出整数过大,因为没加L默认为int类型的值
定义float数据类型的时候,要加f或者F,建议加F float j = 12.34; 会报可能损失精度,因为12.34默认为double类型,把double类型的值放入float中会损失精度
运算符
1、算术运算符
重点掌握:取模(%)、自增自减(++a,a++)
示例代码:
|
2、关系运算符(条件运算)
3、赋值运算
4、逻辑运算符
5、位运算
代码示例:
// boolean a = 1>2; // false // boolean b = 1==1;// true // // System.out.println(a & b);//短路与 // System.out.println(a | b);//短路或
// int a = 3;// 转为二进制:11 // int b = 2;// 转为二进制:10
char a = 'a';// 97 --> 1100001 char b = 'b';// 98 --> 1100010 // 1100000 --> 96 // 1100011 --> 99 // 0000011 --> 3
System.out.println(a & b);// & 表示对应位都为1,结果为1,否则为0 System.out.println(a | b);// | 表示对应位都为0,结果为0,否则为1 System.out.println(a ^ b);// ^ 表示对应位相同,结果为0,否则为1 |
异或(^)作为逻辑运算符时,符号两边相同时返回false,两边不同时返回true;
6、条件运算符
语法:
变量类型 变量名 = 条件 ? A : B ;
解读:
声明一个变量,当条件为true时,当前变量的值为A,当条件为false时,当前变量的值为B;
代码示例:
|
|
修饰符
java中的修饰符分为类修饰符,字段修饰符,方法修饰符。根据功能的不同,主要分为以下五种。
1、权限访问修饰符
public,protected,default,private,这四种级别的修饰符都可以用来修饰类、方法和字段。
2、final修饰符
final的意思是不可变,他可以修饰类、字段、方法。修饰类后类不能被扩展(extends),也就是不能被继承。修饰字段后字段的值不能被改变,因此如果有final修饰字段,应该对字段进行手动初始化。修饰方法后该方法不能被改变,也就是重写。
3、abstract修饰符
abstract是抽象的意思,用来修饰类和方法,修饰类后,该类为抽象类,不能被实例化,必需进行扩展。修饰方法后,该方法为抽象方法必须被子类重写(override)。
4、static修饰符
static用来修饰内部类,方法,字段。修饰内部类说明该内部类属于外部类而不属于外部类的某个实例。修饰字段说明该字段属于类而不属于类实例。修饰方法说明该方法属于类而不属于类实例
5、volatile修饰符
易失 ( 共享 ) 域修饰符 volatile 是用来说明这个成员变量可能被几个线程所控制和修改。也就是说在程序运行过程中,这个成员变量有可能被其它的程序影响或改变它的取值。
注释
单行注释
语法:
//这一行是注释
多行注释
/*
* 多行注释
* 多行注释
*/
文档注释
/**
* 这是一个测试的类
* @author
*
*/
注释的作用
解释说明程序,提高程序的阅读性
常量分类
字符串常量 用双引号括起来的内容(“HelloWorld”)
整数常量 所有整数(12,-23)
小数常量 所有小数(12.34)
字符常量 用单引号括起来的内容(‘a’,’A’,’0’)
布尔常量 较为特有,只有true和false
空常量 null(数组部分讲解)