学习面向对象,首先要了解的是面向过程,什么是面向过程呢?
如果从发展的角度来看,首先有的是面向过程,它主要完成的一些小的,简单的,不需要协作的事物。相当于我们古代的手工作坊。
面向对象
可以理解为流水线作业,每个(类)完成特定的功能。总而言之:面向对象适用复杂的,需要协作,大型的场合。
可以这么来看:一个汽车对象,它有自己的属性,比如:颜色、牌子、样式、座位数…,也有自己的方法,用来描述这个车的功能。
面向对象和面向过程的总结:
1、都是解决问题的方式。
2、面向对象只是在宏观方面,面向过程做细节。
类
(class)可以看做是一个模板,或者图纸,系统根据类的定义早出对象。由类构造对象的过程称为创建类的实例。
对象
object/instance(实例)
需要明白对象的三个主要特性:
- 对象的行为(behavior):可以对对象施加那些操作,活可以对对象使用那些方法?
- 对象的状态(state):当施加那些方法时,对象如何响应?
- 对象的标识(indentity):如何辨别具有相同行为与状态不同的对象。
2.1内存分析
内存分为栈和堆,堆中包括(方法区和)
栈:栈是一块内存,有一些特别的约定,一般“先进后出,后进先出”。计算机系统主要使用栈
2.2 构造方法
分为无参构造,有参构造。
无参构造
- 通过new关键字来调用
- 构造方法不能定义返回值类型,不能在构造器里面return返回某个值。
- 如果我们没有定义构造器,则编译器会自动定义一个无参的构造函数,如果我们已经自己定义,编译器就不用管了。
- 构造方法的名字必须和类名一样。
构造方法的第一句总是super();
public class User {
int id;
String name;
String pwd;
public User() {
}
public User(int id, String name) {
this.id =id;
this.name = name;
}
public User(int id ,String name,String pwd) {
super();
this.id=id;
//this.name =name;
this.pwd =pwd;
}
public static void main(String[] args) {
User u1 = new User();
User u2 = new User(101,"chenxiaoheng");
User u3 = new User(102,"陈恒","1001");
}
//测试构造方法/构造器
public class _03Test {
public static void main(String[] args) {
point p = new point(3.0,4.0);
point origin = new point (0.0,0.0);
System.out.println(p.getDistance(origin));
}
}
class point {
double x,y;
public point(double _x, double _y) {
x=_x;
y=_y;
}
public double getDistance(point p) {
return Math.sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y));
}
2.3垃圾回收机制
内存管理
java的内存管理很大程度指的就是对象的管理,其中包括独享空间的分配和释放。
空间分配:通过new关键字创建对象
空间释放:将对象赋值null即可,垃圾回收负责回收所有“不可达”对象的内存空间。
无用对象指的就是没有任何变量引用该对象。
过程
1.发现对象。
2.清理无用对象。
垃圾回收相关算法
1、引用计数法
该对象被引用一次,计数加一,缺点“循环引用的无用对象”不能识别。
public class Garbage {
String name;
int id;
public static void main(String[] args) {
Garbage g1 = new Garbage();
Garbage g2 = new Garbage();
g1.name = g2.name;
g1.id = g2.id;
g1=null;
g2 =null;
}
这里g1和g2的值实际上null。
2、引用可达法(根据搜索算法)
2.4通过分代的垃圾回收机制
2.5 jvm调优和 Full Gc
2.6开发中容易造成内存泄漏的操作
2.7 对象的创建过程和this 本质
创建对象分为如下四步:
1、分配对象空间,赋初始值为0或null;
2、执行属性值的显示初始化
3、执行构造方法
4、返回对象的地址给相关变量
功能
1、this代表当前对象
public class User01 {
int id;
String name;
String pwd;
public User01() {
}
public User01(int id, String name) {
System.out.println("正在初始化已经创建好的对象:"+this);
this.id = id;//不写this,无法区分局部变量id和成员变量id
this.name=name;
}
public void login() {
System.out.println(this.name +"要登录");
}
public static void main(String[] args) {
User01 u1 = new User01(101,"ch");
u1.login();
}
2、this代表重载方法
public class TestThis {
int a, b, c;
TestThis(){
System.out.println("正在初始化一个hello对象");
}
TestThis(int a ,int b){
this(); //调用无参的构造方法,并且必须位于第一行
a =a ;
//这里区分成员变量和局部变量
this.a=a;
this.b=b;
}
TestThis(int a, int b, int c){
//调用带参构造方法,并且必须位于第一行
this(a,b);
this.c =c;
}
void sing () {
System.out.println(a+""+b);
}
void eat() {
this.sing();//调用本类中的sing();
System.out.println("你妈妈喊你回家吃饭");
}
public static void main(String[] args) {
TestThis tt = new TestThis(1,2);
tt.eat();
}
2.8 static关键字
static修饰变量和方法,修饰的内容从属于类。
普通变量和普通方法从属于对象。
//练习Static
public class _04Test {
int id;
String name;
String pwd ;
static String company = "巨轮";
public _04Test(int id, String name) {
this.id=id;
this.name =name;
}
public void login() {
System.out.println("登录:"+name);
}
public static void printCompany() {
//login; 调用非静态成员,编译会不通过
System.out.println(company);
}
public static void main(String[] args) {
_04Test t = new _04Test(101,"ch");
t.printCompany();
t.company = "金轮";
t.printCompany();
}
不能使用动态方法,原因是编译器找不到是哪个对象的。
2.9静态初始化块
//静态初始化的使用
public class User02 {
int id;
String name;
String pwd;
static String company;
static {
System.out.println("执行初始化工作");
company = "巨轮";
printCompany();
}
public static void printCompany() {
System.out.println(company);
}
public static void main(String[] args) {
User02 u2 =null;
}
2.10Java中的值传递
Java中,方法中所有参数都是值传递,也就是传递的都是值的副本。也就是说我们得到的是复印件,而不是原件。
基本数据类型参数的传值
传递的是值的副本。副本改变不会影响原件。
引用类型参数的传值
传递的是值的副本。但是引用类型指的是“对象的地址”。因此,副本和原参数都指向了同一个“地址”,改变“副本指向地址对象的值”,也就意味着原参数指向对象的值也发生了改变。
特殊情况
多个变量指向同一个值时,其中一个变量改变值地址之后,值会发生变化。
public class User04 {
int id;
String name;
String pwd;
public User04() {
}
public User04(int id, String name) {
System.out.println("正在初始化已经创建好的对象:"+this);
this.id = id;//不写this,无法区分局部变量id和成员变量id
this.name=name;
}
public void testPapmeterTransfer01(User04 u) {
u.name ="cxh";
}
public static void main(String[] args) {
User04 u1 = new User04(101,"ch");
u1.testPapmeterTransfer01(u1);
System.out.println(u1.name);
}
2.11Java中的包机制
相当于文件夹,目的分类,方便管理。
命名:通常域名到这写 例如:com.taobao.*** 、 cn.awacky.***
JDK中的主要包
Java中的常用包
java.lang
包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。
java.awt
包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。
包含执行与网络相关的操作的类。
包含能提供多种输入/输出功能的类。
java.util
包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数。
2.12import导入类
如果使用其他包中的类,就需要导入包,也就是在类前输入地址。
//测试包的导入
import java.lang.Math;
public class _05Test {
public static void main(String[] args) {
System.out.println(Math.PI);
}
2.13静态导入
static import 是在JDK1.5新增加的功能,其作用是用于导入指定的静态属性,这样我们可以直接使用静态属性。
//测试包的静态导入
import static java.lang.Math.*; //注意区别
public class _06Test {
public static void main(String[] args) {
System.out.println(PI);
}