java调用方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java调用方法相关的知识,希望对你有一定的参考价值。

class PetShop // 宠物商店
private Pet[] pets ; // 保存一组宠物
private int foot ;
public PetShop(int len)
if(len>0)
this.pets = new Pet[len] ; // 开辟数组大小
else
this.pets = new Pet[1] ; // 至少开辟一个空间


public boolean add(Pet pet) // 增加的是一个宠物
if(this.foot<this.pets.length)
this.pets[this.foot] = pet ; // 增加宠物
this.foot ++ ;
return true ;
else
return false ;


public Pet[] search(String keyWord)
// 应该确定有多少个宠物符合要求
Pet p[] = null ;
int count = 0 ; // 记录下会有多少个宠物符合查询结果
for(int i=0;i<this.pets.length;i++)
if(this.pets[i]!=null) // 表示此位置有宠物
if(this.pets[i].getName().indexOf(keyWord)!=-1
||this.pets[i].getColor().indexOf(keyWord)!=-1)
count++ ; // 修改查找到的记录数



p = new Pet[count] ; // 开辟指定的大小空间
int f = 0 ; // 增加元素的位置标记
for(int i=0;i<this.pets.length;i++)
if(this.pets[i]!=null) // 表示此位置有宠物
if(this.pets[i].getName().indexOf(keyWord)!=-1
||this.pets[i].getColor().indexOf(keyWord)!=-1)
p[f] = this.pets[i] ;
f++ ;



return p ;


;
private Pet[] pets ;第二句中的这个pest是什么东西?怎么下面的还能当数组用?想不明白
还有倒数第8和9句this.pets[i].getName().indexOf(keyWord)!=-1 一个数组this.pets[i]还能去调用方法getName()?

先通俗的分析下,我们把类看作是一个房子。房子里面有家具,桌椅板凳之类的,房子里面还有人。
房子里面所有的人都应该是共有一套家具的。也就是说,这些家具是唯一的,如果某个家具坏了,那么大家都用不了。
我们再看一看定义,java的静态变量也叫做类变量,它开始于类的创建,结束于类的消亡。非静态变量叫做实例变量,它开始于类的实例的创建,结束语类的实例的消亡。静态变量被所有实例所共享。也就是如上面的例子,座椅板凳是类变量,它们是在房子被建好了之后就被添加放置进来,而且基本都是唯一的。人就相当于实例,每个人都能用这些家具,但是如果家具一旦损坏,那就是坏了,或者你把某一个家具搬走,那么所有的人都用不了这个家具,房子里也不存在这个家具了。
但是房子里可以进很多人,可以进张三,也可以进李四。所以这些人就是类的实例对象,他们身上穿的衣服就可以叫做实例变量。
如果一个类中有静态变量的话,程序首先会把该静态变量加载进内存中,也就是在堆中开辟一个区域专门存放。以后不管你new多少个类的对象,该静态变量永远都是在那里的。也就是说,静态变量在类的初始化一次后,系统就不会为该变量开辟新的内存空间。而每new一个类的对象,系统就会重新在
堆内存中开辟一个新空间来存放该类的实例对象,并且栈中也会有一个新的引用变量去指向它。
静态方法也是类似,但是有一点要强调,静态方法只中不能调用非静态方法。因为被static修饰的方法会首先被Classloader对象先加载进内存,而这个时候可能其它的非静态方法或者变量还没有被加载进来。就好比我现在想做包子,现在面粉被static修饰,首先已经拿到你身边,可是因为包子馅不是static修饰的,所以可能包子馅儿还没运过来,你说怎么做的出包子呢。
被static修饰过的都是随着类的初始化后就产生了,在堆内存中都有一块专门的区域来存放,所以只需要类名点方法名或者变量名即可。而非静态的就必须通过类的对象去调相应的。
参考技术A pets就是一个数组,其中每个元素是Pet类型,这和整型数组类似
this.pets[i].getName().indexOf(keyWord)!=-1

this.pets[i]得到这个数组的第i个元素,就是一个Pet对象,可以这样看
Pet p=this.pets[i];
p.getName().indexOf(keyWord)!=-1本回答被提问者采纳

深入理解Java虚拟机——方法调用(解析调用)

目录

一、方法调用的概述

  • 方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法)
  • 方法调用分为解析调用、静态分派调用和动态分派调用

二、解析调用

2.1、解析调用的概述

  • 方法在程序真正运行之前就有一个可确定的调用版本,并且这个方法的调用版本在运行期是不可改变的。
  • 换句话说,调用目标在程序代码写好,编译器进行编译时就必须确定下来。这类方法的代用称为“解析”

2.2、适合类加载阶段进行解析的方法

  • 在Java语言中符合“编译期可知,运行期不可变”这个要求的方法,主要包括静态方法私有方法两大类,前者与类型直接关联,后者在外部不可被访问,这两种方法各自的特点决定了他们都不可能通过继承或别的方式重写其他版本。

2.3、java虚拟机提供的5条方法调用字节码指令

指令描述
invokestatic调用静态方法
invokespecial调用实例构造器< init>方法、私有方法和父类方法
invokevirtual调用所有的虚方法
invokeinterface调用接口方法,会在运行时再确定一个实现此接口的对象
invokedynamic先在运行时动态解析出调用点限定符所引用的方法,然后再执行该方法

2.4、非虚方法和虚方法的概述

  • 解析阶段中确定唯一的调用版本,符合这个条件的有静态方法、私有方法、实例构造器、父类方法这4类,他们在类加载的时候就会把符号引用解析为该方法的直接引用,这些方法可以称为非虚方法
  • 与之相反,其他方法称为虚方法(除去final方法)

2.5、方法静态调用解析的代码示例

  • 代码

    public class Test1 
        public static void hello()
            System.out.println("hello world !");
        
    
        public static void main(String[] args) 
            Test1.hello();
        
    
    
  • 执行javac命令编译成.class文件

  • 执行javap命令查看字节码指令

  • 总结
    由上图可知,使用javap命令查看这段程序的字节码,会发现的确是通过invikestatic命令来调用hello()方法的。

以上是关于java调用方法的主要内容,如果未能解决你的问题,请参考以下文章

java调用同一个类中的方法为啥要将方法申明成静态?

Java中方法调用总结

java 异步调用方法

java 异步调用方法

java调用方法

如何在freemarker中调用java的方法