nullJavaSE核心编程JavaSE核心编程课程整体目标课程整体目标掌握Java语言基础知识
理解面向对象的编程思想
运用Java编写命令行程序
运用JDBC编写数据库访问程序
运用Swing组件编写图形用户界面程序
运用Swing组件和JDBC实现C/S结构的应用程序
本章目标本章目标了解Java语言
了解Java程序的类型
理解Java虚拟机(JVM)
掌握Java程序运行环境的配置
编写第一个基于Java的程序Java简介Java简介掌握Java程序运行环境的配置
编写第一个基于Java的程序Java释义Java释义“Java” 一词的本意是地名——“爪哇”;
爪哇岛位于南太平洋,是印度尼西亚的一部分。爪哇岛关于爪哇关于爪哇全世界三大咖啡产地:
巴西
印尼爪哇岛
中国海南岛
由此可见,Java的原意是指一个咖啡的产地,也可以说是一种咖啡的品牌。Java语言简介Java语言简介Java是一种程序设计语言,由Sun Microsystem公司于1995年推出;
早在1991年,Sun公司的James Gosling等人开始开发名为Oak的程序设计语言,希望用来控制嵌入在有线电视机顶盒和PDA等设备中的微处理器;
1994年,Oak语言正式更名为Java;
Java语言凭借其独有的安全性、可移植性和平台无关性,迅速走红。Java与InternetJava与InternetInternet使Java成为网络上最流行的编程语言;
同时,Java对Internet的影响也意义深远;
在Java出现以前,几乎没有工具可以在Internet上执行动态交互程序;
使用Java语言编写的Applet程序可以对用户的输入和操作作出响应。Java程序的类型-AppletJava程序的类型-AppletApplet是用Java编写,在Internet上运行的程序,可以在任何客户端系统上下载,在浏览器中运行Java程序的类型-ApplicationJava程序的类型-ApplicationApplication是指在计算机操作系统支持下运行的程序,它既可以基于图形界面,又可以基于控制台Java的平台无关性Java的平台无关性Java是一种既面向对象又可以跨平台的语言,即:编写一次,随处运行;
Java不仅适用于单机应用程序和基于网络的程序,也可用于创建消费类设备的附件程序,如移动电话、掌上设备等。Java虚拟机Java虚拟机Java虚拟机(Java Virtual Machine)是可运行Java字节码的虚拟计算机系统;
使用Java语言编写的程序,实际上是运行在JVM之上,而不是运行在操作系统上;
它有一个解释器组件,可以实现Java字节码和计算机操作系统之间的通信。用户USER字节码程序JVM (Java 虚拟机)操作系统硬 件Java虚拟机的运行过程Java虚拟机的运行过程Java开发工具包Java开发工具包开发和运行Java程序,必须依赖和使用由Sun公司提供的Java开发工具包(Java Development Kit)Java Platform 2Java Platform 2JDK(Java开发工具包)从1.3版本以后,Sun公司将其正式更名为Java Platform 2;
为适应不同的用途,又将其细分为三个版本:
J2SE(Standard Edition):标准版,适用于普通应用程序的开发;
J2EE(Enterprise Edition):企业版,适用于大型企业级应用程序的开发;
J2ME(Micro Edition):微型版,适用于移动设备或嵌入式设备的程序开发。下载安装JDK下载安装JDK打开浏览器,在地址栏键入:http://java.sun.com/javase/downloads/index.jsp,登录到SUN官方网站,免费下载JDK软件和文档
下载完毕,即可安装JDK;bin目录:存放可执行文件;
lib目录:存放Java的类库文件;
demo目录:存放演示程序;
jre目录:存放Java运行环境文件。配置环境变量配置环境变量安装JDK后,还要配置环境变量才能开发和调试Java程序,右击[我的电脑][属性][高级][环境变量]开发Java程序的步骤开发Java程序的步骤创建Java源程序
Java源程序可以使用任何文本编辑器创建与编辑,一般用.java作为扩展名,其实就是一个使用Java语言编写的文本文件;
编译源程序
Java编译器读取Java源程序并翻译成Java虚拟机能够明白的指令集合,并以字节码的形式保存在文件中,通常,字节码文件以.class作为扩展名;
运行class(字节码)文件
Java解释器读取字节码文件,取出指令并翻译成计算机能够执行的机器代码,完成运行过程。编写第一个Java程序编写第一个Java程序打开记事本,新建一个文本文件,将文件名改为Hello.java,在文件中键入如下内容并保存:class Hello
{
public static void main(String[] args)
{
System.out.println("Hello world!");
}
}Java源程序Java源程序扩展名为.java
的源文件使用记事本
进行编辑使用javac编译器编译源文件使用javac编译器编译源文件接下来需要将源程序进行编译;
进入命令
提示
春节期间物业温馨提示小区春节期间温馨提示物业小区春节温馨提示春节物业温馨提示物业春节期间温馨提示
行,切换到源文件所在的目录,执行javac命令,使用javac编译器编译源文件;
javac命令的格式是:javac 完整的源文件名切换到源文件所在的目录切换到源文件所在的目录切换到源文件所在的目录class(字节码)文件class(字节码)文件顺利通过编译后将生成一个扩展名为.class的字节码文件(类描述文件)。通过编译后
生成的扩展名
为.class的
字节码文件扩展名为.java
的源文件使用java解释器运行字节码文件使用java解释器运行字节码文件进入命令提示行,在字节码文件所在的目录下,执行java命令,使用java解释器运行字节码文件
java命令的格式是:java 类名称
这里只需要类名称,而不是带扩展名的文件名执行java命令运行字节码文件程序运行效果分析程序3-1分析程序3-1关键字class用来定义一个类,Hello是类的名称;
在Java程序中,所有的语句都必须放在某个类中;
整个类及其所有成员都包含在一对花括号中(即{和}之间),它们标志着类定义块的开始和结束。
定义类的一般语法:
class 类名
{
……
}分析程序3-2分析程序3-2程序必须从main函数开始执行;
关键字public是访问修饰符,用来控制类成员的可见范围及作用域;
关键字static允许在不创建类的实例的情况下,调用main函数;
关键字void用来说明main函数是没有返回值的;
args是字符串数组,用来从命令行接收参数;
main函数的一般形式如下:
public static void main(String[] args){
……
}分析程序3-3分析程序3-3String[]是字符串类型的数组;
在Java中,类名称一般首字母大写;
使用System.out.println()将信息输出到控制台上,即打印出来。Java API文档Java API文档Java API文档描述了Java的许多内置功能,以及提供各种类的帮助说明,它是程序员经常查阅的资料
可登录Sun公司的官方网站免费下载Java文件中的注释Java文件中的注释与其它编程语言一样,也可以在Java文件添加注释,Java文件中的注释有三种:
单行注释:以//开始,在行尾结束
多行注释:以/*开始,以*/结束,可以有多行
文档注释:以/**开始,以*/结束,可以有多行
可以使用javadoc命令,将文档注释从源代码中提取出来,生成HTML文件,形成类似于Java API文档的帮助说明文件。使用javadoc命令生成API文档使用javadoc命令生成API文档javadoc命令的格式是:javadoc 完整的源文件名执行javadoc命令提取
文档注释的内容生成的文档生成的文档Java语言的特点2-1Java语言的特点2-1简单
去掉了C和C++中许多复杂功能,如指针、运算符重载等,没有goto语句,没有struct和union等
面向对象
Java是完全面向对象的编程语言,比C++更彻底,纯度更高
健壮性
没有指针,避免对指针的误操作造成程序崩溃
程序员分配的内存空间,无需释放,由Java虚拟机的垃圾回收机制来统一完成此项工作,避免了内存泄漏Java语言的特点2-2Java语言的特点2-2安全性
由于Java取消了指针运算,有效地提高了程序的安全性
Java程序运行在Java虚拟机上,虚拟机可以有效地过滤掉恶意代码,防止程序员有意编写的病毒程序
分布性
Java程序可以跨平台,跨操作系统,完全支持网络应用程序的设计
多线程
Java程序使用一个称为“多线程”的进程同时处理多项任务使用Eclipse来开发使用Eclipse来开发
总结
初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf
总结Java是面向对象的、跨平台的程序设计语言;
Java程序是运行在Java虚拟机之上的;
要下载安装JDK,才可以开发和运行Java程序;
JDK提供一系列的工具,这些工具位于JDK安装路径的bin目录下,常用的有:
javac:编译
java:运行
javadoc:提取文档
可以使用任何文本编辑器编写Java源程序;作业作业熟悉JDK目录,以及JDK环境变量
使用记事本编写Hello World程序
使用记事本编写九九乘法
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
使用记事本编写空心菱形Java语言基础Java语言基础Java是面向对象并且可以跨平台的编程语言
Java程序是运行在JVM(Java虚拟机)之上的
要运行和开发Java程序,必须下载和安装由Sun公司提供的JDK(Java开发工具包)
配置环境变量:Path和classpath
三个常用的JDK工具:javac、java和javadoc
本章相关词汇(蓝色为关键字)本章相关词汇(蓝色为关键字)本章目标本章目标Java中的变量和数据类型
Java中变量的作用域规则
数据类型转换
Java中的输出语句
Java中的运算符和表达式
Java语言基础Java语言基础Java中的变量和数据类型
变量变量
变量是内存中的一块存储区域,是存储数据的基本单元;
声明变量的语法:
数据类型 标识符 [= 值];
如:
int num;
float money = 123.45f;
char ch1, ch2 = ‘A’;
数据类型数据类型数据类型用来确定要存储在内存单元中的数据的类型;
在Java中,数据类型被区分成两个种类:
基本数据类型
引用数据类型
原始数据类型原始数据类型原始数据类型是最简单的数据形式,与C的基本数据类型很相似:引用数据类型引用数据类型在Java中,除了上述8种原始数据类型的变量以外,其余的全都属于引用数据类型,其中包括:
数组
对象
存储在引用类型变量中的值是该变量表示的值的地址;
可以借用C语言中指针的概念来理解引用数据类型。
回顾C语言中的内存分配回顾C语言中的内存分配C语言中内存分配的两种形式:
栈内存:
特点:和作用域同生命周期,自动申请,自动释放。
申请方式:局部变量,形式参数。
栈内存中的空间一般都有名称,通过变量名访问其存储的数据。
堆内存(即动态内存分配):
特点:手工申请,手工释放,生命周期由程序员决定。
申请方式:由malloc函数或calloc函数申请,realloc函数进行调整,free函数负责释放。
堆内存中的空间一般没有名称,只能通过指针访问。
Java中的内存分配Java中的内存分配Java中的原始数据类型与C语言中的基本数据类型一样,其变量都是在栈中分配空间;
而除了8种原始数据类型以外,其它的任何数据都不可以在栈中分配,只能到堆中开辟空间,而在堆中分配的空间又只能通过指针访问;
通过指针访问堆内存的方式,在Java中被称作引用数据类型;
可以认为,Java中的引用就类似于C语言中的指针,只是对指针进行了一定程度上的包装,避免了因直接操作指针而造成的数据意外损坏,从而导致程序错误的情况。
标识符命名规则标识符命名规则变量、函数、数组、对象、类和接口等等都需要命名,这些名称统称为标识符;
Java中对于标识符的命名规则作了如下限制:
只能由英文字母、数字、下划线“_”和“$”符号组成;
必须以英文字母、“_”或“$”开头,即不能以数字开头;
除“_”和“$”以外,不能包含其它任何特殊字符;
不能与关键字冲突;
严格区分大小写。
变量的作用域和生命周期变量的作用域和生命周期变量 的作用域指变量起作用的范围,说明变量在什么部分可以被访问;
变量的生命周期是指变量在内存中存在的周期,即什么时候分配空间,什么时候销毁。
null/*有1,2,3,4四个数字,能组成多少个不相同且无重复的三位数?*/
public class ScopeVariable
{
public static void main(String[] args)
{
int count = 0;
for (int i = 1; i <= 4; i++) //在需要使用变量时声明
{
for (int j = 1; j <= 4; j++)
{
for (int k = 1; k <= 4; k++)
{
if (i != j && i != k && j!= k)
{
int temp = i * 100 + j * 10 + k;
System.out.print(temp + "\t");
count++;
}
}
}
} /*思考:在此处可以访问到变量k吗?*/
System.out.println("\n有:" + count + "个符合要求的数");
}
}作用域示例数据类型转换数据类型转换程序中经常会遇到要将数据类型进行转换的情况(如:在一个表达式中存在不同类型的操作数时),Java的数据类型转换比C控制得更为严格;
数据类型转换有两种情况:
自动类型转换
强制类型转换
自动类型转换自动类型转换自动类型转换也称作隐式类型转换;
将一种类型的变量赋值给另一种类型的变量时,只要满足以下条件,就会发生自动类型转换:
两种类型之间相互兼容;
目标类型大于源类型(即类型提升);
如:
char ch = 'A';
int num = ch;
float f = num;
double d = f;
//类型转换自动发生,无需显式说明
强制类型转换强制类型转换强制类型转换也称作显式类型转换;
如果被转换的值的数据类型大于其目标类型,将会丢失部分信息;
如:
int x = 65;
char ch = x;
这样的语句将报错,因为char类型小于int类型,编译器无法将其自动转换,只能进行强制转换:
int x = 65;
char ch = (char)x;
类型提升规则类型提升规则不难看出,在有类型提升的情况下,编译器将自动进行类型转换,否则就要进行强制类型转换;
类型提升应遵循如下规则:
两种类型必须兼容,且目标类型大于源类型,例如:
byte、char和short类型都可以提升为int型。
对于表达式而言,其最终结果将会与表达式中最高的数据类型相同。
输出语句输出语句如果要将某些信息打印到屏幕上,就必须使用输出语句;
使用System.out.println()实现换行输出效果;
使用System.out.print()实现输出但不换行效果;
无论输出什么类型的数据,只需将数据作为参数传递给它们即可,而无需像C语言中那样,使用%s、%d之类的控制字符,如:
int a = 10;
float f = 3.14f;
System.out.println(a);
System.out.print(f);
System.out.println('X');
使用转义字符控制输出格式使用转义字符控制输出格式有些时候,我们可能会需要对输出格式进行控制,这就使用到了转义字符;
以下是一些常用的转义字符:
运算符和表达式运算符和表达式运算符是通过一定的运算规则操作一个或多个操作数,并生成结果的特定符号;
运算符和操作数的有效组合称为表达式;
Java提供了一系列丰富的运算符,包括:
算术运算符
关系运算符
逻辑运算符
条件运算符
赋值运算符
算术运算符
算术运算符
算术运算符主要用于数学计算,一般使用数值作为操作数:
关系运算符
关系运算符
关系运算符可以测试两个操作数之间的关系(但不会改变操作数的值),关系表达式的结果为boolean型true/false:
逻辑运算符逻辑运算符逻辑运算符与boolean型操作数一起使用:
位运算符位运算符短路与和短路或短路与和短路或Java提供了两个在其它计算机语言中没有的逻辑运算符,这就是逻辑与和逻辑或的短路版本;
对于短路与(&&),如果其左侧为false,则不再计算其右侧,整个表达式的结果为false,只有左侧为true时才计算右侧;
对于短路或(||),如果其左侧为true,则不再计算其右侧,整个表达式的结果为true,只有左侧为false时,才计算右侧。
nullint a = 10;
int b = 20;
if (++a == 12 & ++b == 22)
{
……
}
System.out.println(a);
System.out.println(b);
/*这里使用的是逻辑与,
试分析最后的输出结果*/int a = 10;
int b = 20;
if (++a == 12 && ++b == 22)
{
……
}
System.out.println(a);
System.out.println(b);
/*这里使用的是短路与,
试分析最后的输出结果*/11211120短路与示例赋值运算符赋值运算符赋值运算符的运算顺序是从右至左的:
条件运算符? :条件运算符? :条件运算符是三元运算符;
它的一般形式是:
表达式1 ? 表达式2 : 表达式3
根据表达式1的结果来判断执行表达式2还是表达式3,如果表达式1的结果为true,则执行表达式2,否则执行表达式3;
条件运算符在某些情况下能够替代小型的if…else语句。
运算符的优先级运算符的优先级很多情况下,一个表达式由多个运算符组成,优先级决定运算符的计算顺序:
总结总结Java中的变量和数据类型
Java中变量的作用域规则
数据类型转换
Java中的输出语句
Java中的运算符和表达式流程控制与数组流程控制与数组Java中的数组
new关键字控制流语句控制流语句一般情况下,程序是从上往下依次顺序执行的;
但很多时候,我们需要改变程序执行的流程,这就使用到了控制流语句;
控制流语句包括:
判断语句
循环语句
跳转语句判断语句判断语句判断语句也称作条件语句或分支语句;
判断语句主要用来控制程序在何种情况下执行某一部分;
判断语句包括:
if语句
if…else语句
if…else if语句
switch…case语句循环语句循环语句循环语句也称作迭代语句;
循环语句可用于重复执行相同的操作;
循环语句包括:
while语句
do…while语句
for语句跳转语句跳转语句跳转语句允许以非线性的方式执行程序,可以将控制权转到程序的其它部分;
跳转语句包括:
break语句
continue语句
Java抛弃了C语言中的goto语句。数组数组数组用于将相同类型的数据存储在连续的存储单元中;
可以通过指定数组的名称和长度来声明数组;
一旦声明数组的大小,就不能再修改;
数组元素通过数组名和索引来访问,索引从0开始;
数组可以是一维,也可以是多维。回顾C语言中的数组回顾C语言中的数组在C语言中,从存储方式上讲,声明数组有两种情况;
在栈内存中分配空间,如:
int ary[10]; //声明有10个整型元素的数组
在堆内存中分配空间,如:
int *p = NULL; //声明整型指针
//指针指向堆空间
p = (int*)malloc(10 * sizeof(int));
C语言允许有栈数组,也允许有堆数组。 new关键字new关键字在Java中,不允许将数组分配在栈内存中,只能分配在堆内存中;
Java中没有类似于malloc、calloc、realloc和free等函数,取而代之的是new关键字;
new是Java中内置的操作符;
new操作符用来从堆中分配指定类型的内存空间,并返回相应类型的引用,其作用类似于malloc函数。声明数组示例声明数组示例public class ArrayDemo {
public static void main(String[] args) {
//声明整型数组的引用,类似于C中的 int *p;
int[] ary;
//为数组引用在堆内存中分配实际的内存空间
//类似于C中的 p = (int*)malloc(10 * sizeof(int));
ary = new int[10];
//使用循环为数组元素赋值
for (int i = 0; i < ary.length; i++) {
ary[i] = i;
}
//使用循环将数组元素逐个输出到控制台
for (int i = 0; i < ary.length; i++) {
System.out.println(ary[i]);
}
}
}Java中声明数组的几种方式Java中声明数组的几种方式在Java中声明数组有如下方式://仅声明数组的引用,但没有分配内存空间
float[] fAry;
//声明数组的同时,根据指定的长度分配内存,但数组中没有值
char[] chAry = new char[10];
//声明数组并分配内存,同时将其初始化
int[] ary1 = new int[]{1, 2, 3, 4, 5};
//与前一种方式相同,仅仅只是语法相对简略
int[] ary2 = {1, 2, 3, 4, 5};数组之间赋值数组之间赋值在C语言中,不可以将数组直接赋值给另一个数组;
在Java中,语法上允许这样做,但实际得到的效果是两个数组引用指向同一块内存。
int[] ary1 = {2, 4, 6, 8, 10};
int[] ary2;
ary2 = ary1; //允许这样赋值数组赋值示例数组赋值示例public class ArrayDemo {
public static void main(String[] args) {
int[] ary1 = {2, 4, 6, 8, 10}; //声明并初始化数组1
int[] ary2; //声明数组2
ary2 = ary1; //将数组1赋值给数组2
ary2[3] = 1024; //通过数组2修改其中一个元素的值
//打印出数组1中的元素
System.out.println("数组1中的元素:");
for (int i = 0; i < ary1.length; i++) {
System.out.println(ary1[i]);
}
//打印出数组2中的元素
System.out.println("数组2中的元素:");
for (int i = 0; i < ary2.length; i++) {
System.out.println(ary2[i]);
}
}
}关于数组长度关于数组长度在Java中,程序员可以不再关注数组的长度,数组自带的length属性将负责保管数组的长度;
C语言不检查数组的边界,数组索引完全由程序员掌握;
Java对数组下标越界情况强加约束;
如果试图访问不在有效索引以内的元素,将会引发运行错误。Java中的垃圾回收机制Java中的垃圾回收机制在C语言中,被malloc或calloc函数分配的堆内存在使用完毕以后,必须使用free函数进行释放,否则将会造成内存泄漏;
同样的,在Java中由new分配的内存也将存在内存泄漏的可能;
但释放内存的任务是由Java虚拟机来完成的,程序员可以不再关心此项工作;
如果某块内存空间没有任何引用指向它,那么虚拟机就将其认定为垃圾;
虚拟机并不是随时随地地立即回收垃圾,而是在系统比较空闲的时候,才会执行回收任务。命令行参数命令行参数在命令行使用java命令执行程序时,可以将一些参数传递给main函数;
main函数携带的String[](字符串数组)类型的形参args正是为了接收这些来自命令行的参数;
可以从命令行传递任意多个字符串给main函数,其间使用空格隔开,也可以不传递任何参数;
这些传递进来的多个字符串最后以字符串数组的形式,供main函数中加以使用。命令行参数示例命令行参数示例public class ArgumentDemo
{
public static void main(String[] args)
{
int len = args.length; //获得命令行参数的个数
if (len > 0) //判断是否有命令行参数
{
//如果有,将其逐一打印到控制台
System.out.println(len + "个命令行参数,具体如下:");
for (int i = 0; i < args.length; i++)
{
System.out.println(args[i]);
}
}
else
{
//否则给出提示信息
System.out.println("您没有传递任何命令行参数。");
}
}
}总结总结Java中数组是引用数据类型,只能存放在堆内存中;
数组必须由new关键字为其分配内存;
释放内存的工作由Java虚拟机的垃圾回收机制来完成;
可以利用命令行参数接收来自用户的输入。作业作业利用命令行参数输入一个整数,并判断该数字是否为奇数,如果是奇数,则用其作行数打印空心菱形
PS:将字符串转换为数字的方法
int num=Integer.parseInt(String number);
利用命令行参数输入三个整数,并对三个数字进行降序排列。
PS:将字符串转换为数字的方法
int num=Integer.parseInt(String number);
利用命令行参数输入多个参数,并赋值给一数组,同时判断该数组是否为回文数组
PS:例如数组{“123”,”222”,”333”,”222”,”123”}就是回文数组,即元素倒置过后与原元素一样逻辑趣味思考题逻辑趣味思考题有两个桶,一个容量为5升,一个容量为3升,现在用桶子来乘水,请您用这两个桶准确的乘出4升水来。
有10堆鱼,每堆鱼10条,正常情况下每条鱼10斤,但是现在这10堆鱼中有1堆鱼全是每条9斤,现在给你一把秤(假设这把秤可以称很重很重的东西),请问您能通过一次称量就找出这堆缺斤少量的鱼吗?
回顾回顾Java中的数据类型分为:原始数据类型和引用数据类型;
在数据类型转换中,由低类型转至高类型,将会自动(隐式)类型转换,而从高类型转至低类型,则必须强制(显式)类型转换;
Java中的数组是引用数据类型,必须由new关键字在堆中分配内存;
Java虚拟机的垃圾回收机制将自动释放不再使用的内存;
使用命令行参数接收来自用户的输入。
相关词汇相关词汇类和对象I类和对象I了解什么是 面向对象
面向对象的 基本概念
类
对象
封装
继承
多态
如何定义 类,如何创建 对象
成员运算符
访问控制权限:public和private
构造方法
类和对象I类和对象I了解什么是 面向对象
面向对象的 基本概念
类
对象
封装
继承
多态
如何定义 类,如何创建 对象
成员运算符
访问控制权限:public和private
构造方法
什么是面向对象?什么是面向对象?Object Oriendted Programming对象以…为导向的程序设计面向对象编程 就是使用对象进行程序设计,简写成OOP。面向对象的编程语言面向对象的编程语言如今,面向对象的编程思想已经成为主流;
面向对象的编程语言正大行其道,最具代表性的有:
C++
Java
C#
连数据库也开始面向对象了,如Oracle。面向对象的编程思想面向对象的编程思想OOP旨在计算机程序中
模拟现实世界中的概念在计算机程序中用相似的
实体模拟现实世界中的实体在OOP中,现实世界的
所有事物全都被视为对象设计和实现
软件系统的方法C语言的编程方式C语言的编程方式C语言是结构化的编程语言(Structured Programming,简作SP);
强调精巧的数据结构和优越的算法,关注程序的运行效率;
不适合于大规模的程序开发;
程序模块之间协调性差,程序的重用性、安全性、健壮性和可维护性都存在较大的缺陷。SP和OOP对比SP和OOP对比面向对象的三大原则面向对象的三大原则 封 装 继 承 多 态对象对象对象是面向对象编程的核心部分,是实际存在的具体实体,具有明确定义的状态和行为;
对象其实就是“数据”和“函数”的封装体,其中:
数据表示自身的状态,也称作“属性”或“成员数据”;
函数表示自身的功能,也称作“方法”或“成员函数”。类类人们为了更好地认识世界,将现实生活中的事物(对象)划分成类;
同一类中的事物总是具有一些共性;
类以共同的特性和行为定义实体;
类是具有相同属性和和行为的一组对象的集合。属性属性事物的特性在类中用变量表示;
每个对象的每个属性都拥有其特定的值;
属性名称由类的所有对象共享;
对象或实体拥有的特征在类中表示时称为属性。方法方法事物的行为和动作在类中用函数表示;
每个对象都有相同的动作和行为;
对象执行的操作在类中表示为方法。类和对象的区别类和对象的区别类是用来描述实体的“模板”或“原型”;
对象是实际的实体,每一个对象都是类的一个具体实例;
类用来定义对象所有的属性和方法,同一类的所有对象都拥有相同的特征和操作;
可以将类理解成生产产品的模具,而对象则是根据此模具生产的一个个产品。类与结构类与结构最简单的理解方式: 区别在于:结构体一般只有数据(属性)而没有函数(方法)。封装封装将某些东西包装在一起,然后以新的完整形式呈现出来;
隐藏属性、方法或实现细节的处理方式称为封装;
封装其实就是有选择性地公开或隐藏某些信息,它解决了数据的安全性问题。可以公开无所谓不可以公开继承继承继承就是重用现有的类来生成新类的一种特征;
通俗地讲就是从现有的类(即父类或基类)创建新类(子类或派生类)的过程;
现实生活中,继承可以达到财产重用的目的,而在Java中,继承可以使代码重用。多态多态多态是指同一函数在不同的类中有不同的实现;
多态的好处就是使类更灵活,更便于扩充。抽象抽象把相同的或相似的对象归为一类的这个过程就是抽象,所以,抽象就是分析问题的方法;
抽象的基本原则:
只关心主要问题,而不关心次要问题;
只关心主要矛盾,而不关心次要矛盾;
只关心相同的东西,而不关心不同的东西;
只关心问题是什么,能够完成什么,而不关心怎样去完成。
抽象的过程其实就是面向对象编程的核心思想。在Java中定义类在Java中定义类/*定义学生类*/
class Student
{
String name; //姓名
int age; //年龄
float weight; //体重
/*吃饭的方法*/
void dining()
{
System.out.println("吃饱了...");
weight++;
}
/*走路的方法*/
void walk()
{
System.out.println("走累了...");
weight--;
}
}定义类的语法定义类的语法习惯上,类名的首字母大写,如:Student在Java中创建对象在Java中创建对象/*Test类,用来容纳main方法*/
public class Test
{
/*main方法,程序入口*/
public static void main(String[] args)
{
Student std; //声明Student类型的引用
std = new Student(); //创建Student类型的对象
std.name = "张三"; //为姓名赋值
std.age = 18; //为年龄赋值
std.weight = 50; //为体重赋值
std.dining(); //调用成员方法
System.out.println(std.weight);
std.walk();
System.out.println(std.weight);
}
}创建对象的语法创建对象的语法和数组相似,对象也是引用数据类型,只能使用new运算符从堆中分配内存;
创建对象的一般语法:
类名 引用名 = new 类名() ;
使用已经定义好的类,创建该类对象的过程称为“实例化”。注意:这里要有括号成员运算符.成员运算符.在C语言中,必须要先声明结构体变量,才可以访问结构体中的成员;
同样的,只有先实例化类的对象,才可以访问到类中的成员(属性和方法);
使用成员运算符(.)来访问成员属性或成员方法;
一般语法是:
对象名.成员名
如:std.age = 18; //为成员属性赋值
std.dining(); //调用成员方法访问权限:public和private访问权限:public和privateC语言中结构体的成员可以从任何地方进行访问,这将给数据的安全留下极大的隐患;
为了避免从类外部直接访问类成员而造成的数据损坏,Java对类成员的访问制定了约束;
关键字public和private是访问修饰符,用来说明某个成员是否可以从类外部进行访问;
public修饰的成员可以在任何地方进行访问,不受任何约束;
private修饰的成员只能够被本类中的其它成员访问,而不能从类的外部进行访问。访问权限访问权限无法从类的外部访问私有成员;
其它类的私有成员对于当前类也是隐藏的。访问权限示例访问权限示例class Student {
private String name; //姓名,私有的,不可以从类外部直接访问
private int age; //年龄,私有的,不可以从类外部直接访问
private float weight; //体重,私有的,不可以从类外部直接访问
//吃饭的方法,公有的,可以从任何地方访问
public void dining() {
System.out.println("吃饱了...");
weight++; //dining方法是类内部成员,可以直接访问本类私有成员
}
//走路的方法,公有的,可以从任何地方访问
public void walk() {
System.out.println("走累了...");
weight--; //walk方法是类内部成员,可以直接访问本类私有成员
}
}
public class Test {
public static void main(String[] args) {
Student std = new Student(); //实例化一个Student对象
std.age = 18; //试图从类外部访问私有成员,将会报出一个错误
std.dining(); //允许访问公有成员
}
}访问权限(续)访问权限(续)加上访问修饰符有时候可能会给操作数据带来不便,但可以在很大程度上保证数据的安全;
一般地,我们会将成员属性声明为private,而将成员方法声明为public,但这样做并不是绝对的;
有时候,类外部可能要操作到某些私有数据成员,那么就可以增加一个公有的方法,再由这个方法来操作私有数据,避免因类外部的误操作而造成的数据损坏;
因为main方法要由类外部的虚拟机来调用,所以main方法必须声明成public。修改Student类修改Student类class Student { //定义学生类
private String name; //姓名,私有
private int age; //年龄,私有
private float weight; //体重,私有
public void setName(String name) { //为姓名赋值的方法,公有
this.name = name;
}
public void setAge(int a) { //为年龄赋值的方法,公有
age = a;
}
public void setWeight(float w) { //为体重赋值的方法,公有
weight = w;
}
public void display() { //将所有信息打印出来的方法,公有
System.out.println("姓名:" + name + ",年龄:" + age + ",体重:" + weight);
}
public void dining() {……} //吃饭的方法,公有,代码略
public void walk() {……} //走路的方法,公有,代码略
}
public class Test {
public static void main(String[] args) {
Student std = new Student(); //实例化学生类对象
std.setName("张三"); //为姓名赋值
std.setAge(18); //为年龄赋值
std.setWeight(55); //为体重赋值
std.dining(); //调用吃饭的方法
std.display(); //将信息打印出来
}
}
对象初始化对象初始化在上例中,只能逐个地为数据成员赋值,如果想在对象实例化的同时就初始化成员属性,就使用到了构造方法;
构造方法是特殊的成员方法,它与类同名,在对象实例化时由虚拟机自动调用;
请注意:构造方法没有返回值类型,也不能有返回值。构造方法示例构造方法示例/*定义ConstructorDemo类,对构造方法进行测试*/
class ConstructorDemo
{
/*构造方法,方法名与类名完全一致
无需指定返回值类型,也不能有返回值*/
public ConstructorDemo()
{
System.out.println("这是构造方法");
}
}
/*Test类,用来容纳main方法
一般将包含有main方法的类声明为public*/
public class Test
{
/*main方法,程序入口*/
public static void main(String[] args)
{
/*实例化ConstructorDemo类的对象*/
ConstructorDemo cd = new ConstructorDemo();
}
}构造方法构造方法正是由于在实例化对象的同时会自动调用构造方法,所以构造方法一般用来给数据成员分配资源或初始化数据成员;
构造方法的一般形式:
访问权限 类名(形参列表) {
方法体
}
因为是由虚拟机来调用构造方法,所以构造方法一般应定义成public。为Student类添加构造方法为Student类添加构造方法class Student { //定义学生类
private String name; //姓名,私有
private int age; //年龄,私有
private float weight; //体重,私有
//构造方法,根据传递进来的参数,为数据成员赋值
public Student(String n, int a, float w) {
//分别为每个数据成员赋初始值
name = n;
age = a;
weight = w;
}
public void setName(String n) {……} //为姓名赋值的方法,公有,代码略
public void setAge(int a) {……} //为年龄赋值的方法,公有,代码略
public void setWeight(float w) {……} //为体重赋值的方法,公有,代码略
public void display() {……} //将所有信息打印出来的方法,公有,代码略
public void dining() {……} //吃饭的方法,公有,代码略
public void walk() {……} //走路的方法,公有,代码略
}
public class Test {
public static void main(String[] args) {
//利用构造方法,为数据成员指定初始值
Student std = new Student("张三", 18, 55);
std.display(); //将信息打印出来
}
}
构造方法(续)构造方法(续)每个对象在生成时都必须执行构造方法,而且只能执行一次;
如果构造方法调用失败,那么对象也无法创建;
不可以显式地直接调用构造方法;
在没有定义构造方法的情况下,类会自动产生一个无参数的默认构造方法,这个默认的构造方法什么都不做;
一旦显式地定义了构造方法,默认构造方法自动消失。总结总结对象由状态(属性)和行为(方法)组成;
类是具有相同属性和方法的对象的集合;
封装可以隐藏对象实现的具体细节;
必须先实例化类的对象,才可以访问到其中的成员;
成员运算符用于访问对象的成员;
成员可以定义为公有,也可以定义为私有;
构造方法一般用来初始化对象中的数据成员;
如果不定义构造方法,将有默认的构造方法,一旦定义,默认的构造方法自动消失。
练习练习编写一个包含名为Calculator类的程序。定义两个整型属性以及对该两个变量的setter和getter,编写用于对两个属性执行加、减、乘、除运算方法。在main方法里创建该类的对象并访问这些方法。
编写一个名为Box的类,含整型的length,width, height,volume四个属性,要求在构造方法中将其初始化,并定义一个计算体积的calcVolume方法和一个输出体积的print方法,在main方法中进行调用思考思考有三筐水果,一筐装的全是苹果,第二筐装的全是橘子,第三筐是橘子与苹果混在一起。筐上的标签都是骗人的,(比如,如果标签写的是橘子,那么可以肯定筐里不会只有橘子,可能还有苹果)你的任务是拿出其中一筐,从里面只拿一只水果,然后正确写出三筐水果的标签。
一列时速15英里的火车从洛杉矶出发,驶向纽约。另外一列时速20英里的火车从纽约出发,驶向洛杉矶。如果一只鸟以每小时25英里的速度飞行,在同一时间从洛杉矶出发,在两列火车之间往返飞行,到火车相遇时为止,鸟飞了多远?
回顾回顾对象由属性(数据)和方法(函数)组成;
类是具有相同属性和方法的对象的集合;
封装可以隐藏对象实现的细节部分;
对象是引用数据类型,使用new运算符创建对象实例,使用成员运算符访问对象中的成员;
访问修饰符用来控制访问权限,可以有效地保证数据安全;
构造方法一般用来初始化对象中的数据成员相关词汇相关词汇类和对象II类和对象II方法重载
重载 构造方法
对象 在内存中的 存放形式
this关键字
静态成员,static关键字
包
打包,package关键字
导入包,import关键字
类和对象II类和对象II方法重载
重载 构造方法
对象 在内存中的 存放形式
this关键字
静态成员,static关键字
包
打包,package关键字
导入包,import关键字
提示提示在Java中,函数无需C语言中的前向声明,只要直接定义即可;
Java中,函数被称为方法;
定义一个方法的一般形式:
[访问权限] 返回值类型 方法名称(形参列表) {
方法主体;
}
我们更关注的是方法原型,对于方法原型的三个主要组成部分应当明确区分:
返回值类型
方法名称
形式参数
在Java中定义方法在Java中定义方法/*Java中的方法示例
代码片段
*/
/*定义求平方值的方法*/
public int square(int x)
{
return (x * x);
}返回值类型方法名称形式参数案例案例/*编写求绝对值的方法来求整数的绝对值*/
/*AbsoluteValue类,其中包含求绝对值的方法
Java中的任何方法都必须在类中定义*/
public class AbsoluteValue
{
/*求绝对值的方法*/
public int abs(int x)
{
return ((x >= 0) ? x : -x);
}
/*main方法,程序入口*/
public static void main(String[] args)
{
//必须先实例化类的对象,才可以调用到其中的成员方法
AbsoluteValue obj = new AbsoluteValue();
int a = -8, b;
b = obj.abs(a); //调用abs方法求a的绝对值
System.out.println(a + "的绝对值是" + b);
}
}方法的定义方法的调用案例分析案例分析在上面的案例中,我们已经定义了求整数绝对值的方法;
但有时候,我们可能还需要求浮点数的绝对值,请问:可以继续使用这个方法吗?
事实上是行不通的,这个方法只能求出整数的绝对值,对于浮点数,还需另外再定义求浮点数绝对值的方法。修改案例修改案例public class AbsoluteValue {
/*求整数绝对值的方法*/
public int absOfInt(int x) {
return ((x >= 0) ? x : -x);
}
/*求浮点数绝对值的方法*/
public float abs