2.概述
2.1计算机语言概述
-
什么是计算机语言:
-
计算机语言是人于计算机之间通讯的语言
-
什么是机器语言:
-
由‘0’和‘1’组成的语言,是可以直接被计算机硬件直接识别的语言。
-
汇编语言
-
用简介的英文字母,字符串替代特定的指令的二进制串。运行时最终转换为机器语言,应用于操作系统的核心,如linux内核,工业控制设备等
-
高级语言
-
接近于数学语言或人的自然语言,不依赖于计算机;
-
优点:降低移植的成本,缩短了开发周期;
-
高级语言可分为非结构化语言,结构化语言和面向对象语言;
-
非结构化语言:按顺序排列的命令,每句占有一行,且有对应的标签;
-
结构化语言:强调对代码的封装,封装于函数中;
-
面向对象语言:最主流的语言,可以实现更高一级的抽象与封装,且提供了多态与继承功能,具有更好地扩展性与重用性;
2.2 Java
-
Java入门
-
Java SE:Java平台标准版
-
Java EE:平台标准版
-
Java EE:Java微型版
-
Java运行机制:包括编译和解释两个部分;
-
JDK,JRE,JVM的关系
-
JDK包含JRE,JRE包含JVM
-
JAR:Java Archive 与平台无关的文件格式,可以将多个文件组合为一个压缩软件;
-
设置环境变量
-
系统环境:JAVA_HOME C:Program Files\Java\jdk 1.7.0_25;
-
用户环境:Path %JAVA_HOME%\bin;
-
用户环境:CLASS_PATH %JAVA_HOME%\lib;
-
分为三步:先设置总路径:JAVA_HOME,设置命令路径:Path,最后加载类路径:CLASS_PATH;
-
Java的包命名:企业+企业名+当前项目+文件名
如:com.eoe.basic.day01;
2.3 Eclipse(集成开发环境)
-
Eclipse开发:
-
文字编辑:Preferences -> Appearance -> Color and Font -> Basic -> Text Font -> Edit
-
Eclipse来创建Java项目
-
New -> Java :
Project Name:corejava 确定即可;
在src中创建包:com.jikexueyuan.ch02;
包中创建类:Name Test01; -
Java项目
-
Java 项目结构:
Windows -> Show View -> Navigator;
右击项目名 ->Properties ->Resource; -
项目的导出
-
可以在workspace中;
-
右击项目名: -> Export -> General -> Archive File -> next (type filter text) -> To archive file ;
-
项目的导入
-
删除:勾选删除项目磁盘中的文件。
-
导入:右键 -> Import -> General -> Existing Projects into workspace, next ->非压缩: Select root directory , 压缩:select archive file : 选择corejava.zip ->导入成功。
2.4 Eclipse 快捷键
- syso + Alt + \ 可以直接调用输出:System.out.println();
- Eclipse ->Preference ->编辑器 -> 文本编辑器(显示行号)
- Alt + Shift + M可以实现设置方法
- Source -> Getter and Setter 可以设置get方法和set方法
- 断点 + debug模式调试
- 设置断点;
- 在debug模式下运行;
- 单步执行(F5或Step in);
3.Java类方法详解
3.1 static 关键字(类方法与静态方法)
- 由static修饰的方法为静态方法和类方法;
- 由static修改的变量被称为静态变量,也称为类变量。静态变量定义的位置是在所有方法之外。
- 静态方法和静态变量都是从磁盘加载至内存后被创建。与类同时存在,同时消亡。
- 静态变量又称为类的成员变量,在类中时全局变量,也可以被类中所有方法调用。
- 静态变量的值可由JVM自动初始化,以下是各类型变量初始化列表。
- 实例
import java.util.Scanner;
public class Test01 {
static String name;
static char sex;
static int age;
static double height;
static String type;
public static void main (String[] args) {
//张飞,男,豪放
Scanner scan = new Scanner(System.in);
System.out.print("姓名:");
name = scan.next();
System.out.print("性别:");
sex = scan.next().charAt(0);
System.out.print("年龄:");
age = scan.nextInt();
System.out.print("身高:");
height = scan.nextDouble();
System.out.print("性格:");
type = scan.next();
System.out.print("嗨, 大家好! 我叫" + name);
System.out.print(", 今年" + age +"岁");
System.out.print(", 身高" + height +"米");
System.out.print(", 我是一个" + type + sex + "士。");
}
}
3.2 定义无参方法
- Java代码通常封装于类中;
- 无参方法的格式:
static void 方法名() {
方法体-方法中的代码块;
}
- 定义方法的好处:
- Java代码通常在方法中编写;
- 实现模块化编程,具有不同功能的代码封装于不同方法中,便于去管理,编程;
- 具有复用价值;
- 实例:
import java.util.Scanner;
public class Test02 {
static String name;
static char sex;
static int age;
static double height;
static String type;
static void input() {
//张飞,男,豪放
Scanner scan = new Scanner(System.in);
System.out.print("姓名:");
name = scan.next();
System.out.print("性别:");
sex = scan.next().charAt(0);
System.out.print("年龄:");
age = scan.nextInt();
System.out.print("身高:");
height = scan.nextDouble();
System.out.print("性格:");
type = scan.next();
System.out.print("嗨, 大家好! 我叫" + name);
System.out.print(", 今年" + age +"岁");
System.out.print(", 身高" + height +"米");
System.out.print(", 我是一个" + type + sex + "士。");
scan.close();
System.out.println();
}
public static void main (String[] args) {
input();
System.out.print("嗨, 大家好! 我叫" + name);
System.out.print(", 今年" + age +"岁");
System.out.print(", 身高" + height +"米");
System.out.print(", 我是一个" + type + sex + "士。");
System.out.println("\n");
input();
System.out.print("嗨, 大家好! 我叫" + name);
System.out.print(", 今年" + age +"岁");
System.out.print(", 身高" + height +"米");
System.out.print(", 我是一个" + type + sex + "士。");
}
}
3.3 定义带参方法
- 定义格式:
static void 方法名(类型1 变量1, 类型2 变量2....) {
方法体-方法中的代码块;
}
- 带参方法的好处:可接收外界传递的数据,使方法能处理更为复杂的问题;
- 实例:
import java.util.Scanner;
public class Test03 {
static String name;
static char sex;
static int age;
static double height;
static String type;
static void input() {
//张飞,男,豪放
Scanner scan = new Scanner(System.in);
System.out.println("姓名:");
name = scan.next();
System.out.println("性别:");
sex = scan.next().charAt(0);
System.out.println("年龄:");
age = scan.nextInt();
System.out.println("身高:");
height = scan.nextDouble();
System.out.println("性格:");
type = scan.next();
/*
* NoSuchElementException
* 不能用.close()方法是因为,每次使用Scanner创建的对象都是由System.in封装而来
* 实际上每次创建的对象都是用同一个输入流。
* 调用.close()方法实际上是System.in.close()。
* */
//scan.close();
}
public static void main (String[] args) {
input();
System.out.print("嗨, 大家好! 我叫" + name);
System.out.print(", 今年" + age +"岁");
System.out.print(", 身高" + height +"米");
System.out.println(", 我是一个" + type + sex + "士。");
feeling("我捡到了500万","哈哈。。。");
input();
System.out.print("嗨, 大家好! 我叫" + name);
System.out.print(", 今年" + age +"岁");
System.out.print(", 身高" + height +"米");
System.out.println(", 我是一个" + type + sex + "士。");
feeling("我失恋了","呜呜。。。");
}
static void feeling(String cause, String content) {
System.out.println(cause);
System.out.println(content);
}
}
3.4 定义带参方法
- Java中的Math定义了许多的带返回值方法:
- 如:double Math.sqrt(double value);
- Java允许自定义带返回值的方法
static void 方法名(类型1 变量1, 类型2 变量2....) {
方法体-方法中的代码块;
return 数据;
}
- 实例
public class Test04 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println("3.784保留两位小数位"+ pround(3.784,2));
}
static double pround(double value, int index) {
//1.将值乘以10的n次幂
double vpow = value * Math.pow(10, index);
//2.对小数点后进行四舍五入
double result = Math.round(vpow);
//3.还原小数
result = result / Math.pow(10, index);
return result;
}
}
4.变量与数据类型
4.1 数据类型初阶
- Java定义了基本的数据类型,引用数据类型,自定义类型;
- 常用为八种基本数据类型和引用数据类型的String类型
- 栈空间
- 效率高,先进先出的特点,JVM通常将基本数据类型的数据放入栈中;
- 堆空间
- 效率较低,随机分配内存,可存储大容量的数据;
4.2 变量
- 变量可分为:
- 可变的量;
- 常量:不可变的量;
- 字面量:常量与变量具体存储的量;
- 变量的命名
- 首字母为英文字母,$或下滑线;
- 由字母、数字或下滑线组成
- 首字母不大写(尽量),不用中文
- 非关键字
- 用变量简化计算:
- 实例:用变量保存多种类型的数据:
public class Test02 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
String phoneType = "小米";
String operationSystem = "android";
short numberCpu = 2;
double price = 1999.0;
System.out.print("手机品牌:" + phoneType + "\n操作系统:" + operationSystem
+ "\nCPU数:" + numberCpu + "\n价格:" + price);
}
}
-
变量的作用域
-
Java用一对大括号作为语句块的范围,为作用域;
-
离开了作用域,变量所分配的内存空间将会被JVM回收
-
实例:
public class Test03 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
{
String name = "张三";
System.out.println(name);
}
/*
* 因为之前的“张三”作用于在大括号中,离开大括号,name将被JVM回收
* 因此运行不会出错
* 大括号表示变量的作用域
* */
String name = "李四";
System.out.println(name);
//相反则不行如:
// String name = "李四";
// System.out.println(name);
// {
// String name = "张三";
// System.out.println(name);
// }
}
}
4.3 基本数据类型的包装类
- 八大基本数据类型的包装类:
- byte 对应于 Byte
- short 对应于 Short
- int 对应于 Integer
- long 对应于 Long
- float 对应于 Float
- double 对应于 Double
- char 对应于 Character
- boolean 对应于 Boolean
- 包装类中包装了很实用的方法和常量:
- 如:Byte.MIN_VALUE;
- 包装类在集合中,是用来定义集合元素的类型;
- 实用型类方法:
//int类型实用型
1. Integer.MIN_VALUE //int最小值
2. Integer.MAX_VALUE //int最大值
3. int Integer.parseInt(String sInteger);
4. String Integer.toBinaryString(int value);
5. String Integer.toHexString(int value); //十六进制
//int类型实用型
1. double Double.parseDouble(String sDouble);
2. double Double.MAX_VALUE;
3. String Double.toBinaryString(double value);
4. String Double.toHexString(double value);
- 实例:
public class Test04 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println("Int 最大值:" + Integer.MAX_VALUE);
System.out.println("Int 最小值:" + Integer.MIN_VALUE);
System.out.println("字符转换:32149 " + Integer.parseInt("32149"));
System.out.println("转化为二进制:32149 " + Integer.toBinaryString(32149));
System.out.println("转化为十六进制:32149 " + Integer.toHexString(32149));
System.out.println("Byte 最大值:" + Byte.MAX_VALUE);
System.out.println("Byte 最小值:" + Byte.MIN_VALUE);
System.out.println("字符转换:117 " + Byte.parseByte("117"));
}
}
4.4 八大数据类型
- Java地层中,byte、short均可以通过转化为int计算;
- float与double 类型都是以约数进行表示;
- char类型:
- 可以为英文,汉子,字符,数字,’\n’;
- Java底层中用16为表示char,其编码格式为Unicode编码;
- Java对char的处理是先将其转化为int类型;
- 类型转化:
- 小类型向大类型转化时,若小类型精度> 大类型精度,则会丢失精度;
- 大类型向类型转化时,注意边界数问题;
- 实例:
public class Test05 {
public static void main(String[] args) {
for (int i=0, count=0; i<128; i++,count++) {
System.out.print((char)i+":"+i+"\t");
if ((count+1) % 10 ==0)
System.out.println("\n");
System.out.println("\"");
}
}
}
5.逻辑运算
5.1逻辑运算的种类
- 逻辑运算在关系运算之上,其返回结果为true或false;
- 常用逻辑运算为:&, &&; |, ||; !
- 逻辑运算又分为长路逻辑运算和短路逻辑运算;
- 非>与>或
5.2长路、短路“与”运算
- &
- 在两边为整数时,是逐位与运算;
- 在两边为关系运算时,是逻辑运算;
- 长路与运算,会把两边的关系运算的结果都计算出来;
- &&
- 当左边为关系运算为false时,不再计算右边;
5.3长路、短路“或”运算
- |
- 在两边为整数时,是逐位或运算;
- 在两边为关系运算时,是逻辑运算;
- 长路或运算,会把两边的关系运算的结果都计算出来;
- ||
- 当左边为关系运算为true时,不再计算右边;
6 数组
6.1 数组的声明与内存分配
- 形式一:type arrayName[];
- 形式二:type[ ] arrayName;
- 为数组分配内存,如果没有分配内存,则无法访问元素,通常用new类分配内存;
- 实例:
public class ArrayDemo1 {
public static void main (String[] args){
int score[];
score = new int[3];
for (int i=0; i<3; i++) {
System.out.println(score[i]);
}
for (int i = 0; i < score.length; i++) {
score[i] = 2*i + 1;
System.out.println(score[i]);
}
}
}
6.2 数组的初始化
- 数组的初始化包括静态初始化和动态初始化;
- 实例
public class ArrayDemo2 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int array[] = {44, 24, 25, 6, 37};
int max = array[0], min = array[0];
for (int i = 0; i < array.length; i++) {
if(array[i] > max) {
max = array[i];
}
if (array[i] < min) {
min = array[i];
}
}
System.out.println("min="+min);
System.out.println("max="+max);
}
}
6.3 二维数组
- 二维数组声明与一维数组类似,用new来分配内存;
- 如:type arrayName[][] = new type[行][列];
- 静态初始化:
- 如:type arrayName[] = { {value 1} , {value 2} , {value 3} };
public class ArrayDemo4 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int score[][];
score = new int[5][5];
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
System.out.print(score[i][j]+" ");
}
System.out.println();
}
}
}
6.4 冒泡排序和选择排序
import java.util.Scanner;
/*
* 冒泡排序
*/
public class ArrayDemo3 {
public static void main (String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入整数个数:");
int N = scan.nextInt();
int array[] = new int[N];
System.out.println("请输入数组");
for (int i = 0; i < N; i++) {
array[i] = scan.nextInt();
}
scan.close();
//冒泡排序
int temp;
for (int i = N-1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (array[j] > array[j+1]) {
temp = array[j];
array[j] = array [j+1];
array[j+1] = temp;
}
}
}
for (int i = 0; i < N; i++) {
System.out.println("array=" + array[i]);
}
/*
* 选择排序
*/
for (int i = 0; i < N-1; i++) {
for (int j = i+1; j < N-1; j++) {
if (array[i] > array[j]) {
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
}
}
7. 类与对象概念的使用
7.1 Java方法的创建与重载
- 方法的定义:可以重复调用的代码段;
- 方法的重载:方法名称相同,类型相同,参数的类型和个数不同,通过传递参数的个数和类型来完成不同的功能。
public void tell() {};
public void tell(int i, String s) {};
class Person {
public int age;
public String name;
public void tell () {
System.out.println("ΠΥΓϋ£Ί" + name);
System.out.println("ΔκΑδ£Ί" + age);
}
}
public class ClassTemo {
public static void main(String[] args) {
Person per = new Person();
per.name = "ΥΕΘύ";
per.age = 23;
per.tell();
}
}
7.2 类的创建以及类与对象的关系
- 类与对象的关系:
- 类是对某一事物的描述,是抽象的,概念的意义;
- 对象是实际存在的该类事物的每一个个体,也称为实例;
- 实例:
class People {
int age;
String name;
public People (String name, int age) {
System.out.println("姓名:" + name + "年龄:" + age);
}
public People (String name) {
System.out.println("姓名:" + name);
}
}
public class ClassDemo3 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
People per = new People("张三", 15);
People per2 = new People("张三");
}
}
public class ClassTemo {
public static void main(String[] args) {
Person per = new Person();
per.name = "ΥΕΘύ";
per.age = 23;
per.tell();
}
}
7.3 Java面向对象的思想的编程
- 程序的发展历程:面向过程→面向对象
- 面向过程:不去想什么样的盒子,随机制作盒子;
- 面向对象:先想好要制作什么样的盒子,再去找对应的工具制作;
- 面向对象三大特性:
- 封装性:对外部不可见;
- 继承:扩展类的功能;
- 多态:方法的重载,对象的多类性;
- 实例:
在这里插入代码片
7.4 Java方法的递归调用
- 实例:
public class MethodDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println("1+2+..+100=" + addNum(100));
}
public static int addNum(int num) {
if (num == 1) {
return num;
}else {
return num + addNum(num-1);
}
}
}
8. 面向对象的基本特性
8.1 封装性的使用
- 封装的目的:保护属性与方法不被外部看见;
- 封装的实现:为属性和方法进行的封装是通过private关键字来声明的;
8.2 匿名对象的使用
- 匿名对象是指没有名字的对象,如果程序中只使用了一次该对象,可使用匿名对象的方式;
8.3 java构造对象的使用
- 构造方法的特点:
- 不需要返回值类型;
- 与类名一致;
- 自动执行;
- 无法调用;
- 构造方法的功能:为类中属性初始化;
- 构造方法可以重载
9. Java对象:继承
9.1 继承
- 继承的基本概念
- 扩展父类的功能;
- Java中通过extends关键字完成继承;
- Java继承的限制:
- Java中只允许单继承
- 子类不能直接访问父类的私有成员;
- 子类对象的实例化:
- 在子类对象实例化之前,必须先调用父类的构造方法,之后调用子类构造方法;
- 实例
class People {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
class Worker extends People{
public void tell() {
System.out.println("年龄"+ getAge());
}
}
public class ExtendsDemo2 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Worker work = new Worker();
work.setAge(23);
work.tell();
}
}
9.2 方法的重写与super关键字
- 重写:子类中定义了与父类同名的方法;
- 定义:方法名称相同,返回值类型相同,参数相同;
- 限制:子类不能有被父类更低的访问权限;
- 访问权限:private < default < public;
- private在当前类中可以被访问;default在当前包中可以被访问;public在整个工程中都可以被访问;
- super关键字:强行调用父类的方法执行;
- 实例
class Father {
private int age;
private String name;
public Father(){
System.out.println("父类的构造方法");
}
}
class Son extends Father{
public Son() {
System.out.println("子类的构造方法");
}
}
public class ExtendsDemo3 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Son s =new Son();
}
}
class A{
public void tell() {
System.out.println("我是tell方法");
}
private void say() {
}
void print() {
}
}
class B extends A{
public void tell() {
super.tell();
System.out.println("我重写了tell方法");
}
}
public class ExtendsDemo4 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
}
}
9.3 Java的重写与重载的区别
- super关键字:强行调用父类的方法执行;
- super不一定在重写中使用,也可以表示哪些方法是从父类中继承过来的;
- 重载
- 方法名称相同,参数类型或者个数不同;
- 对权限没有要求;
- 发生在一个类中;
- 重写
- 方法名称,参数类型,返回类型均相同;
- 子类不能拥有比父类更低的访问权限;
- 发生在继承中;
10. Java面向对象:多态
- 多态性:
- 方法的重载与重写;
- 对象的多态性;
- 对象的多态性:
- 向上转型:程序会自动完成;
如:父类 父类对象 = 子类实例; - 想下转型:强制类型转换:
如:子类 子类对象 = (子类) 父类实例; - 在Java中可通过instanceof关键字判断一个对象是否为一个类的实例;
- 无论何时,不要去继承一个已经完成的类;
- 实例:
class A1 {
public void tell1() {
System.out.println("A1---tell1");
}
}
class B1 extends A1 {
public void tell2() {
System.out.println("B1---tell2");
}
}
class C1 extends A1 {
public void tell3() {
System.out.println("C1---tell3");
}
}
public class PolDemo2 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
say(new B1()); //这里自动进行了类型转换:A1 a = new B1();
say(new C1()); //这里自动进行了类型转换:A1 a = new C1();
}
public static void say(A1 a) {
a.tell1(); //每次调用类型A,B,C,自动输出tell1();
}
// public static void say(B1 b) {
// b.tell1(); //每次调用类型A,B,C,自动输出tell1();
// }
// public static void say(C1 c) {
// c.tell1(); //每次调用类型A,B,C,自动输出tell1();
// }
}