一、流程分支

If/else :基于boolean值的双分支

Switch:基于数字(整数、char、byte、枚举)、字符串

类型的多分支

Int month =5;

Switch

二、方法method

1.方法就是一个子程序

Java中方法的命名规范是驼峰命名法。

int add( int a, int b ){

int result = a + b;

return result;

}

float add( float a, float b){

float result = a + b;

return result;

}

2.方法也是有类型的

对于方法的使用者来说,返回值就是方法的类型

对于重载来说,方法签名就是其类型

方法签名:方法的名字+参数类型(多个,顺序严格的)

方法的返回值类型不属于签名的一部分

//这两个方法的方法签名相同,因此传的参数不知道调用哪一个方法,无法确定返回类型。

int add( int a, int b ){

int result = a + b;

return result;

}

float add( int a, int b ){

int result = a + b;

return result;

}

 签名不同才能重载!!

 

Tips:

1>对于java8中的拉姆达表达式来说,方法的类型包括

返回值类型->(参数类型<多个,顺序严格的>)

 

2>方法的返回值有一个特殊的类型void,、

没有返回值,也就是方法中没有return语句

 

种传值形式,实际是由参数的类型的性质决定的。

 

       基本类型:按值传递,把值复制到方法中

       引用类型:只是传递对象的引用,如果在方法中改变了对象(内部属性),就会影响这个对象

 

4>方法(包括面向对象)都不是必须的!方法和面向对象都是给程序设计人员使用的。所以写代码时,如果要定义方法,就是站在设计师的高度去完成方法的设计。

 

3.设计的必要性:

设计师有必要的(有利于提升质量、可维护性、效率、重用),但是设计是无止境的,适可而止。评价设计优劣的标准:简化、不用重复(消除重复代码)

 

4.提取方法,将功能只能分散

如果一个方法代码太多,指责太多,则表示需要对这个方法进行重构(Rafactor)。通常会使用提取方法的功能智能进行分散

IDE(Ecllipse)对此提供非常好的支持

举例:单位转换程序,所以的代码都可以写在main方法中。但是将调度职责和具体的转换职责进行拆分,将会使程序结构更加清晰。整个程序也会更加简单。

 

public Class UnitClac{

 //交互逻辑

static void main(String[] args){

//进行转换调度

}

 //业务逻辑

static void c2f(Scannerscanner){

//将摄氏度转换为华氏度

}

static void f2c(Scannerscanner){

//将华氏度转换为摄氏度

}

}

任何应用都由应用交互逻辑和业务逻辑2部分构成

交互逻辑可以随意改变,而且经常会随技术和流行趋势变化。

业务逻辑相对稳定。

交互逻辑通常围绕UI展开。

业务员逻辑通常围绕数据展开

具体来说就是收集数据、存储、分析、展示数据

Static (静态的)方法没有充分体现面向对象的特征。

对于static方法来说,类只是一个盒子(容器),static方法与对象(实例)关系不大。

三、程序调试

通过调试可以观察程序的执行过程和内部数据

调试是一个非常强大的能力(断点和单步执行是由CPU和JVM联合支持的)

通过“虫子”图标可以进入调试模式,如果没有看到调试视图,可以在右上角进行透视图的切换

加断点:让程序停留在断点的位置

单步执行:F5/F6

F5:进入方法

F6:越过方法

四、调用栈

先入后出

栈是一个只有一个口的容器,先进入栈的会落到栈底,出栈的时候最后出。最后进入栈的,在栈顶,出栈时先出。

方法调用时,需要在内存中开辟一块存储空间做为线程栈空间

每个线程都由自己的栈

调用方法时,会在栈中压入一个栈帧,用来存储这个方法的参数和局部变量

方法返回时 ,栈帧就会弹出,方法的参数和局部变量就会清除

方法调用时,调用栈不断处于涨落之中

如果调用的层级过深,调用栈可能会溢出

因为代码执行的速度很快,所以栈帧的生存时间很短,瞬间生灭

所以局部变量无法被外部使用

五、异常处理

程序执行时,遇到错误(调用栈中的错误)就会停止执行,如果错误数据不能清除掉,程序就无法恢复,最终崩溃。

而java等现代编程语言普遍提高了清理错误数据的机制

异常处理

早期的c语言没有异常处理机制

在java中,有一类异常很特别,它们叫做受查异常

 受查异常必须传递出去(thows)或者处理掉(try/catch),不能不管

try(){

}

当代码执行到try时,会建立一个安全点,一旦在try中发生错误

JVM就会检查并收集错误信息(错误的原因、错误的位置、当前调用栈的结构等)

然后利用这些信息创建一个Exception对象(类型取决于错误原因)

然后抛出(throw)这个异常对象

异常对象的传播当异常被抛出throw之后,JVM会沿着调用栈从上往下逐帧查找try建立的安全点,直到找到一个符合条件的catch或者到达栈底(崩溃)

Catch (SomeTypeException ex){

//清理

//异常对象的使用

}

//从这里继续执行

异常的catch

Catch是一个匹配的过程,只有类型匹配成功,才会接受(捕获),否则继续沿着调用栈查找。

当异常被处理后,上面的栈帧就会被清除

如果在错误之前打开了一个系统资源,则该资源就有可能没有正确地关闭,所有try catch后面可以写finally{   }

finally一定会被调用,可以用来关闭资源。

异常对象中包含的信息可以通过异常对象提供的方法获取到

getMessage()

getStackTrace()

printStackTracd() 可以把异常信息打印到控制台或指定的输出流中(保存成文件等)

作业:

1.画一个调用栈来表示多层方法调用的过程

 

static   void main(){

     double a = 3;

     double b =5;

  

     double c  = calcArc(3,5)

 

}

static double calcArc(double x, double y){

double m = pow(x);-+

double n = pow(y);

double 0 = m+n;

return sqrt(o);

}

2.Square类 a边长

Rectangle类    a,b长宽

Circle  类     r半径

Sidelength()周长

3.画一个异常传播的示意图

java方法的理解、调用栈与异常处理的更多相关文章

  1. 第5篇-调用Java方法后弹出栈帧及处理返回结果

    在前一篇 第4篇-JVM终于开始调用Java主类的main()方法啦 介绍了通过callq调用entry point,不过我们并没有看完generate_call_stub()函数的实现.接下来在ge ...

  2. JAVA方法定义和调用

    类的方法代表的是实例的某种行为或功能 定义类的方法 访问修饰 类型 方法名(参数列表){ //方法体 } 1.把方法当作一个模块,是个“黑匣子”,完成某个特定的功能,并返回处理结果 2.方法分类“ 返 ...

  3. java方法---定义,调用

    定义,调用 1.方法的定义 方法就是一段用来完成特定功能的代码片段,类似于其它语言的函数. 方法用于定义该类或该类的实例的行为特征和功能实现.方法是类和对象行为特征的抽象. 方法很类似于面向过程中的函 ...

  4. 初识JAVA——方法声明和调用

      class TempConverter{ public static void main(String[]args) { changeTemp("132"); } //定义花摄 ...

  5. Java方法通过RestTemplate调用restful接口

    背景:项目A需要在代码内部调用项目B的一个restful接口,该接口是POST方式,header中 Authorization为自定义内容,主要传输的内容封装在body中,所以使用到了RestTemp ...

  6. 第6篇-Java方法新栈帧的创建

    在 第2篇-JVM虚拟机这样来调用Java主类的main()方法 介绍JavaCalls::call_helper()函数的实现时提到过如下一句代码: address entry_point = me ...

  7. 第7篇-为Java方法创建栈帧

    在 第6篇-Java方法新栈帧的创建 介绍过局部变量表的创建,创建完成后的栈帧状态如下图所示. 各个寄存器的状态如下所示. // %rax寄存器中存储的是返回地址 rax: return addres ...

  8. 第48篇-native方法调用解释执行的Java方法

    举一个native方法调用解释执行的Java方法的实例,如下: public class TestJNI { static { System.load("/media/mazhi/sourc ...

  9. JNI中C调用Java方法

    背景需求 我们需要在JNI的C代码调用Java代码.实现原理:使用JNI提供的反射借口来反射得到Java方法,进行调用. JNI关键方法讲解. 1. 在同一个类中,调用其他方法 JNIEXPORT v ...

随机推荐

  1. Spring Boot中使用Spring-data-jpa

    在实际开发过程中,对数据库的操作无非就“增删改查”.就最为普遍的单表操作而言,除了表和字段不同外,语句都是类似的,开发人员需要写大量类似而枯燥的语句来完成业务逻辑. 为了解决这些大量枯燥的数据操作语句 ...

  2. python3的pip管理器pip3

    一且因为python2到3的痛苦升级,python3的pip程序也有一个别致的名字pip3 安装: apt-get install python3-pip 安装后不能直接使用pip,否则会提示没有安装 ...

  3. atitit.自动生成数据库结构脚本,或者更换数据库,基于hibernate4

    atitit.自动生成数据库结构脚本,或者更换数据库,基于hibernate4 目前近况:: 更换数据库,但是是使用spring集成的. <!-- hibernate配置文件路径 --> ...

  4. Decoration7:注册登录设计

    首先顶一个小目标:从前台写入用户数据后,登录的时候输入用户名和密码,能够查询数据库成功,同时记录session数据 1.Login界面,为了只关注主线任务,我直接套用一个bootstrap模板admi ...

  5. 信号处理函数(3)-sigaction() 为信号注册信号捕捉函数

    定义: int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact); 表头文件: #include& ...

  6. Vim-复制选中内容至系统剪贴板,光标移动到指定行的行首和行尾

    1.全选并复制到系统剪贴板 ggVG或ggvG 然后 "+y gg 让光标移到首行,在vim才有效,vi中无效 V 是进入Visual(可视)模式 G 光标移到最后一行 "+y 复 ...

  7. location.href 不响应的解决方法

    在某些时候修改元素的值的时候过快会导致失效 1.window.open("","_blank") 代替  不过也是打开新窗口 2.延迟调用location.hr ...

  8. js 去html 标签

    var stylereg = /style\=".+?"/g //去style样式 var alltagreg = /<[^>]*>/g //去除全部标签 var ...

  9. jquer WdatePicker 使用 手册

    1. 跨无限级框架显示 无论你把日期控件放在哪里,你都不需要担心会被外层的iframe所遮挡进而影响客户体验,因为My97日期控件是可以跨无限级框架显示的 示例2-7 跨无限级框架演示 可无限跨越框架 ...

  10. CodeForces 558D

     Guess Your Way Out! II Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...