精华内容
下载资源
问答
  • java方法学习方法概念什么是方法方法就是完成某些事情的过程,如:实现两个数相加,用方法add(数值1,数值2)。1、System.out.print(),System是系统的一个类,out是输出对象,print()就是方法。2、java方法是语句的...

    java方法学习

    方法概念

    什么是方法

    方法就是完成某些事情的过程,如:实现两个数相加,用方法add(数值1,数值2)。

    1、System.out.print(),System是系统的一个类,out是输出对象,print()就是方法。

    2、java方法是语句的集合,它们在一起执行一个功能。

    ​ 2.1、方法是解决一类问题的步骤的有序组合

    ​ 2.2、方法包含于类或对象中

    ​ 2.3、方法在程序中被创建,在其他地方被引用, (java中有很多已经定义的方法,不需要我们一个一个的写,直接引入调用即可)

    3、设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。设计方法最好保持方法的原子性。即一个方法值完成一个功能,这样有利于后期的拓展。

    4、方法的命名规则:首字母小写加驼峰命名法,如:userAdd、userDelete、userFron

    方法的定义

    1、java的方法类似于其他语言的函数,是一段用来完成特定功能代码片段。

    2、方法包含一个方法头和一个方法体:

    ​ 2.1方法头:

    ​ 修饰符:修饰符是可选的,定义该方法的访问类型。

    ​ 返回值类型:方法可能返回数据的类型,void:表示没有返回值。

    ​ 方法名:方法的名称。

    ​ 参数类型:参数相当于一个占位符。形式参数:用于接受外界输入的数据。实参:调用方法时实际传给方法的数据。

    ​ 2.2、方法体:

    ​ 方法体包含具体的语句,定义该方法的功能。

    3、语法:

    修饰符 返回值类型 方法(参数类型 参数名) {

    //方法体

    return 返回值;

    }

    8a19a9e2fdfdc7c21315c6e303519b35.png

    方法重载

    方法重载的定义

    1、在一个类中有相同的名字,但形式参数不同。

    2、方法重载规则:

    ​ 2.1、方法名必须相同。

    ​ 2.2、参数列表不同(个数不同或者类型不同或者参数排序不同等)

    8e8371f319d448cac372a230ba15ab72.png

    可变参数

    1、JDK1.5开始,java支持传递同类型的可变参数给一个方法。

    2、在方法声明中,在制定参数类型后加一个省略号(...)

    3、一个方法只能指定一个可变参数,它必须是方法的最后一个参数,任何普通参数必须在它之前声明。

    0a537101d1d26b1540b7a71406326d95.png

    递归

    1、递归:就是方法A调用方法A,就是自己调用自己

    2、递归结构包括两个部分:

    ​ 2.1、递归头:什么时候不调用自身方法,没有递归头将陷入死循环。

    ​ 2.2、递归体:什么时候调用自身方法。

    9dc9346b8ba6643fac9678126c296ac1.png

    bc3b0899a9f2bcf2dfd52eab460713e3.png

    展开全文
  • 什么是方法方法的定义和调用值传递:指的是在方法调用时,传递的是参数是按值的拷贝传递。特点:传递的是值的拷贝,也就是传递后就互不相关了。...Java中数据类型分为两大类,基本类型和对象类型。相应的,变量...

    什么是方法

    c12e59bc458b95b28228de947705b405.png

    方法的定义和调用

    7be45c281dc1ce73b2bf023e61e29d3a.png

    fa67c5a49fd71aec09a6e423e8dc0059.png

    值传递:指的是在方法调用时,传递的是参数是按值的拷贝传递。

    特点:传递的是值的拷贝,也就是传递后就互不相关了。

    引用传递:指的是在方法调用时,传递的参数是按引用进行传递,其实传递的是引用的地址,也就是变量所对应的内存空间的地址。

    特点:传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。

    Java中数据类型分为两大类,基本类型和对象类型。相应的,变量也有两种类型:基本类型和引用类型。

    基本类型的变量保存原始值,即它代表的值就是数值本身;

    而引用类型的变量保存引用值,"引用值"指向内存空间的地址,代表了某个对象的引用,而不是对象本身,

    对象本身存放在这个引用值所表示的地址的位置。

    基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress,

    引用类型包括:类类型,接口类型和数组。

    其中比较特殊一点的是String类型和基本类型的包装类类型,它们也是按值传递的,但它是属于引用类型

    基本类型,值就直接保存在变量中。而String是引用类型,变量中保存的只是实际对象的地址。一般称这种变量为"引用",引用指向实际对象,实际对象中保存着内容

    事实上,java里面参数传递只有值传递一种,因为引用传递可以相当于传递的是引用值。至于引用值是什么,我们可以类比C语言得指针变量,它存放的也是一段内存空间的地址。在不同方法之间,看似传递的是一个对象,但其实对象的位置并没有动,只是将存放对象的内存地址进行了传递,这样当改变对象的一些属性时,也会的的确确改变堆内存中对象的某些属性值

    方法的重载

    5d0c3f726090483699e47f0ba2482b62.png

    命令行传递参数

    34b65778822671cbf5bd653212d25382.png

    81d863021acb458ad2bfca365f2e9ae8.png

    752cd53a33f321768f2fff94136c7ba8.png

    可变参数

    f3bc270e88a31a89d9f8336f820b0df0.png

    public class Demo02 {

    public static void main(String[] args) {

    Demo02 demo02 = new Demo02();

    demo02.test(1);

    }

    public void test(int x,int... i){

    System.out.println(i[0]);

    }

    }

    递归

    8ad6ecfeb754a78030e99cd4c75cf9e9.png

    展开全文
  • 灯塔君跟大家讲:JVM源码分析之Java对象实现HotSpot虚拟机中,对象在内存中的布局分为三块区域:对象、实例数据和对齐填充。对象对象包括两部分:Mark Word 和 类型指针。Mark WordMark Word用于存储对象...

    f285c4cbf8fae9743d95c33ace45395e.png

    原创申明:本文由公众号【猿灯塔】原创,转载请说明出处标注

    “365篇原创计划”第十一篇。

    今天呢!灯塔君跟大家讲:

    JVM源码分析之Java对象头实现

    HotSpot虚拟机中,对象在内存中的布局分为三块区域:对象头、实例数据和对齐填充。

    对象头

    对象头包括两部分:Mark Word 和 类型指针。

    Mark Word

    Mark Word用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,占用内存大小与虚拟机位长一致。

    类型指针

    类型指针指向对象的类元数据,虚拟机通过这个指针确定该对象是哪个类的实例。

    markOop实现

    HotSpot通过markOop类型实现Mark Word,具体实现位于markOop.hpp文件中。

    由于对象需要存储的运行时数据很多,考虑到虚拟机的内存使用,markOop被设计成一个非固定的数据结构,以便在极小的空间存储尽量多的数据,根据对象的状态复用自己的存储空间,32位虚拟机的markOop实现如下:

    efe9f1927e66f30cdb0e2689e2878620.png

    hash: 保存对象的哈希码

    age: 保存对象的分代年龄

    biased_lock: 偏向锁标识位

    lock: 锁状态标识位

    JavaThread:* 保存持有偏向锁的线程ID

    epoch: 保存偏向时间戳

    markOop:中不同的锁标识位,代表着不同的锁状态:

    79f8994ea49db5ccd0cbf9792c1d9c86.png

    不同的锁状态,存储着不同的数据:

    026c55069241982e80b81ea7d1d0d89b.png

    markOop中提供了大量方法用于查看当前对象头的状态,以及更新对象头的数据,为synchronized锁的实现提供了基础。

    下面来看看代码吧:

    首先定义两个简单的类AAA和BBB

    2acaf73361674d74d416727c69c49983.png

    通过``javap -c AAA```查看编译之后的字节码,具体如下:

    51830f43608c7d5aef9ccd97d76aa11f.png

    Java中的new关键字对应jvm中的new指令,定义在InterpreterRuntime类中,实现如下:

    8a865fdc004d90610947bb59d5a21ae6.png

    new指令的实现过程:

    1、其中pool是AAA的constant pool,此时AAA的class已经加载到虚拟机中,new指令后面的#2表示BBB类全限定名的符号引用在constant pool的位置;

    2、方法pool->klass_at负责返回BBB对应的klassOop对象,实现如下:

    dcbcc49e8eabb76907ccb2734146eb0f.png

    如果常量池中指定位置(#2)的数据已经是个oop类型,说明BBB的class已经被加载并解析过,则直接通过(klassOop)entry.get_oop()返回klassOop;否则表示第一次使用BBB,需要解析BBB的符号引用,并加载BBB的class类,生成对应的instanceKlass对象,并更新constant pool中对应位置的符号引用;

    3、klass->check_valid_for_instantiation可以防止抽象类被实例化;

    4、klass->initialize实现如下:

    468b8239ac7cc3488753b0c792d318cb.png

    如果BBB的instanceKlass对象已经初始化完成,则直接返回;否则通过initialize_impl方法进行初始化,整个初始化算法分成11步,具体实现如下:

    step1

    a2c40f4e8e42a8aa410fcdafb3f80cc1.png

    通过ObjectLocker在初始化之前进行加锁,防止多个线程并发初始化。

    step2

    2844c30fa4f99ceb738c3765700973d9.png

    step3

    4b7ca7362fa478d2577473e94823d3a6.png

    如果当前instanceKlass处于being_initialized状态,且被当前线程初始化,则直接返回。

    其实对于这个step的处理我有疑问,什么情况会走到这一步?经过RednaxelaFX大大提点,如下情况会执行step3:

    例如A类有静态变量指向一个new B类实例,B类里又有静态变量指向new A类实例,这样外部用A时要初始化A类,初始化过程中又要触发B类初始化,B类初始化又再次触发A类初始化。

    4c59deaa397d7721ec06c80beb01bbdf.png

    如果当前instanceKlass处于fully_initialized状态,说明已经初始化完成,则直接返回;

    step5

    4ead10408e82018c5b9cd5483c87d75e.png

    如果当前instanceKlass处于initialization_error状态,说明初始化失败了,抛出异常。

    step6

    2abc28ae16bf40613de6b82749d7fff5.png

    设置当前instanceKlass的状态为 being_initialized;设置初始化线程为当前线程。

    8373689797832597383e1b0706eaf079.png

    如果当前instanceKlass不是接口类型,并且父类不为空,且还未初始化,则执行父类的初始化。

    step8

    97b3533a2e404ba2a46ef5142fdf4a3b.png

    通过this_oop->call_class_initializer方法执行静态块代码,实现如下:

    2ae5f1eff8b228443dc690ebff4f2b3b.png

    this_oop->class_initializer()可以获取静态代码块入口,最终通过JavaCalls::call执行代码块逻辑,再下一层就是具体操作系统的实现了。

    step9

    84914183a44f9a1c71caae8d1e053f96.png

    如果初始化过程没有异常,说明instanceKlass对象已经初始完成,则设置当前instanceKlass的状态为 fully_initialized,最后通知其它线程初始化已经完成;否则执行step10 and 11。

    step10 and 11

    894ff609c35f1d670cd4976605772f0d.png

    如果初始化发生异常,则设置当前instanceKlass的状态为 initialization_error,并通知其它线程初始化发生异常。

    5、如果instanceKlass初始化完成,klass->allocate_instance会在堆内存创建instanceOopDesc对象,即类的实例化;.

    instanceOopDesc

    当在Java中new一个对象时,本质是在堆内存创建一个instanceOopDesc对象。

    326cd10cd5c7c6469ae242f188a1e0fe.png

    instanceOopDesc在实现上继承自oopDesc,其中oopDesc定义如下:

    539ec0da1a32e8691cf8d01a7f8bd126.png

    当然,这只是 oopDesc的部分实现,oopDesc包含两个数据成员:_mark 和 _metadata。

    1、_mark是markOop类型对象,用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,占用内存大小与虚拟机位长一致,更具体的实现可以阅读 《java对象头的HotSpot实现分析》

    2、_metadata是一个联合体,其中wideKlassOop和narrowOop都是指向InstanceKlass对象的指针,wide版是普通指针,narrow版是压缩类指针(compressed Class pointer)

    instanceOopDesc对象的创建过程

    d8b6fef0a8996647f3da29b0d6d699eb.png

    instanceOopDesc对象通过instanceKlass::allocate_instance进行创建,实现过程如下:

    1、has_finalizer判断当前类是否包含不为空的finalize方法;

    2、size_helper确定创建当前对象需要分配多大内存;

    3、CollectedHeap::obj_allocate从堆中申请指定大小的内存,并创建instanceOopDesc对象,实现如下:

    f44f9c1c4914c93e895abe6ab11b18e2.png

    4、如果当前类重写了finalize方法,且非空,需要把生成的对象封装成Finalizer对象并添加到 Finalizer链表中,对象被GC时,如果是Finalizer对象,会将对象赋值到pending对象。Reference Handler线程会将pending对象push到queue中,Finalizer线程poll到对象,先删除掉Finalizer链表中对应的对象,然后再执行对象的finalize方法;

    365天干货不断微信搜索「猿灯塔」第一时间阅读,回复【资料】【面试】【简历】有我准备的一线大厂面试资料和简历模板

    展开全文
  • 方法的作用:(1)代码的复用性(2)功能的独立 --- 复杂的需求简单化方法的语法:方法的定义——“写一个方法”(1)方法的声明部分修饰符 返回类型 方法名(参数列表)public static void main(String[] args)方法的修饰符...

    方法的作用:

    (1)代码的复用性

    (2)功能的独立  ---  复杂的需求简单化

    方法的语法:

    方法的定义——“写一个方法”

    (1)方法的声明部分

    修饰符  返回类型  方法名(参数列表)

    public static void main(String[] args)

    方法的修饰符有两类:

    1.访问控制修饰符(public,private,protected,package)

    cff6ccc62b681ad6d3e9fccac146dad8.png

    2.方法本身修饰符(static,final,abstract,native,synchronized)

    public:表示公共的,代表任何本工程的其他类的其他方法都可以调用它。

    static:是面向对象里的概念,表示静态方法。

    返回类型:

    是该方法结束过后,要返回给调用者返回的值(返回值)的数据类型;

    如果没有返回值,那么返回类型就是void

    方法名:

    准确的表述方法完成的功能。一般是动词

    login——登录

    参数列表(形参):

    它是调用者在调用方法的时候,传递给方法的一些初始数据。

    如果不需要传入参数,该方法就定义为无参,但是无参也不能少()

    数据类型  变量1,数据类型  变量2,……数据类型 变量n

    (2)方法的实现部分

    注意:方法的实现包括了{},以及里面的所有代码。

    就算只有{},也是方法定义完成了,只不过这个方法被调用的时候,没有任何语句可以执行。

    方法里面可以书写我们目前学过的代码,但是在一个方法的实现部分再定义一个方法是不行的。

    只有方法的定义,只代表这个功能块,但是不能表示这个功能就被执行了,要执行这个方法,我们要方法的调用。

    调用的语法:

    方法名(参数列表);——实参

    注意:

    传参的时候,要保证参数的个数、参数的类型、参数的顺序和参数保持一致。

    return关键字:

    (1)结束方法,返回到方法调用处

    (2)如果没有返回值(void)时,可以不写,也可以直接写return。如果有,return就要接真正的值。

    带值return要注意:

    (1)返回值类型必须与本方法声明的返回类型一致。

    (2)本方法的所有执行路径都要做return

    java当中实参和形参的传递是:值传递(传值)。

    但是由于java有两种数据类型,基本数据类型和引用数据类型,他们保存数据的方式不同,从而造成参数传递的时候效果不同。

    (1)如果参数是基本数据类型,方法里面对形参的操作不会影响方法外面实参变量。

    (2)如果参数是引用数据类型,方法里面的形参的操作是会影响方法外面的实参的。

    因为形参和实参通过值传递指向了同一个对象

    在方法嵌套调用的过程中,方法的执行流程体现的是一种栈结构----即:先进后出

    所以又称之为“方法调用栈”

    方法的重载:

    再一个类中,可以定义多个重名方法,只是参数列表不同。

    参数列表不同:类型、个数、顺序

    展开全文
  • 我正在检查treemap的headmap方法,它返回的映射部分的键严格小于tokey。所以我希望输出是b,c,但它只返回b。我做了一件奇怪的事,我改变了compareto方法,如下所示return this.priority > o.priority ? 1 : -1;然后它...
  • 用户交互ScannerJava.util.Scanner是Java5的新特征基本语法:Scanner s = new Scanner(System.in)获取:next() nextLine() nextInt()判断:hasNext() hasNextLine() hasNextInt()public class Test {public static ...
  • public class Test{public static void main(String[] args){Test t = new Test();int[][] oldArrs = {{4, 2},{1, 7},{4, 5},{1, 2},{1, 1},{4, 1}};int[] tempArr = null;int width = 0;int height = 0;...
  • import org.springframework.web.multipart.MultipartFile;import javax.servlet....import java.io.File;import java.io.IOException;/*** Created by Zenz.*/public class Upload {/*** 头像上传...
  • import org.springframework.web.multipart.MultipartFile;import javax.servlet....import java.io.File;import java.io.IOException;/*** Created by Zenz.*/public class Upload {/*** 头像上传...
  • 本文实例讲述了JAVA获取HTTP请求方法。分享给大家供大家参考,具体如下:在利用Java网络编程时,利用Java获取HTTP Request 和 Response字段;可以利用Java语言根据需要添加自定义的HTTP字段,而不必拘泥于...
  • Java编程中定义方法方法包含一个方法头和一个方法体。下面是一个方法的所有部分:修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。返回值类型 :方法可能会返回值。returnValue...
  • 方法 java_Java方法

    2021-03-05 18:58:42
    JAVA方法1.1 方法的概念Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用设计方法的原则:方法的本意是功能块,就是...
  • 本文实例讲述了java获取HTTP请求方法。分享给大家供大家参考,具体如下:在利用Java网络编程时,利用Java获取HTTP Request 和 Response字段;可以利用Java语言根据需要添加自定义的HTTP字段,而不必拘泥于...
  • 本文实例讲述了JAVA获取HTTP请求方法。分享给大家供大家参考,具体如下:在利用Java网络编程时,利用Java获取HTTP Request 和 Response字段;可以利用Java语言根据需要添加自定义的HTTP字段,而不必拘泥于...
  • java方法

    2020-07-04 01:02:14
    java方法 ...方法包含方法头和方法体 修饰符 返回值类型 方法名 参数类型 方法体 调用方法:对象名.方法名(实参列表) java支持2种调用方法,根据方法是否返回值来选择 方法重载 重载就是在一个类
  • Java方法

    2021-02-22 09:18:53
    Java方法 1、方法定义 Java的方法用来完成特定功能的代码片段,方法包含一个方法头和一个方法体。 修饰符:可选,告诉编译器如何调用该方法。定义了该方法的访问类型 返回值类型:方法可能会返回值 方法名:...
  • java 方法

    2021-01-20 22:35:45
    java 方法 所谓方法 System.out.println() 类 . 对象. 方法 方法是语句的集合,他们在一起执行一个功能 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 ...方法包含一个方法头和一个方法体。
  • 本文实例讲述了Android中Java根据文件获取文件类型的方法。分享给大家供大家参考,具体如下:前面讲过Android系统内部的MediaFile类来获取文件类型的办法,这个类主要是根据文件的扩展名来判断,其准确性不是很好...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,551
精华内容 2,620
关键字:

java方法头

java 订阅