01– java 概述、环境变量配置
1、 Java 概述软件开发
1. 软件:一系列按照特定:顺序组织的计算机数据和指令的集合。
1. 常用软件
4. 系统软件: DOS 、Windows、Linux、Mac
4. 应用程序:扫雷、迅雷、QQ
1. 什么是开发
软件制作就是开发
1. 人机交互
1. 软禁的出现实现了人与计算机之间的更好交互
1. 交互方式:
1、图形化界面(Graphical User Interface,GUI)这种方式简单直观,使用者易于接受,容易上手操作。
2、命令行方式(Command Line Interface,CLI)需要有一个控制台,输入特定的指令,让计算机完成一些操作。较为麻烦,需要记住一些命令。
1. 命令行方式
1. dir:列出当前目录下的所有文件和文件夹
1. md:创建目录
1. rd:删除目录(不能有文件的目录)
1. cd:进入指定目录
1. cd .. :退回到上一级目录
1. del:删除文件
1. exit:退出dos界面
1.1什么是计算机语言
1. 语言:是人与人之间用于沟通的一种方式。
例如:中国人与中国人用中文交流。
而中国人要和韩国人交流,就要学习韩文。
1. 计算机语言:人与计算机交流的方式
1. 如果人要与计算机交流,那么久要学习计算机语言。计算机语言有很多种,如C,C++,JAVA等。这里我们选择其中的一种: Java 。
1.2 Java语言概述
1. 是SUN(Stanford University Network), 斯坦福大学 网络公司1995年推出的一门高级编程语言。
1. 是一种面向Internet的编程语言。
1. 随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。
1. 是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
1.2.1 Java语言的三种技术架构
1. J2EE(Java 2 Platform Enterprise Edition)企业版
1. 是为开发企业环境下的应用程序提供的一套解决方案。
1. 该技术体系中包含的技术如 Serviet Jsp等,主要针对Web应用程序开发。
1. J2SE(Java 2 Platform Standard Edition)标准版
1. 是为开发普通桌面和商务应用程序提供的解决方案。
1. 该技术体系是其他两者的基础,可以完成一些桌面应用程序的开发。
1. 比如java版的扫雷。
1. J2ME(Java 2 Platform Micro Edition)小型版
1. 是为开发电子消费产品和嵌入式设备提供的解决方案。
1. 该技术体系主要应用小型电子消费类产品,如手机中的应用程序等。
1. Java5.0版本后,更名为JAVAEE、JAVASE、JAVAME
1.2.2 Java语言的特点:跨平台性
1. 因为有了JVM,所以同一个Java程序在三个不同的操作系统中都可以执行。这样就实现了Java程序的跨平台性。也称为Java具有良好的可移植性。
1.3 Java语言的环境搭建
1.3.1 什么是 JRE 、JDK
1. JRE(Jave Runtime Environment ,Java运行环境)
1. 包括Java虚拟机(JVM,Java Virtual Machine)和java程序所需的核心类库等,如果想运行一个开发好的Java程序,计算机只需要安装JRE即可。
1. JDK(Java Development Kit,Java开发工具包)
1. JDK是提供给Java开发人员使用的,其中包含了Java的开发工具包,也包含了JRE。所以安装JDK,就不用在单独安装JRE了。
1. 其中的开发工具:编译工具(javac.exe)、打包工具(jar.exe)等。
1. 简单而言:使用JDK开发完成的java程序,交给JRE去运行。
1.3.2 下载JDK
1. 、java.sun.com官方网站上可下载最新版本
1.3.3 安装JDK
1. 傻瓜式安装,下一步即可。
1. 建议:安装路径不要有中文或者特殊符号,如空格等。
1. 当提示安装JRE时,可以选择不安装。
1.3.4 配置JDK环境变量技巧
1. XP系统:
46. 右键我的电脑—高级—环境变量—系统变量—新建变量—输入变量名:JAVA_HOME–地址D:Javajdk1.7.0_09—确定。
46. 选择PATH—在变量值最左边输入%JAVA_HOME%bin;–确定—重新打开dos界面测试。
1. Win7系统:
47. 右键计算机—高级设置—环境变量—系统变量—新建变量—输入变量名:JAVA_HOME—地址:D:Javajdk1.7.0_09—确定。
47. 选择PATH—在变量值最左边输入%JAVA_HOME%bin;–确定—重新打开dos界面测试。
1. 临时设置环境变量
1. 命令行set查看所有变量
49. set path=d:jdk-1.7bin回车(临时设置完成,关闭dos界面后恢复)
1.4 Java程序开发体验—Hello World
1、将Java代码编写在扩展名为.java的文件中。
2、通过javac命令对该java文件进行编译。
3、通过java命令对生成的class文件进行运行。
1、编写简单测试java小程序hello world.java
代码如下:
class HelloWorld{
public static void main (String[] args){
System .out.print(“Hello World!”);
}
}
2、编译java文件
命令行 javac “hello world.java”
1. 运行编译程序
java HelloWord
0. 结果
显示Hello World!
2、Java语言基础组成
2.1、关键字
· 关键字的定义和特点
· 定义:被java语言赋予了特殊含义的单词。
· 特点:关键字中所有字幕都为小写。
· 用于定义数据类型的关键字
· class
· interface
· byte
· short
· int
· long
· float
· double
· char
· Boolean
· void
· 用于定义数据类型的关键字
· true
· false
· null
· 用于定义流程控制的关键字
· if
· else
· switch
· case
· default
· while
· do
· for
· break
· continue
· return
· 用于定义访问权限修饰符的关键字
· private
· protected
· public
· 用于定义类,函数,变量修饰符的关键字
· abstract
· final
· static
· synchronized
· 用于定义建立实例及引用实例,判断实例的关键字。
· extends
· implements
· 用于定义类和类之间关系的关键字
· new
· this
· super
· instanceof
· 用于异常处理的关键字
· try
· catch
· finally
· throw
· throws
· 用于包的关键字
· package
· import
· 其他修饰符关键字
· native
· strictfp
· transient
· volatile
· assert
2.2、标识符(类名)
· 在程序中定义的一些名称
· 由26个英文字母大小写,数字:0-9,符号:_$组成
· 定义合法标识符规则:
1. 数字不可以开头
1. 不可以使用关键字
1. Java中严格区分大小写
1. 注意:在起名字的时候,为了提高阅读性,要尽量有意义。
Java中的名称规范:
1. 包名:多单词组成时所有字母都小写。
19. xxx.yyy.zzz
1. 类名接口名:多单词组成时,所有单词的首字母大写。
20. XxxYyyZzz
1. 变量名和函数名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写。
21. xxxYyyZzz
1. 常量名:所有字母都大写。多单词时每个单词用下划线连接。
22. XXX_YYY_ZZZ
2.3、注释
1. 单行注释
23. 要注释的文字前面加入//,如 //这是一个HelloWorld简单程序。
1. 多行注释(多行注释中不能有多行注释)
24. 在注释的文字前后添加/* … */,如/*这是一个HelloWorld简单程序。*/
1. 文档注释
25. 在注释的文字前后添加/**…*/,如/**这是一个HelloWorld简单程序*/
02–常量变量,数据类型,运算符
2013年4月9日
8:47
2.4 常量和变量
2.4.1 常量
* 常量是不能改变的数值.
* java中常量的分类:
1)整数常量,所有整数.
2)小数常量,所有小数.
3)布尔型常量,只有两个数值:true和false.
4)字符常量,将一个数字.字母或者符号用单引号标识(‘2’ ‘中’)
5)字符串常量,将一个或者多个字符用双引号标识
6)null常量,只有一个数值就是:null
* 对于整数:有四种表现子形式
1) 二进制 ,0,1 满2进1
2)八进制:0-7,满8进1,用0开头表示
3)十进制:0-9,满十进一
4)十六进制:0-9,a-f,满16进1,用0x开头.
2.4.2 进制转换
* 进制的基本转换
1)十进制二进制互转
十进制转二进制,除以2去余数
二进制转十进制.乘以2的幂数
2)十进制八进制互转
十进制转八进制,除以8去余数
八进制转十进制,乘以8的幂数
3)十进制16进制互转
十进制转16进制,除以16去余数
16进制转十进制,乘以16的幂数
4)负数的二进制表现形式:
对应的整数二进制取反加1
2.4.3 变量
* 变量的概念
内存中的一个存储区域
定义该区名称,类型,变量值
该区域的数据可以在同类型范围内不断变化
* 使用变量注意事项:
1)变量的作用范围在{}之间有效
2)初始化值
* 定义变量的格式
数据类型 变量名 = 初始化值;
注意:格式是固定的,记住格式,以不变应万变.
* 理解:变量如同数学中的x未知数.
2.4.4 变量分类
* 按照声明的位置划分:
1) 局部变量 :方法或语句块内部定义的变量
2)成员变量:方法外部类的内部定义的变量
注意:类对应的大括号外面不能定义变量
* 按照所属的数据类型划分:
1)基本数据类型变量
2)引用数据类型变量
* 注意:成员变量可以不赋值,因为java虚拟机会给成员变量赋默认值
局部变量必须赋值,否则会出现编译错误.
2.5 数据类型
* Java语言是强类型语言,对于每一种数据都定义了明确的数据类型,
在内存中分配了不同大小的内存空间
* 基本数据类型取值范围占用内存大小及默认值
默认情况:整数是int型,浮点数都是double型.
2.5.1 数据转换
* 自动类型转换(也叫隐式类型转换)
* 强制类型转换(也叫显式类型转换)
* 类型转换的原理
所有的byte型、short型和char型的值将被提升为int型。
如果一个操作数是long型,计算结果就是long型。
如果一个操作数是float型,计算结果就是float型。
如果一个操作数是double型,计算结果就是double型。
* 数据参与运算
1)整型,字符型,浮点型的数据混合运算中相互转换时都遵循以下原则:
容量小的类型与容量大的类型进行计算,默认转换为容量大的数据类型.
数据类型按容量从小到大的排序为:
Byte<short<char<int<long<float<double
Byte,short,char之间不会互相转换,计算时首先转换为int类型
2)强制转换符
格式(数据类型) (要被转换的数据) byte b =(int)(130);
3) 思考:
byte b1=3,b2=4,b;
b=b1+b2; //编译失败,因为变量是不确定的值,所以无法计算后赋值
b=3+4; //编译通过,常数检查没有查过数据类型的最大值就可以赋值
2.6 算术符
2.6.1 算数运算符
2.6.2赋值运算符
符号:
= , +=, -=, *=, /=, %=
示例:
int a,b,c; a=b=c =3;
int a = 3; a+=5;等同运算a=a+5;
思考:
short s = 3;
s=s+2;// 编译失败,因为s会被提升为int类型
运算后的结果还是int类型。无法赋值给short类型。
s+=2;// 编译通过,因为+=运算符在给s赋值时,自动完成了强转操作。
2.6.3 比较运算符
* 符号
== 相等于
!= 不等于
< 小于
> 大于
<= 小于等于
>= 大于等于
Instanceof 检查是否是类的对象
注意:
1)比较运算符的结果都是boolean型,也就是要么是true,要么是false
2)比较运算符”==”不能误写成”=”
2.6.4 逻辑运算符
符号
& 与(and) 有一个是false最后结果为false
| 或(or) 有一个是true最后结果为true
^ 异或(XR) 两个相同的值最后结果为false
! 非 值是结果相反的
&& 双或 第一个值为false就不运算第二个值
|| 双与 第一个值为true就不运算第二个值x
2.6.5 位运算符(位运算是直接对二进制进行运算)
符号
<< 左移 移几位就乘以2的几次幂
>> 右移 移几位就除以2的几次幂
>>> 无符号右移 被移位二进制最高位无论是0或者是1,空缺位都用0补
& 与运算 二进制位进行&运算,只有1&1时结果是1,否则是0
| 或运算 二进制位进行 | 运算,只有0 | 0时结果是0,否则是1
^ 异或运算 相同二进制位进行 ^ 运算,结果是0;1^1=0 , 0^0=0
~ 反码
二进制1就是true,0就是false
对两个整数变量的值如何进行互换(不需要第三方变量)
int a = 5;
int b = 7;
a = a ^ b;
b = a ^ b;
a = b ^ a;
2.6.6 三元运算符
格式
( 条件表达式 )?表达式1:表达式2
如果条件为true,运算后的结果是表达式1;
如果条件为false,运算后的结果是表达式2;
int x=3,y=4,z;
z=(x<y)?x:y //z的值是3
2.6.1 判断结构
if语句三种格式
1)if (条件表达式){
执行语句;
}
2)if(条件表达式){
执行语句;
}else{
执行语句;
}
3)if(条件表达式){
执行语句;
}else if(条件表达式){
执行语句;
}
if语句和三元运算符的区别:
1)三元运算符可以称之为if语句的简写形式,只要简写就会有一定的弊端.
2)三元运算符,是一种运算符号,也就是说每次执行后,必须有结果.
3)if..else是语句,只要是控制流程,执行后不一定有结果
4)if..else里面可以有语句,并输出结果,三元运算符不可以.
if语句的使用情况
1)当对值进行判断的时候
2)当对数据区间进行判断的时候
3)当结果是布尔类型的时候
03–判断,选择,循环结构
2013年4月9日
8:46
2.7 判断
if语句特点:
a,每一种格式都是单条语句。
b,第二种格式与三元运算符的区别:
三元运算符运算完要有值出现。好处是:可以写在其他表达式中。
c,条件表达式无论写成什么样子,只看最终的结构是否是true 或者 false;
2.8 选择
switch语句
格式:
switch(表达式){
case 取值1:
执行语句;
break;
case 取值2:
执行语句;
break;
……
default:
执行语句;
break;
}
switch语句特点:
1) switch语句选择的类型只有五种:
byte,short,int , char。1.7版本可以接收String字符串。
2) case之间与default没有顺序。先执行第一个case,没有匹配的case执行default。
3) 结束switch语句的两种情况:遇到break,执行到switch语句结束。
4) 如果匹配的case或者default没有对应的break,那么程序会继续向下执行,
运行可以执行的语句,直到遇到break或者switch结尾结束。
switch与if的区别
1) 如果对几个具体的值进行判断,可以使用switch,也可以使用if,
但是建议使用switch效率会更高一些。
2) 如果是对区间进行判断或者多boolean结果的判断,只能用if。
因为switch里面不接收boolean的值.
2.9 循环结构
代表语句:while , do while , for
while语句格式:
while(条件表达式){
执行语句;
}
do while语句格式:
do
执行语句;
}while(条件表达式);
do while特点:
是条件无论是否满足,循环体至少执行一次。
定义循环的前提条件:1)明确循环条件2)控制循环次数
if与while区别:if是对条件进行一次判断,while是对条件进行多次判断
for格式:
for(初始化表达式;循环条件表达式;循环后的操作表达式){
执行语句;(循环体)
}
1)for里面的每个表达式运行的顺序,初始化表达式只读一次,判断循环条件,为真就执行循环体,然后再执行循环后的操作表达式,接着继续判断循环条件,重复找个过程,直到条件不满足为止。
2)while与for可以互换,区别在于for为了循环而定义的变量在for循环结束就是在内存中释放。而while循环使用的变量在循环结束后还可以继续使用。
3)最简单无限循环格式:while(true) , for(;;),无限循环存在的原因是并不知道循环多少次,而是根据某些条件,来控制循环。
可以用输出语句System.out.println();调试程序,看到循环中的每一步的输出
转义符号:
t:制表符
n:换行符
r:回车符
‘ 单引号字符
” 双引号字符
\ 反斜杠字符
注:windows里面的回车换行是由两个符号组成rn
Linux的回车符n组成的
转义字符需要写在单引号或双引号里用+号连接
转义字符代表的是一个字符可以放在char里
其他控制流程语句
break (跳出) 语句:应用范围:选择结构和循环结构。
continue (继续) 语句:应用于循环结构。
注:
1),这两个语句离开应用范围,存在是没有意义的。
2),这个两个语句单独存在下面都不可以有语句,因为执行不到。
3),continue语句是结束本次循环继续下次循环。
4),标号的出现,可以让这两个语句作用于指定的范围。
语句总结:
1) 当对某几个值进行判断的时候,可以使用if语句,或者switch语句,建议switch,但是,使用switch要注意,它只能操作四种类型的值,byte short,int,char,String如果是五种类型以外的值,需要使用if。
2) 如果对数据区间进行判断,或者对运算结果是boolean类型的进行判断。使用if语句。
3) 当需要某些语句执行很多次的时候,使用循环结构。如果定义变量只为循环增量存在时,可以使用for语句。如果对一个条件进行判断使用if,如果对该条件进行多次判断,使用while。
4) 如果要结束循环,可以控制循环条件,或者通过break语句完成。如果要控制循环的流程,是否该继续执行,可以通过continue或者break来完成。
04–函数、数组概述
3、函数
3.1 函数的定义
函数就是类中发具有特定功能的一段独立小程序,也叫方法。
格式:修饰符 返回值类型 函数名(参数类型 名称….)
{
执行语句;
return 返回值;
}
例:
public static int Test1(int test) //返回整数型
public static void Test2(int test) //不返回值
使用方式:
直接写函数名,传递相应的参数参数有顺寻使用变量,接收返回值.
3.2 函数的特点
1)定义函数可以将功能代码进行封装
2)增加代码的复用性
3)函数只有在被调用的时候才会被执行
4)便于该功能的复用性
5)对于函数没有具体指的情况下,返回值类型用关键字void表示,
该函数中的return语句如果在最后一行可以省略不写.
注意事项:
1)不允许将函数定义到另一个函数中
2)函数之间可以互相调用
3)返回值类型,必须和return返回的数据类型一致
4)返回值类型是void的函数不可以放在输出语句打印
5)修饰符可以不写public,但是必须要写static
6)不要化蛇添足
3.3 函数的应用
实例:
需求:
定义一个功能,实现两个整数的加法运算.
思路:
1)定义该函数为int类型
2)定义两个未知数整型
3)最后return x+y返回相加的值
主要代码:
public static int sum(int x,int y)
{
return x+y;
}
3.4 函数的重载(overload)
同一个类型,多个重名函数,只要参数列表不一致就出现重载特性.
要求:顺序,类型,个数不一致
特点:返回值类型无关,只看参数列表,函数实现功能一致,细节不同,可以利用重 载特性来实现.
好处:代码量大大减少,错误率更低,方便阅读,优化程序设计
4、 数组
4.1数组的定义
数组就是一个容器,里面存储了同一种类型的数据.
好处:数组里的数据从0开始编号,方便操作这些数据.
声明一个变量就是在内存空间划出一块合适的空间.
声明一个数组就是在内存空间划出一串连续的空间
4.2 数组的格式:
格式1(一般不用)
元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
int[] arr1 = new int[5];
格式2:
元素类型[] 数组名 = new 元素类型[] {元素,….};
元素类型[] 数组名 = {元素,元素,元素…..};(一般使用这个方法)
int arr1 = new int []{1,2,3,4…};
int arr1 = {1,2,3,4,5….};
4.3 数组的使用方法:
int[] arr1 = new int[6]; //声明数组开辟空间
arr1[0] = 6; //赋值
int sum = arr1[0]*10; //数据处理
System.out.println(sum); //输出
4.4 数组内存结构剖析
为了提高运算效率,java程序运行时需要在内存中进行了5个区域划分
分别是:栈内存,堆内存,方法区,本地方法栈,PC寄存器(程序计数器).
栈内存:
用于存储局部变量,当数据使用完自动释放.
堆内存:
1) 存储通过new建立的实例数组和对象
2) 每个实体都有内存地址值
3) 实体中的变量都有默认值(int-0,double-0.0,Boolean-false,char-u0000)
4) 实体不在被使用时,会在不确定的时间内被垃圾回收器回收.
数组创建,赋值过程图:
4.5 数组常见错误
1) int[] arr =new int[]; //没有注明数组的大小
2) int[] arr =new int[5;]
System.out.println(arr[5]);
ArrayIndexOutOfBoundsException //数组超出越界,数组从0开始计数
3) int[] arr;
arr ={1,2,3,4}; //创建数组并赋值必须在一条语句内完成.
4) int[] arr =null;
System.out.println(arr[0]);
NullPointerException //不能打印空值
4.6 数组使用注意事项:
1) 数组只能有一个标识符(名称)
2) 数组的长度固定,注意避免角标越界
3) 数组定义时,必须明确元素的类型
4) 数组定义时,必须明确元素的个数
4.7 数组知识点
1) 数组中的每一个元素都能通过下标来访问
2) 数组角标从0开始
3) 数组长度获取:变量名.length(数组长度是固定的)
4) 数组动态初始化: int[] arr =new int[5];
5) 数组静态初始化:int[] arr ={1,2,3,4};(经常使用的格式)
6) 当要对较多的同种数据类型变量操作时需要将这些数据进行存储
7) 好处:可以对数据进行存储,而且对数据进行编号,方便遍历和任意使用
05–数组应用、二维数组
2013年4月9日
8:45
4.8 数组的其他应用
1) 选择排序
无序列的数组,从小到大,顺序排列
原理:是从第一位数逐个跟后几位进行对比
代码:
for(int x =0;x<arr.length-1;x++){
for(int y =x+1;y<arr.length;y++){
if (arr[x]>arr[y]){
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
}
2) 冒泡排序
原理:两个相邻位置比较,最大值出现在最大下标
代码:
public static void bubbleSort(int[] arr){
for(int x=0;x<arr.length-1;x++)
{
for(int y=0;y<arr.length-1;y++)
{
if (arr[y]>arr[y+1])
{
int temp = arr[y];
arr[y] = arr[y+1];
arr[y+1] =temp;
}
}
}
//遍历数组
for(int x=0;x<arr.length;x++)
{
System.out.print(arr[x] +” “);
}
}
3) 反转
将数组内的值位置顺序倒转.
4) 二分查找法
进行对半对半的判断,提高计算效率,在不规律的数值时不适用.
5) 查表法
使用数组造表,通过需求找出对应的值
4.9 数组中的数组
二维数组[][]
格式1:int[][] arr =new int[3][3];
1) 定义了名称为arr的二维数组
2) 二维数组中的3代表有3个一堆数组
3) 每一个一维数组中有3一个元素
4) 一维数组的名称分别为:arr[0],arr[1],arr[2]
5) 赋值50给一维数组1脚标,写法:arr[0][1]=50;
格式2:int[][] arr = new int[3][];
1) 二维数组中有3个一维数组
2) 每个一维数组都是默认初始化值null
3) 可以对这个3个一位数进行初始化
arr[0] = new int[2]; //第一组初始化2个数值
arr[1] = new int[1]; //第二组初始化1个数值
arr[2] = new int[5;] //第三组初始化5个数值
格式3:int[][] arr ={{1,3,6},{,2,4},{2,3,1,45,6}}; //一般用这种格式,方便
1) 定义一个名称为arr的二维数组
2) 二维数组中的有三个一维数组
3) 每一个一维数组中具体元素也都已初始化
06–面向对象之封装、匿名对象、构造函数
2013年4月9日
8:45
5、面向对象
5.1 面向对象概念
解决现实生活中问题的处理思想和思维模式
思想和角色的转变,研究真实存在的具体事物,事物就看成对象
面向对象设计把握的一个重要经验:谁拥有数据,谁就对外提供操作这些数据的方法.
5.1.1 理解面向对象
1) 面向对象是相对面向过程而言
2) 面向对象和面向过程都是一种思想
3) 面向对象是基于面向过程
面向对象和面向过程区别:
面向过程强调的是功能行为
面向对象是将功能封装进对象,强调具备了功能的对象
5.1.2 面向对象的特点:
1) 是一种符合人们思考习惯的思想
2) 可以将复杂的事情简单化
3) 将程序员从执行者转换成了指挥者
4) 完成需求时:
* 先要去找具有所需的功能的对象来用
* 如果该对象不存在,那么创建一个具有所需功能的对象
* 这样简化开发并提高复用
5.1.3 面向对象开发,设计,特征
开发的过程:其实就是不断的创建对象,使用对象,指挥对象做事情.
设计的过程:其实就是在管理和维护对象之间的关系
面向对象的三大特征:
1) 封装(encapsulation)
2) 继承(inheritance)
3) 多态(ploymorphosm)
5.2 类与对象的关系
5.2.1 类的定义:
生活中描述事物无非就是描述事物的属性和行为
java中用类class来描述事物也是如此
1) 属性:对应类中的成员变量
2) 行为:对应类中的成员函数
定义类其实在定义类中的成员(成员变量和成员函数)
类是java语言用来面熟现实中存在的具体事物
例如:描述人(class Person),描述车(class Car)
5.2.2对象的定义
对象就是现实中确实存在的那个具体的事物
类是描述对象,对象是现实中的具体事物
类和对象的关系:
1) 类看做生产图纸
2) 对象看做根据图纸生产出存在的产品
5.2.3 成员变量(全局变量)和局部变量的区别
1)作用范围
成员变量:定义在类中,作用于整个类
局部变量:只在它所属的局部大括号中有效
2) 存储情况
成员变量:存储在堆内存中.随着对象的存在而存在,当对象变成垃圾回收时,该对象 中的成员变量会消失
局部变量:存储在栈内存中,当方法被调用或者语句被执行的时候,才存在
当方法运行完毕或者语句运行完毕时,局部变量会自动释放
3) 初始化情况
成员变量:在堆内存中有默认初始化值
局部变量:必须手动初始化后才可以被使用
5.2.4 成员变量和局部变量内存图
5.2.5 创建对象,使用对象
class Car//对Car这类事物进行描述
{
String color = “red”;
int num = 4;
void show()
{
System.out.println(“color=”+color+”..num=”+num);
}
}
class CarDemo
{
public static void main(String[] args)
{
Car c = new Car();//建立对象
c.color = “black”;//对对象的属性进行修改
c.show();//使用对象的功能。
}
}
5.2.6 对象内存结构
Car c1 = new Car();c1.color=”blue”;
Car c2 = new Car();
5.3匿名对象
匿名对象是对象的简化形式
匿名对象使用时需要注意的两种情况
1) 当对对象方法仅进行一次调用的时候
2) 匿名对象可以作为实际参数进行传递
5.3.1 new对象的详细过程
<1> 因为new用到了Person.class,所以会先找到Person.class文件并加载到内存中
<2> 执行该类中的static代码块,如果有的话,给Person.class类进行初始化
<3> 在堆内存中开辟空间,分配内存地址
<4> 在堆内存中建立对象特有属性,并进行默认初始化
<5> 对属性进行初始化
<6> 对对象进行构造代码块初始化
<7> 对对象进行对应的构造函数初始化
<8> 将内存地址赋给栈内存中的p变量
6、面向对象之 封装(Encapsulation)
定义:指隐藏对象的属性和实现细节,仅对外提供公共访问方式
好处:
1) 将变化隔离,隐藏类的实现细节
2) 便于使用,可以方便加入控制逻辑,限制对属性不合理操作
3) 提高重用性,便于修改,增强代码的可维护性
4) 提高安全性
封装原则:
1) 将不需要对外提供的内容都隐藏起来
2) 把属性都隐藏,提供公共方法对其访问
3.3.1 private (私有)关键字
private 关键字
1) 是一个权限修饰符。
2) 用于修饰成员(成员变量和成员函数)
3) 被私有化的成员只在本类中有效。
常用之一:
将成员变量私有化,对外提供对应的set ,get方法对其进行访问。提高对数据访 问的安全性
6.1 构造函数
特点:
1) 构造方法 的方法名必须与类名相同
2) 构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。
3) 构造方法不能由编程人员调用,而要系统调用。
4) 一个类可以定义多个构造方法,也就是构造方法可以重载,以参数的个数,类 型,或排列顺序区分。
5) 如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认 构造器,这个构造器不执行任何代码。
作用:构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的 参数传给对象的域。
构造函数和一般函数的区别:
1从功能上的区别:
构造函数是给对象初始化的
一般函数是因为对象需要满足某种功能定义的
2从执行上的区别
构造函数,是对象创建的时候被执行,不用调用。
一般函数是什么时候调用,就什么时候执行,不调用就永远不执行。
6.2 this关键字
定义:Java关键字this只能用于方法方法体内。当一个对象创建后,Java虚拟机(JVM) 就会给这个对象分配一个引用自身的指针,这个指针的名字就是this。因此, this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出 现this,(这在讲解Java关键字static、final中给出了明确解释。)并且this只和 特定的对象关联,而不和类关联,同一个类的不同对象有不同的this。
简言之:哪个对象调用this所在的函数,this就代表哪个对象。
this关键字的作用
1) 第一、通过this调用另一个构造方法,用法是this(参数列表),这个仅仅在类的构造方法中,别的地方不能这么用。
2) 第二、函数参数或者函数中的局部变量和成员变量同名的情况下,成员变量被屏蔽,此时要访问成员变量则需要用”this.成员变量名”的方式来引用成员变量。当然,在没有同名的情况下,可以直接用成员变量的名字,而不用this,用了也不为错,呵呵。
3) 第三、在函数中,需要引用该函数所属类的当前对象时候,直接用this。
4) 其实这些用法总结都是从对”this是指向对象本身的一个指针”这句话的更深入的理解而来的,死记不然容易忘记而且容易搞错,要理解!
局部代码块(定义在方法里面)
public void method(){
{
int x = 4;
System.out.println(“x=”+x);
}
}
这种写法开发并不常见,但是面试可能会出现,它的作用就是可以限定变量的生命周期.
初始化块(构造代码块)
定义在类里
{
System.out.println(“我是初始化块”)
}
1) 括号里的是初始化块,这里面的代码在创建java对象时执行,而且在构造器之前执行!
2) 其实初始化块就是构造器的补充,初始化块是不能接收任何参数的,定义的一些所有对象共有的属性、方法等内容时就可以用初始化块了初始化!!
3)好处是可以提高初始化块的复用,提高整个应用的可维护性。