对面向对象的理解和this static的理解

对象理解

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其计数作用。


总结:要学会分析内存,理解对象!学会对象的设计思路



 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值