静态,非静态,递归

#静态与非静态
static表示静态的。
他需要常驻内存,一直占用内存,无法进行垃圾回收,需慎用,他在那种情况适用呢?
不管哪个对象调用,结果都是一样的(这个结果的一致指的是你输出的数据图案的一致性等等),调用可直接用类名字调用,不许要变量名了。和对象就没有关系了。
之前所说的对象是是Java中所面对的东西,也就是你要用程序解决问题的哪一个,Java是面对对象的语言,
建立方法最好是单独定义一个类,类里面存在共同的特征。就相当于一个模板
当你建立方法的时候你最好单独把方法集中放在一个类中,,这样不同的对象皆可应用这个类,用 “ ,“表示所属关系
静态方法和非静态方法的调用内存方式是不一样的,静态得是占了一个存储空间,他就不变了,而非静态是随你调用方法(通过new调用构造方法)时开始开辟内存,一个变量对应一个指定的内存,当你调用完以后,你开辟的内存随之消失,

##静态方法(static method)
与静态成员变量一样,属于类本身,在类装载的时候被装载到内存中,不自动进行销毁,会一直存在内存中,直到JVM关闭;

##非静态方法(non-static method)
又称实例化方法,属于实例对象,实例化之后才会分配内存,必须通过类的实例来引用,当实例对象被JVM回收之后,也跟着消失

##静态方法和实例方法的区别
1.生命周期
静态方法的生命周期从进程创建时就开始,一直到进程结束,所以说静态方法是全局的,贯穿整个进程

实例方法的生命周期,从实例化对象开始,一直到实例化对象被注销回收之后结束

所以实例方法的生命周期是短于静态方法的生命周期,这也是实例方法中不能调用静态方法的原因

2.调用方式
在外部调用静态方法时,可以使用 “类名.方法名”的方式,也可以使用“对象.方法名”的方式,也就是说调用静态方法时无需创建对象

实例方法只能使用“对象.方法名的方式”

3.访问限制
静态方法在访问本类的成员时,只允许访问静态成员(即静态变量和静态方法),而不允许访问实例成员变量和实例方法;而实例方法则无此限制

实例成员变量是属于某个对象的,在静态方法执行时,并不一定存在该对象;同理,如果允许静态方法访问实例成员方法,就间接的可以访问实例成员变量,所以也不能访问实例成员方法;基于同样的道理,静态方法中也不能使用关键字this

4.执行顺序
当一个class文件被ClassLoader load进入JVM之后,方法指令保存在Stack中,此时Heap区并没有数据。然后程序技术器开始执行指令,如果是静态方法,直接依次执行指令代码,当然此时指令代码是不能访问Heapshuju数据区的;如果是实例方法(实例方法有一个隐含的传入参数,该参数是JVM给它的,这个参数就是实例对象在Stack中的内存地址,因此实例方法才可以找到在Heap中属于自己的数据),则在调用前必须实例化该对象,在Heap中分配数据,并将Stack中的内存指针通过JVM的隐含参数传给实例方法。若不实例化直接调用,由于隐含参数没有值,会报错。

#递归
计算机科学的新学生通常难以理解递归程序设计的概念。递归思想之所以困难,原因在于它非常像是循环推理(circular reasoning)。它也不是一个直观的过程;当我们指挥别人做事的时候,我们极少会递归地指挥他们。

Introduction

递归算法是一种直接或者间接调用自身函数或者方法的算法。

递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。递归算法对解决一大类问题很有效,它可以使算法简洁和易于理解。

递归算法,其实说白了,就是程序的自身调用。它表现在一段程序中往往会遇到调用自身的那样一种coding策略,这样我们就可以利用大道至简的思想,把一个大的复杂的问题层层转换为一个小的和原问题相似的问题来求解的这样一种策略。

递归往往能给我们带来非常简洁非常直观的代码形势,从而使我们的编码大大简化,然而递归的思维确实跟我们的常规思维相逆的,我们通常都是从上而下的思维问题, 而递归趋势从下往上的进行思维。这样我们就能看到我们会用很少的语句解决了非常大的问题,所以递归策略的最主要体现就是小的代码量解决了非常复杂的问题。

递归算法解决问题的特点:

• 递归就是方法里调用自身。
• 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
• 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
• 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。

递归算法要求。递归算法所体现的“重复”一般有三个要求:

(1) 是每次调用在规模上都有所缩小(通常是减半);
  (2) 是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);
(3) 是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。
递归的顺序是先进后出,这个举个例子,阶乘
5的阶乘正常我们的思维是先12345
但是递归的思想怎么算呢
54321
也就是n!=(n-1)(n-2)!- (n-1)(n-2)*(n-3)!-----1直到找出出口
递归的关键是找到自己的规律,上一步与下一步是要有关系的,即上一步是下一步的结果,而且要有一个出口,即确定的值
这是普通思维定义的阶乘方法:
public class Methoud {
static int jiecheng(int n) {
int r=1;
for(int t=1;t<=n;t++) {
r=t;
}return r;

}
}
这是应用递归算法定义的阶乘方法
public class Methoud2 {
static int jiecheng(int n) {
int r=1;
if(n==1) {//所谓的出口
r=1;
}else {
r=n*jiecheng(n-1);
}return r;
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值