第一章 Java概述
1.1.1 Java起源以及发展历程
Java语言出现在1995年
Java之父:James Gosling
官方网站:java.sun.com
1.1.2 Java语言简介
- 一种面向对象的编程语言(OOP)
- 它的语法结构与C和C++语言极为相似
- 所用的语法十分简单是C+ + - -
- 无直接指针操作
- 自动内存管理
- 数据类型长度固定
- 不用头文件
- 不包含结构和联合
- 不支持宏
- 不用多重继承
- 无类外全局变量
- 无GOTO
- 可以实现很多开发
- 面向对象的应用开发
- 各类网络应用程序的开发
- 计算过程的可视化
- 动态画面/交互操作
- Internet的系统管理
- 数据库操作
- And more ……
1.2.1 Java语言优势
- 资源免费
- 跨平台
- 健壮、安全
- 高性能
- 简单
- 面向对象
- 动态性
- 多线程
1.2.2 Java应用平台
- Java SE 标准版
- Java EE 企业版
- Java ME 微型版
1.2.3 专有名词
-
JDK:Java开发工具包
JDK=JRE+Tools
-
JRE:Java运行环境
JRE = JVM + API(Lib )
-
JVM:Java虚拟机
-
SDK:开发工具包
JVM、JRE、JDK关系
1.2.4 Java跨平台原理
- JVM附着在句题的操作系统之上,将字节码转换为特定机器上的机器码,然后在特定的机器上运行。
一次编译随处运行流程
- Java字节码的跨平台使Java程序具有一次编译随处运行的特性,流程如下:
Java字节码执行方式
- 解释执行方式
- 即时编译方式(JIT)
1.2.5 垃圾回收机制
- 垃圾回收就是清理不再使用的对象时方可内存空间,Java程序的内存分配和回收都是由JRE在后台自动进行的。
- 垃圾回收的特点
- 内存优化
- 动态回收
- 回收的不确定性
- 占用系统开销
1.3.1 JDK安装配置
-
步骤一:下载JDK
-
步骤二:安装JDK
-
步骤三:配置环境变量
需要配置的环境变量:
JAVA_HOME=JDK安装文件位置 PATH=%JAVA_HOME%\bin CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
1.3.2 JDK目录
- bin:JDK包中命令及工具所在目录
- jre:运行环境目录
- lib:类库所在目录
- db:附带数据库目录
- include:包含本地代码的C头文件的目标
- src.zip:源代码压缩文件
1.3.3 JDK常用工具
- javac:Java语言编译器
- java:Java字节码解释器
- javadoc:文档生成器
- javap:Java字节码分解程序
- javah:Jni编程工具
- appletviewer:小应用程序浏览工具
- jar:打包程序
1.4.1 对象(object)——一个可标识的存储区域
Person p = new Person()
1.4.2 类(class)——具有共同属性和行为的对象集合
class Person{
int age;
String name;
void sayHello() {…}
}
类和对象的关系
- 类是对象的抽象模板
- 对象是类的实例
1.4.3 面向对象的三大特征
- 封装性
- 继承性
- 多态性
1.4.4 封装
- 模块化:将属性和行为封装在类中,程序定义很多类
- 信息隐蔽:将类的细节部分隐藏起来,用户只通过受保护的接口访问某个类
class Person{
private int age;
private int getAge(){return age;}
public void setAge(int a){age = a}
String name;
void sayHello(){…}
}
1.4.5继承
继承性:父类和子类之间共享数据合方法
继承的好处
- 更好地进行抽象和分类
- 增加代码的重用率
- 增加可维护性
//父类
class Person{
int age;
String name;
void sayHello(){…}
}
//子类
class Student extends Person{
String school;
double score;
void meetTeacher(){…}
}
1.4.6 多态
多态
- 不同的对象收到同一个消息(调用方法)可产生完全不同的效果
- 实现的细节由接收对象自行决定
1.4.7 面向对象设计思想的要点
- 认为客观世界由各种对象组成
- 程序的分析和设计都围绕着
- 有哪些对象类
- 每个类有哪些属性、哪些方法
- 类之间的关系(继承、关联等)
- 对象之间发出消息(调用方法)
1.5 第一个Java程序
1.5.1 Java程序的类型
Application程序
public class HelloWorldApp{
public static void main(String args[]){
System.out.println("Hello World");
}
}
- class是主体
- public类名与文件同名
- main()的写法是固定的
Applet程序
import java.awt.*;
import java.applet.*;
import javax.swing.*;
public class HelloWorldApplet extends JApplet {
public void paint(Graphics g){
g.drawString("Hello World",20,20);
}
}
- import表示导入
- extends JApplet表示继承
- 由paint()方法,表示如何绘制
- 没有main()方法
Java程序的基本构成
- package语句(0或1句)
- import语句(0或多句)
- 类定义——class(1或多个)
- 一个文件智能有一个public类
- 类=类头+类体
- 类成员=字段(filed,属性,变量)+方法(method,函数)
- 方法=方法头+方法体
1.5.2 开发Java程序的基本步骤——编辑、编译与运行
- 源程序编辑
- 程序编译(javac)
- 程序运行(java工具——JDK)
- JDK安装后文件夹介绍
- bin:工具文件
- jre:运行环境
- demo:示例文件
- include:与C相关的头文件
- lib:程序库
- db:数据库相关
Application的编辑、编译与运行
-
程序编辑:编辑器——文件名要与public class的类名一致
- 区分大小写
-
程序编译——转换为字节码文件,拓展名.class
javac hello.java
javac -d classes x1.java x2.java
-
程序的运行——执行.class文件中的指令的过程
java hello
java -cp classes package
path和classpath的区别:
path是命令(javac,java)的路径,classpath是所要引用的类的路径
Applet的编辑、编译与运行
Java Applet程序必须嵌入到 HTML中,并由负责解释HTML 文件的 WWW 浏览器充当解释器,解释执行程序。
-
源程序的编辑和编译
-
在HTML文件里嵌入Applet
-
使用标签:
<applet code = "HelloWorldApplet.class"> width=200 height=40 background=white>
-
1.6.1 输入输出
文本界面
- Scanner类
- java.util.Scanner包
- in&out
- java.io包
方法 | 特点 |
---|---|
System.out.println() | 再打印后加上回车换行 |
System.out.print() | 连续打印 |
-
示例
public class PrintSample { public static void main(String[] args) { String s = "Hello"; char c = 'c'; System.out.println("String is:" + s); System.out.println("char is:" + c); } }
图形界面
- 使用文本框对象(TextField)获取用户输入的数据
- 使用标签对象(Label)或文本框对象输出数据
- 使用命令按钮(Button)来执行命令
示例
- add(xxxx)加入对象
- btn.addActonListener处理事件
- actionPerformed()具体处理事件
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class AppletInOut extends java.applet.Applet
{
TextField in = new TextField(10);
Button btn = new Button("求平方根");
Label out = new Label("用于显示结果的标签");
public void init()
{
setLayout( new FlowLayout() );
add( in );
add( btn );
add( out );
/*btn.addActionListener( new BtnActionAdapter() );
}
class BtnActionAdapter implements ActionListener
{
public void actionPerformed( ActionEvent e )
{
String s = in.getText();
double d = Double.parseDouble( s );
double sq = Math.sqrt(d);
out.setText( d + "的平方根是:" + sq );
}*/
//Java8可以简写为e->{…}
btn.addActionListener( e->{
String s = in.getText();
double d = Double.parseDouble( s );
double sq = Math.sqrt(d);
out.setText( d + "的平方根是:" + sq );
});
}
}
1.6.2 注释
-
单行注释
-
语法:
//单行注释
-
-
多行注释:
-
语法:
/*多行注释*/
-
-
文档注释
-
语法:
/**文档注释*/
-
生成Java API文档
-
编写文档注释后,可以通过使用“javadoc”提取文档注释生成Java API文档。javadoc命令基本语法格式如下:
javadoc 选项 java源文件/清单文件
常用的javadoc标记
标记 | 作用 |
---|---|
@auther | 指定程序的作者。用于类或者接口的注释。 |
@version | 指定源文件的版本。用于类或接口前注释 |
@deprecated | 不推荐使用的方法。用于方法的注释 |
@param | 方法的参数的说明信息。用于方法的注释 |
@return | 方法的返回值的说明。用于方法的注释 |
@see | “参见”,用于指定交叉参考的内容 |
@exception | 抛出异常的类型。用于方法的注释。 |
@throws | 抛出的异常,和exception同义 |
1.7 IDE集成开发环境
- Eclipse,NetBeans
- IntelliJ IDEA
1.8 练习
案例分析
- 编写一个应用程序,验证以下等式是成立的:
3 3 + 4 3 + 5 3 = 6 3 6 3 + 7 3 + … + 6 9 3 = 18 0 3 3^3+4^3+5^3=6^3\\ 6^3+7^3+…+69^3=180^3 33+43+53=6363+73+…+693=1803
- 找到更多的这样的整数:一些相续正整数的立方和正好等于另一个整数的立方。
小分析:第一问要问的是:给定一个区域[a,b]以及给定的一个数c要证明: a 3 + ( a + 1 ) 3 + ( a + 2 ) 3 + … + b 3 = c 3 a^3+(a+1)^3+(a+2)^3+…+b^3=c^3 a3+(a+1)3+(a+2)3+…+b3=c3
第二问则是给定一个区域[a,b],要求出整数c满足: a 3 + ( a + 1 ) 3 + ( a + 2 ) 3 + … + b 3 = c 3 a^3+(a+1)^3+(a+2)^3+…+b^3=c^3 a3+(a+1)3+(a+2)3+…+b3=c3
案例实现
-
将变量封装在MathTest类中
封装示例:JavaBean
public class ClassName { //成员变量 //构造方法 //无参构造方法 //*有参构造方法 //成员方法 //getxxx() //setxxx() }
//MathTest.java public class MathTest { private int number; private int sum; /*public MathTest(){} public MathTest(int number,int sum) { this.number = number; this.sum = sum; }*/ public void setNumber(int number) { this.number = number; } /*public int getNumber(){ return number; }*/ public void setSum() { sum = (int) (sum + Math.pow(number,3)); //return sum; } public int getSum() { return sum; } }
-
第一问:证明 a 3 + ( a + 1 ) 3 + ( a + 2 ) 3 + … + b 3 = c 3 a^3+(a+1)^3+(a+2)^3+…+b^3=c^3 a3+(a+1)3+(a+2)3+…+b3=c3
import java.util.Scanner; public class Result { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("第一问:"); //输入区间下限a System.out.print("区间下限a:"); int a =scanner.nextInt(); //输入区间上限b System.out.print("区间上限b"); int b =scanner.nextInt(); //输入需要验证的结果c System.out.print("需要验证的结果c:"); int n =scanner.nextInt(); //调用MathTest类 MathTest test = new MathTest(); for(int i = a;i < b;i ++) { test.setNumber(i); test.setSum(); } for(int i = a;i <= b;i++) { test.setNumber(i); test.setSum(); } if (test.getSum() == n*n*n) { System.out.println("success"); } else { System.out.println("fail"); } } }
-
第二问:在给定区域[a,b]上下限a,b的条件下,寻找满足 a 3 + ( a + 1 ) 3 + ( a + 2 ) 3 + … + b 3 = c 3 a^3+(a+1)^3+(a+2)^3+…+b^3=c^3 a3+(a+1)3+(a+2)3+…+b3=c3的整数c。
由已知公式可知
1 3 + 2 3 + … + n 3 = [ [ n ( n + 1 ) ] 2 ] 2 1^3+2^3+…+n^3=[\frac{[n(n+1)]}{2}]^2 13+23+…+n3=[2[n(n+1)]]2
变形可得:
x 3 + ( x + 1 ) 3 + … + y 3 = ( 1 3 + 2 3 + … + y 3 ) − ( 1 3 + 2 3 + … + ( x − 1 ) 3 ) = ( y ( y + 1 ) 2 ) 2 − ( x ( x − 1 ) 2 ) 2 x^3+(x+1)^3+…+y^3\\=(1^3+2^3+…+y^3)-(1^3+2^3+…+(x-1)^3)\\=(\frac{y(y+1)}{2})^2-(\frac{x(x-1)}{2})^2 x3+(x+1)3+…+y3=(13+23+…+y3)−(13+23+…+(x−1)3)=(2y(y+1))2−(2x(x−1))2 -
import java.util.Scanner; import java.math.BigDecimal; public class Result2 { public static void main(String[] args) { long millis = System.currentTimeMillis(); Scanner scanner = new Scanner(System.in); System.out.println("Q2:"); //输入区间下限a System.out.print("first number:"); int a = scanner.nextInt(); //输入区间上限b System.out.print("last number:"); int b = scanner.nextInt(); double m; m = (b * (b + 1)) * (b * (b + 1)) - (a * (a - 1)) * (a * (a - 1)); double c = Math.cbrt(m / 4); BigDecimal temp = new BigDecimal(c); c = temp.setScale(7, BigDecimal.ROUND_HALF_UP).doubleValue(); if (c - (int) c == 0) { System.out.println(a + "^3+" + (a + 1) + "^3+" + "……+" + b + "^3=" + (int) c + "^3"); } else { System.out.println("cannot find"); } long millis1 = System.currentTimeMillis(); System.out.println("计算所用时间:" + (millis1 - millis) + "毫秒"); } }
总结
-
Java之父是詹姆斯•高斯林(James Gosling)
-
Java体系架构分3个平台:Java SE(基础)、Java EE(企业)和Java ME(微型)
-
JDK(Java Development Kit,Java开发工具包)是Sun公司提供的一套用于开发Java程序的开发包
-
JRE(Java Runtime Environment,Java运行环境)是运行Java程序所依赖的环境的集合
-
JVM(Java Virtual Machine,Java虚拟机)是一个虚构出来的计算机
-
Java是纯面向对象的编程语言,所有代码都在类体之内
-
Java是区分大小写的编程语言,Java程序的源代码文件是以.java为后缀
-
公共类的类名与Java文件名必须相同
-
程序必须要有main()方法才能运行,main()方法是整个程序的入口
-
Java源文件以.java为扩展名,编译后的字节码文件以.class为扩展名
-
使用javac编译.java文件,使用java运行.class文件
-
Java中的注释分为单行注释、多行注释和文档注释