对象理解
JAVA语言是直接面向对象的语言,与以往的
当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后(比如,在函数A中调用函数B,在函数B中定义变量a,变量a的作用域只是函数B,在函数B运行完以后,变量a会自动被销毁。分配给它的内存会被回收),Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用本不同是:它的设计出发点更能直接的描述问题域中客观存在的事物。
对象用计算机语言来对问题域中事物的描叙,对象通过“属性”和“方法”来分别对应事物所具有的静态属性和动态属性。
类是用于描叙同一类型的对象的一个抽象概念,类定义了这一类对象所具有的静态和动态属性。
类可以看出一类对象的模板,即抽象话的,对象可以看成该类中一个具体的实例,即使类的实例化表现。如
或者说:类是对象的蓝图。他会告诉JVM如何创建某一类型的对象。根据某类创建出的对象都会有自己的实例变量。eg:你可以使用按钮类创建出许多大小,
颜色,文字等不同的按钮。总的说对象是类的实例化表现,如上图。
面对对象的优势:
A 比较高级的编程语言,更方便人与电脑的信息交流;使人们的编程与实际的世界更加接近,所有的对象被赋予属性和方法,更富有人性化。
B 相比面向过程的语言,对象语言更加容易修改,修改部分只在局部模块,不像C++需要全局分析修改
对象的设计思路:
记住万事万物皆对象!!万事万物皆对象!!万事万物皆对象!!
在设计类时,要记得对象是靠类的模型塑造出来的。对象已知的事物被称为i:实例变量,既是对象的属性;
对象可以执行的动作称为:方法。比如:
public class DogTest{
public static void main (String [] args ){
Dog dog = new Dog();//创建一个dog的对象
dog.name ="F";//存取该对象的变量值,即属性值
dog.play();//调用方法,让狗玩
}
}
class Dog{
Sring name ;//声明这个对象包含的属性 这狗的名字
int size ;//声明这个狗的大小
void play(){//可以调用的方法
System.out.println("Run,Run");
}
}
要记得原理主方法main,main一般只需要干两件事:测试真正的类;启动你的java程序
真正的java程序只会让对象与对象交互,而main只是创建对象和启动程序!
this 的理解
简单点指:它可以在类里面来引用这个类的属性和方法。可以出现在实例方法中和构造方法中
但是this不能出现在类方法中,因为类方法可以通过类名直接调用,这时可能还没有任何对象被new出来。
如果你想在实例方法或类方法内使用成员变量,对于实例方法,成员变量前面的“this”就不能省掉;对于类方法,必须使用类名操作类变量。
static 的理解:
static表示 全局 或者 静态 的意思,用来修饰成员变量和成员方法。
这要class文件被加载了,首先先给static所修饰的内容分配内存,所以可以在任何对象没有创建之前就可以访问。
static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问(不需要实例化),访问语法为:
类名.静态方法名(参数列表...)
类名.静态变量名
在类中,用static声明的成员变量为静态成员变量,也称为类变量,与成员变量区别是,jvm只为静态分配一次内存。
static声明的方法称为静态方法或类方法,
在调用方法时,不会将对象的引用传递给他,所以static方法中不可访问非static成员。
内存解析和地址:
一个完整的java程序会运行中涉及以下主要内存区域:
1,栈内存空间: 保存局部变量的值,包括:1用来保存基本数据类型的值 2保持类的实例,即堆区对象的应用。
也可以用来保存加载方式时的帧。
当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后
(比如,在函数A中调用函数B,在函数B中定义变量a,变量a的作用域只是函数B,在函数B运行完以后,
变量a会自动被销毁。分配给它的内存会被回收),Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。
2,堆内存:用来存放动态产生的数据,比如new出来的对象。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。
因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。
3,全局数据区:保存所有static类型的属性,会在JVM执行时优先分配一次内存
4,全局代码区:保持所有方法定义。
5,常量池:JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合。包括直接常量(基本类型,String)
和对其他类型、方法、字段的符号引用(1)。池中的数据和数组一样通过索引访问。由于常量池包含了一个类型所有的对其他类型、方法、字段
的符号引用,所以常量池在Java的动态链接中起了核心作用。常量池存在于堆中。
eg:
首选将静态sid存放到 数据区,Cat.sid = 100 ,将值赋给sid=100,又分别创建了2个Cat对象mimi和pipi,栈内存也同时分配一变量mimi,同过栈内存mimi可以找到
堆内存中new出的对象(类似指针);看程序又传值“mimi”的字符串,又字符串在数据区分配内存,再调用构造函数时,为形参name在栈内存临时分配内存,并指向字符串mimi,this.name =name ,就是对象中的name也指向“mimi“,之后构造函数完成,name消失。
同理pipi内存也是同样的!其中sid其计数作用。
总结:要学会分析内存,理解对象!学会对象的设计思路
原文:http://blog.csdn.net/huandroid/article/details/51887036