- 对象的创建和使用
–>关于JVM内存管理
- JVM(java虚拟机)主要包括三块内存空间,分别是:栈内存,堆内存,方法区内存。- 堆内存和方法区内存各有一个。一个线程一个栈内存。
- 方法调用的时候,该方法所需要的内存空间在栈内存中分配,称为压栈。方法执行结束之后,该方法所属的内存空间释放,称为弹栈。
- 栈中主要存储的是方法体当中的局部变量。
- 方法的代码片段以及整个类的代码片段都被存储到方法区内存当中,在类加载的时候这些代码片段会载入。
- 在程序执行过程中使用new运算符创建的java对象,存储在堆内存当中。对象内部有实例变量,所以实例变量存储在堆内存当中。
- 变量分类:
局部变量【方法体中声明】
成员变量【方法体外声明】
* 实例变量【前面修饰符中没有static】
* 静态变量【前面修饰符中有static】 - 静态变量存储在方法区内存当中。【先背会】
成员变量。对象相关的,成员变量在堆中的对象中存储。
局部变量在栈中存储。 - 三块内存当中变化最频繁的是栈内存,最先有数据的是方法区内存,垃圾回收器主要针对的是堆内存。
- Java中所以new出来的数据统一被存储在堆区中,程序员是无法对堆区数据直接操作,只能通过内存地址间接操作。
- 垃圾回收器【自动垃圾回收机制,GC机制】什么时候会考虑将某个java对象的内存回收呢?
* 当堆内存中的java对象成为垃圾数据的时候,会被垃圾回收器回收。- 什么时候堆内存中的java对象会变成垃圾呢?
没有更多的引用指向它的时候。
这个对象无法被访问,因为访问对象只能通过引用的方式访问。
- 什么时候堆内存中的java对象会变成垃圾呢?
2.关于java的集成开发环境【集成开发环境简称:IDE】
2.1、什么是集成开发环境?
* 集成开发环境讲究一站式开发,使用这个工具即可。有出错提示功能,有自动纠错、自动生成功能。
* 集成开发环境可以让软件开发变得更简单,更高效。
* 没有IDE工具:
— 需要安装JDK、需要配置环境变量、需要手动的将java源文件编译生成class字节码文件
— java源程序出错之后还没有提示
— 没有自动生成功能等。
* 有IDE工具:
— 不需要独立安装JDK【IDE中已经集成】
— 不需要手动配置环境变量
— 不需要使用javac命令对java源文件进行编译
— 并且java源程序编写语法错误马上又提示
— 使用IDE工具有很多代码不需要写,自动生成了。
2.2、java有哪些比较牛的IDE呢?
* eclipse【日食】(myeclipse) 【最多】
* Intellij IDEA 【上升的趋势】
* NetBeans
* JBuilder
.......
目前阶段我们使用的是:myeclipse102.3、讲解myeclipse的使用:
* workspace:工作区
- 当myeclipse打开的时候,大多数都是会提示选择工作区
- 这个工作区可以是自己存在的工作区,也可以是新建的工作区
- 选择工作区之后,将来编写的java代码,自动编译的class文件都会在工作区中找到
- myeclipse可以开启两个甚至更多的会话,每一个会话对应不同的workspace
* 在workspace工作区当中有一个文件夹:.metadata
- 在该文件夹当中存储了当前myeclipse的工作状态
- 将.metadata文件夹删除之后,下一次再次进入这个工作区的时候,是一个全新的开始。
但是会发现这个IDE工具当中所有的项目丢失了,没关系,这里只是丢失的myeclipse的项目,
硬盘上真实存储的项目不会丢失。
* 打开myeclipse之后:
- 窗口双击可以最大化或者还原
- 窗口可以拖动
- 窗口不小心关闭了,可以再次打开:
window --> show view --> other -->输入自己要找的窗口
* myeclipse为程序员准备了很多不同的布局方式:
- 企业级开发:JavaEE开发的专用布局- MyEclipse Java Enterprise
- 普通java开发的:JavaSE开发的专用布局- Java
- 怎么切换布局?
* myeclipse右上角
* 当这个布局被破坏之后想复原?
- window --> Reset...
* 重点的窗口介绍
- Package Explore / Navigator /Project Explore :可以看到java源文件
- Console: 控制台窗口
* 工作区workspace中基本的单元是:Project(工程/项目)
* 使用myeclipse创建工程:
- 在Package Explore窗口当中点击右键 --> new --> Java Project 【JavaSE工程】:当然还有其他方式
* 指定Java工程的名称:一般都小写
* 指定java工程的存放目录
* Java的运行时环境:JRE的配置【可以选择使用myeclipse自带的JRE,也可以选择程序员自己安装的JRE】
* Project Layout :工程的目录布局
- 多数情况下都是选择:两个独立的文件夹存储源码(src)和字节码(bin)
* 工程的导入和导出:
导入: 在左侧空白区域右键 import--general--Existing projects from workspace--然后选择自己想要导入的文件
导出: 在左侧空白区域右键 export--general--file system--选择导出成文件夹的形式(举例)
* 如何重命名:在类文件夹上右键--Refactor--Rename--输入你想重新改的名字(以改类名为例)
* 按左键不放可以拖动文件到指定的包里或工程里
* 如何改工作目录:File--switch workspace--Brouse
* 如何使结构更好看:Source--Format--系统会自动将你的格式标准化,更好看
* Source--Generate Getters and Setters/Generate Constructer using Fields/Generate Constructer from Superclass
系统自动生成
* 如何使不小心关掉的窗口重新打开:
Window--Show view--打开你需要的窗口 * 在src目录下新建软件包:package机制后面讲,目前先用着。
- 在src目录上点击右键 --> new --> package
- 给package起名:com.bjpowernode.javase;
- 包package是java语法的一部分,后面讲。
* 在软件包下新建一个java类:
- 在包上点击鼠标右键 --> new --> class【同时生成了main方法】
- 显示行号:在java源程序的左侧栏上点击鼠标右键:show line number
- 设置字体大小:
window --> Preferences --> 输入font --> colors and fonts --> Basic --> Text Font --> Edit
* 关于myeclipse中常用的部分快捷键:
- ctrl + d 删除一行
- alt + / 自动补全
- ctrl + 1 纠错
- ctrl + Alt + Down 复制一行
- ctrl + shift + F 格式化
* 注意:myeclipse当中的java源代码有的时候不保存是不会编译的。所以时刻记住:ctrl + s
* myeclipse当中,出现红色下划线的表示编译错误,语法错误。鼠标停留在红色的下划线上面会有错误提示信息。
并且点击左边的?,可以进行纠错。【当然也可以光标停在红色下划线上面:ctrl + 1】
* 有的时候程序出现黄色的下划线,表示警告,编译可以通过。
* 快捷建怎么设置?
window --> Preferences --> keys
* 怎么运行一个带有主方法的java程序?
- 在java源程序的任何位置点击鼠标右键 --> Run As -->Java Application
* com.bjpowernode.java.test01 表示四个包,四个package
3、关于程序的封装性:
面向对象三大特征:
- 封装
- 继承
- 多态
* 为什么要封装,封装有什么好处?
- 好处:封装之后,对于那个事物来说,看不到这个事物比较复杂的一面,只能看到该事物简单的那一面。
复杂性封装,对外提供简单的操作入口。照相机就是一个很好的封装案例,照相机的实现原理非常复杂,
但是对于使用照相机的人来说,操作起来是非常方便的是非常便捷的。还有像电视机也是封装的,电视机
内存实现非常复杂,但是对于使用者来说不需要关心内部的实现原理,只需要会操作遥控器就行。
- 封装之后才会形成真正的"对象",真正的"独立体"
- 封装就意味着以后的程序可以重复使用。并且这个事物应该适用性比较强,在任何场合都可以使用。
- 封装之后,对于事物本身,提高了安全性。【安全级别高】
* 封装的步骤
- 所有属性私有化,使用private关键字进行修饰,private表示私有的,修饰的所有数据只能在本类中访问。
- 对外提供简单的操作入口,也就是说以后外部程序要想访问age属性,必须通过这些简单的入口进行访问:
对外提供两个公开的方法,分别是set方法和get方法,set方法和get方法的方法名应该遵循规范。
想修改age属性,调用set方法
想读取age属性,调用get方法
- 可以通过source --> setter and getter来简化,不用自己打代码
- set方法的命名规范:
public void setAge(int a){
age = a;
}
//set方法没有返回值,因为set方法只负责修改数据 - get方法的命名规范:
public int getAge(){ //此方法叫成员方法,实例方法,非静态方法,成员方法必须使用引用.的方式访问
return age;
}
回想一下,一个属性通常访问的时候包括几种访问形式?
第一种方式:想读取这个属性的值,读取get
第二种方式:想修改这个属性的值。修改set
需要大家先背会以下内容:
setter and getter 方法没有static关键字
有static关键字修饰的方法怎么调用:类名.方法名(实参);
没有static关键字修饰的方法怎么调用:引用.方法名(实参);
-------------------------------------------------------------------------
public void setAge(int age){
age = age;//java有最近原则,这里其实并没有给age属性赋值,这里的age都是局部变量age
}
public void setAge(int a){
//编写业务逻辑代码进行安全控制
if(a < 0 || a > 150){
system.out.println("对不起,您提供的年龄不合法");
return;
}
//程序可以执行到这里的话,说明a年龄是合法的,则进行赋值运算
age = a;
}
4.构造方法:
关于java类中的构造方法
* 构造方法又被称为构造函数/构造器/Constructor
* 构造方法语法结构:
[修饰符列表] 构造方法名(形式参数列表){
构造方法体;
}
* 普通方法的语法结构:
[修饰符列表] 返回值类型 方法名(形式参数列表){
方法体;
}
* 对于构造方法来说,"返回值类型"不需要指定,并且也不能写void,只要写上void,那么这个方法就成为普通方法了。
* 对于构造方法来说,构造方法的方法名必须和类名保持一致。
* 构造方法的作用?
构造方法存在的意义是:通过构造方法的调用,可以创建对象。
创建对象的同时,初始化实例变量的内存空间。
* 构造方法应该怎么调用?
- 普通方法是这样调用的:方法修饰符中有static的时候:类名.方法名(实参列表)、方法修饰符列表中没有static的时候:引用.方法名(实参列表)
- 构造方法的调用:new 构造方法名(实参列表) * 构造方法调用执行之后,有返回值吗?
每一个构造方法实际上执行结束之后都有返回值,但是这个"return 值;"这样的语句不需要写。构造方法结束的时候java程序自动返回值。
并且返回值类型是构造方法所在类的类型。由于构造方法的返回值类型就是类本身,所以返回值类型不需要写。
* 注释和取消注释:ctrl + /; 多行注释:ctrl + shift + /
* 当一个类中没有定义任何构造方法的话,系统默认给该类提供一个无参数的构造方法,这个构造方法被称为缺省构造器。
* 当一个类显示的将构造方法定义出来了,那么系统就不再默认为这个类提供缺省构造器。建议开发中手动的为当前类提供无参数构造方法。
因为无参数构造方法太常用了。
* 构造方法支持重载机制。在一个类当中编写多个构造方法,这多个构造方法显然已经构成方法重载机制。
* 只要构造函数调用就会创建对象,并且一定是在"堆内存"中开辟内存空间。
* 只有方法才有()
* 在myeclipse当中怎么查看访问的是哪个属性,查看访问的是哪个方法?
按ctrl键,鼠标移动到查看的元素上,出现下划线的时候开始单击。
* 在一个类中元素过多,想快速查看,在当前类中使用ctrl + o 快捷键,然后输入要查找的元素名称,该名称不一定输入全名称
* 成员变量之实例变量,属于对象级别的变量,这种变量必须先有对象才能有实例变量。
实例变量没有手动赋值的时候,系统默认赋值,那么这个系统赋值是在什么时候完成的呢?
是在类加载的时候吗?
不是,因为类加载的时候只加载了代码片段,还没来得及创建对象,所以此时实例变量并没有初始化。
实际上,实例变量的内存空间是在构造方法执行过程当中完成开辟的。完成初始化的。
系统在默认赋值的时候,也是在构造方法执行过程当中完成的赋值。
实例变量默认值:
byte,short,int,long 0
float,double 0.0
boolean false
引用数据类型 null
* 构造方法也可以不写,由机器自动生成,右键-->source-->Constructor
* myeclipse/eclipse快速编辑,支持多行同时编辑:块编辑(右上角:Toggle Block Selection Mode 快捷键是Alt + shift +A)