精华内容
下载资源
问答
  • java 传递参数两种方式

    万次阅读 多人点赞 2015-10-19 15:39:28
    Java中没有指针,所以也没有引用传递了,仅仅有值传递不过可以通过对象的方式来实现引用传递 类似java没有多继承 但可以用多次implements 接口实现多继承的功能  值传递:方法调用时,实际参数把它的值传递给对应...

     

    Java中没有指针,所以也没有引用传递了,仅仅有值传递不过可以通过对象的方式来实现引用传递 类似java没有多继承 但可以用多次implements 接口实现多继承的功能

     

      值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。

      引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

     

           a.传递值的数据类型:八种基本数据类型和String(这样理解可以,但是事实上String也是传递的地址,只是string对象和其他对象是不同的,string对象是不能被改变的,内容改变就会产生新对象。那么StringBuffer就可以了,但只是改变其内容。不能改变外部变量所指向的内存地址)。
        b.传递地址值的数据类型:除String以外的所有复合数据类型,包括数组、类和接口 
    值传递的例子:
    package com.other.test;
    
    public class Test {
    	public static void change(int i, int j) { 
    		int temp = i; 
    		i = j; 
    		j = temp;
    	} 
    
    	public static void main(String[] args) { 
    		int a = 3; 
    		int b = 4; 
    		change(a, b); 
    		System.out.println("a=" + a); 
    		System.out.println("b=" + b);
    	}
    }
    
    

    输出的结果是 a=3 b=4,传递的值并不会改变原值
     
    引用传递的例子:(数组)
    package com.other.test;
    
    public class Test {
    	public static void change(int[] counts) { 
    		counts[0] = 6; 
    		System.out.println(counts[0]);
    	} 
    
    	public static void main(String[] args) { 
    		int[] count = { 1, 2, 3, 4, 5 }; 
    		change(count);
    		System.out.println(count[0]);
    	} 
    }

    输出结果是6 6 也就是引用的值改变了原来的值
     
    引用传递的例子:(对象)
     
    定义一个A对象:
     
    package com.other.test;
    
    public class A {
    	int i = 0;
    }


    对上边对象操作的类:

     

     

    package com.other.test;
    
    public class Test {
    	public static void add(A a) { 
    		//a = new A();   ①
    		a.i++;
    	} 
    
    	public static void main(String args[]) { 
    		A a = new A(); 
    		add(a); 
    		System.out.println(a.i );
    	} 
    }
    


    当把①注解掉时,输出的结果是1,当①没有注解是是0,原因是 a =new A();构造了新的A对象就不是传递的那个对象了。

     

    看看String的情况:

     

    package com.other.test;
    
    public class Test {
    	String str = new String("old"); 
    	char[] ch = { 'a', 'b', 'c' }; 
    	public static void main(String args[]) { 
    		Test ex = new Test(); 
    		ex.change(ex.str, ex.ch); 
    		System.out.print(ex.str + " and "); 
    		System.out.println(ex.ch);
    	} 
    
    	public void change(String str, char ch[]) { 
    		str = "new"; 
    		ch[0] = 'd';
    	}
    }


    输出的结果的是 old and dbc也就是传递String并不会改变原值,而是创建了一个新值。 ch[]就是一个简单的数组的传递。

     

    ( 对象包括对象引用即地址和对象的内容)

    String 比较特别,看过String 代码的都知道, String 是 final的。所以值是不变的。 函数中String对象引用的副本指向了另外一个新String对象,而数组对象引用的副本没有改变,而是改变对象中数据的内容. 
      对于对象类型,也就是Object的子类,如果你在方法中修改了它的成员的值,那个修改是生效的,方法调用结束后,它的成员是新的值,但是如果你把它指向一个其它的对象,方法调用结束后,原来对它的引用并没用指向新的对象。 
      Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言)。 
      如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值.
      如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的地址,所以不会改变参数的值。

    关注我,获取400个的赚钱金点子,轻松开启副业生涯

    美团招聘,有意向的私信我

    岗位名称:美团到家事业群-外卖技术部-JAVA高级工程师
    职级要求:P2-3~P3-2

    岗位职责:
    - 负责上单业务系统的开发工作,深入理解业务痛点,通过技术手段满足并促进业务快速发展需要;
    - 参与系统需求分析与设计,快速响应业务需求,负责完成核心代码编写,接口规范制定;
    - 参与解决项目中的重难点问题,针对复杂业务模型能够给出合理的解决方案;

    岗位基本要求:
    - 参与过大型复杂分布式互联网系统的设计,要求有复杂业务的开发经验和较强的逻辑/概率思维能力,善于分析、归纳、描述、沟通和解决问题;
    - 本科及以上学历,扎实的计算机基础,4年及以上工作经验,长期使用Java及开源框架进行项目开发,并有一定的项目管理经验;
    - 深入使用Java,熟悉掌握常用的Java类库及框架,如多线程、并发处理、I/O与网络通讯等,对Java虚拟机有较深了解;
    - 擅长使用开源框架,在某个领域内对开源框架有一定的审美,做过选型研究,解读过部分或者全部源码,掌握实现原理;
    - 精通 MySQL 应用开发,熟悉数据库原理和常用性能优化技术,以及 NoSQL,Queue 的原理、使用场景以及限制;
    - 研究过 http 协议、搜索引擎、缓存、jvm 调优、序列化、nio、RPC 调用框架等,并且有相关实践经验;
    - 有强烈的责任心和团队合作精神,良好的抗压能力,心态积极,能主动融入团队;

    具备以下者优先:
    - 参与过相关系统建设;
    - 有高并发系统经验;
    - 参与过开源工作;
    - 有代码洁癖、有极客精神;

    展开全文
  • java中传递参数两种方式

    万次阅读 2017-11-08 09:16:45
    Java中有两种传递参数方式,分别为:  值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。  引用传递:也称为地址。方法调用时,...
    Java中有两种传递参数的方式,分别为:

      值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。

      引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

           a.传递值的数据类型:八种基本数据类型和String(这样理解可以,但是事实上String也是传递的地址,只是string对象和其他对象是不同的,string对象是不能被改变的,内容改变就会产生新对象。那么StringBuffer就可以了,但只是改变其内容。不能改变外部变量所指向的内存地址)。
        b.传递地址值的数据类型:除String以外的所有复合数据类型,包括数组、类和接口 
    下面为值传递的例子:
             
      输出的结果是 a=3 b=4,传递的值并不会改变原值;
    引用传递的例子:
        
      输出结果是1 , 这意味着引用的值改变了原来的值     
    总结: 对于对象类型,也就是Object的子类,如果你在方法中修改了它的成员的值,那个修改是生效的,方法调用结束后,它的成员是新的值,但是如果你把它指向一个其它的对象,方法调用结束后,原来对它的引用并没用指向新的对象。 
      Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言)。 
      如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值.
      如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的地址,所以不会改变参数的值。
    展开全文
  • JAVA 创建进程的两种方式

    千次阅读 2017-09-21 14:54:43
    Java中创建线程有两种方式:继承Thread类或者实现Runnable接口再重写run()方法 那么在Java中要如何创建进程呢?同样也有两种方法通过ProcessBuilder.start()方法先看进程类Processpublic abstract class Process ...

    在Java中创建线程有两种方式:继承Thread类或者实现Runnable接口再重写run()方法
    那么在Java中要如何创建进程呢?

    同样也有两种方法

    通过ProcessBuilder.start()方法

    先看进程类Process

    public abstract class Process
    {
    
        abstract public OutputStream getOutputStream();   //获取进程的输出流
    
        abstract public InputStream getInputStream();    //获取进程的输入流
    
        abstract public InputStream getErrorStream();   //获取进程的错误流
    
        abstract public int waitFor() throws InterruptedException;   //让进程等待
    
        abstract public int exitValue();   //获取进程的退出标志
    
        abstract public void destroy();   //摧毁进程
    }

    通过ProcessBuilder创建进程

    ProcessBuilder是一个final类,它有两个构造器:

    public final class ProcessBuilder
    {
        private List<String> command;
        private File directory;
        private Map<String,String> environment;
        private boolean redirectErrorStream;
    
        public ProcessBuilder(List<String> command) {
        if (command == null)
            throw new NullPointerException();
        this.command = command;
        }
    
        public ProcessBuilder(String... command) {
        this.command = new ArrayList<String>(command.length);
        for (String arg : command)
            this.command.add(arg);
        }
    ....
    }

     构造器中传递的是需要创建的进程的命令参数,第一个构造器是将命令参数放进List当中传进去,第二构造器是以不定长字符串的形式传进去。

      那么我们接着往下看,前面提到是通过ProcessBuilder的start方法来创建一个新进程的,我们看一下start方法中具体做了哪些事情。下面是start方法的具体实现源代码:

    public Process start() throws IOException {
    // Must convert to array first -- a malicious user-supplied
    // list might try to circumvent the security check.
    String[] cmdarray = command.toArray(new String[command.size()]);
    for (String arg : cmdarray)
        if (arg == null)
        throw new NullPointerException();
    // Throws IndexOutOfBoundsException if command is empty
    String prog = cmdarray[0];
    
    SecurityManager security = System.getSecurityManager();
    if (security != null)
        security.checkExec(prog);
    
    String dir = directory == null ? null : directory.toString();
    
    try {
        return ProcessImpl.start(cmdarray,
                     environment,
                     dir,
                     redirectErrorStream);
    } catch (IOException e) {
        // It's much easier for us to create a high-quality error
        // message than the low-level C code which found the problem.
        throw new IOException(
        "Cannot run program \"" + prog + "\""
        + (dir == null ? "" : " (in directory \"" + dir + "\")")
        + ": " + e.getMessage(),
        e);
    }
    }

     该方法返回一个Process对象,该方法的前面部分相当于是根据命令参数以及设置的工作目录进行一些参数设定,最重要的是try语句块里面的一句:

    return ProcessImpl.start(cmdarray,
                        environment,
                        dir,
                        redirectErrorStream);

    说明真正创建进程的是这一句,注意调用的是ProcessImpl类的start方法,此处可以知道start必然是一个静态方法。那么ProcessImpl又是什么类呢?该类同样位于java.lang.ProcessImpl路径下,看一下该类的具体实现:

      ProcessImpl也是一个final类,它继承了Process类:

    final class ProcessImpl extends Process {
    
        // System-dependent portion of ProcessBuilder.start()
        static Process start(String cmdarray[],
                 java.util.Map<String,String> environment,
                 String dir,
                 boolean redirectErrorStream)
        throws IOException
        {
        String envblock = ProcessEnvironment.toEnvironmentBlock(environment);
        return new ProcessImpl(cmdarray, envblock, dir, redirectErrorStream);
        }
     ....
    }

    这是ProcessImpl类的start方法的具体实现,而事实上start方法中是通过这句来创建一个ProcessImpl对象的:

    return new ProcessImpl(cmdarray, envblock, dir, redirectErrorStream);

    而在ProcessImpl中对Process类中的几个抽象方法进行了具体实现。

      说明事实上通过ProcessBuilder的start方法创建的是一个ProcessImpl对象。

      下面看一下具体使用ProcessBuilder创建进程的例子,比如我要通过ProcessBuilder来启动一个进程打开cmd,并获取ip地址信息,那么可以这么写:

    public class Test {
        public static void main(String[] args) throws IOException  {
            ProcessBuilder pb = new ProcessBuilder("cmd","/c","ipconfig/all");
            Process process = pb.start();
            Scanner scanner = new Scanner(process.getInputStream());
    
            while(scanner.hasNextLine()){
                System.out.println(scanner.nextLine());
            }
            scanner.close();
        }
    }

     第一步是最关键的,就是将命令字符串传给ProcessBuilder的构造器,一般来说,是把字符串中的每个独立的命令作为一个单独的参数,不过也可以按照顺序放入List中传进去。

      至于其他很多具体的用法不在此进行赘述,比如通过ProcessBuilder的environment方法和directory(File directory)设置进程的环境变量以及工作目录等,感兴趣的朋友可以查看相关API文档。

      2)通过Runtime的exec方法来创建进程

      首先还是来看一下Runtime类和exec方法的具体实现,Runtime,顾名思义,即运行时,表示当前进程所在的虚拟机实例。

      由于任何进程只会运行于一个虚拟机实例当中,所以在Runtime中采用了单例模式,即只会产生一个虚拟机实例:

    public class Runtime {
        private static Runtime currentRuntime = new Runtime();
    
        /**
         * Returns the runtime object associated with the current Java application.
         * Most of the methods of class <code>Runtime</code> are instance
         * methods and must be invoked with respect to the current runtime object.
         *
         * @return  the <code>Runtime</code> object associated with the current
         *          Java application.
         */
        public static Runtime getRuntime() {
        return currentRuntime;
        }
    
        /** Don't let anyone else instantiate this class */
        private Runtime() {}
        ...
     }

      从这里可以看出,由于Runtime类的构造器是private的,所以只有通过getRuntime去获取Runtime的实例。接下来着重看一下exec方法 实现,在Runtime中有多个exec的不同重载实现,但真正最后执行的是这个版本的exec方法:

    public Process exec(String[] cmdarray, String[] envp, File dir)
       throws IOException {
       return new ProcessBuilder(cmdarray)
           .environment(envp)
           .directory(dir)
           .start();
       }

    可以发现,事实上通过Runtime类的exec创建进程的话,最终还是通过ProcessBuilder类的start方法来创建的。

    下面看一个例子,看一下通过Runtime的exec如何创建进程,还是前面的例子,调用cmd,获取ip地址信息:

    public class Test {
        public static void main(String[] args) throws IOException  {
            String cmd = "cmd "+"/c "+"ipconfig/all";
            Process process = Runtime.getRuntime().exec(cmd);
            Scanner scanner = new Scanner(process.getInputStream());
    
            while(scanner.hasNextLine()){
                System.out.println(scanner.nextLine());
            }
            scanner.close();
        }
    }

      要注意的是,exec方法不支持不定长参数(ProcessBuilder是支持不定长参数的),所以必须先把命令参数拼接好再传进去。

      关于在Java中如何创建线程和进程的话,暂时就讲这么多了,感兴趣的朋友可以参考相关资料、

    参考:
    http://luckykapok918.blog.163.com/blog/static/205865043201210272168556/

    http://www.cnblogs.com/ChrisWang/archive/2009/12/02/use-java-lang-process-and-processbuilder-to-create-native-application-process.html

    http://lavasoft.blog.51cto.com/62575/15662/


    展开全文
  • java中传递参数两种方式(int(基本类型),int[](对象类型)): http://blog.csdn.net/maoyeqiu/article/details/49250339

    java中传递参数的两种方式(int(基本类型),int[](对象类型)):

    http://blog.csdn.net/maoyeqiu/article/details/49250339

    展开全文
  • JAVA获取表单参数的几种方式

    千次阅读 2017-06-22 04:06:49
    好记性不如赖笔头…………java代码@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8");//针对的post...
  • Java证书读取的两种方式

    万次阅读 2017-07-10 11:15:03
    Java读取证书的两种方式,对于.p12证书以及密码,针对流程的细节做一个简单的梳理,希望大家能够在自己的项目中使用到...
  • Java 后端接收Request请求参数的7种方式

    千次阅读 多人点赞 2020-11-13 14:43:36
    Java 后端接收Request请求参数的7种方式 1.直接在Controller 方法参数上配置参数名 @RequestMapping("/method01") public String method01(String name, Integer age, Double mon) { User user = new User(); ...
  • Java合并数组的两种实现方式

    万次阅读 2017-05-25 23:44:52
    最近在写代码时遇到了需要合并个数组的需求,突然发现以前没用过,于是研究了一下合并数组的方式,总结如下。 1.System.arraycopy()方法 (1) 解析 通过阅读JDK源码,我可以知道方法原型如下: public static...
  • 用集合接收参数分为两种:第一种是直接用一个集合类型来接收,第二种是在一个实体类中包含集合类型的参数 这里我会分别将这两种情况用代码实现下,例子使用springboot框架。 第一种:后端直接用集合类型来接收参数...
  • 上篇介绍了一下静态代理:Java中的代理模式——静态代理以及分析静态代理的缺点 也分析了一下静态代理的缺点: 1、由于静态代理中的代理类是针对某一个类去做代理的,那么假设一个系统中有100个Service,则需要...
  • Java中将xml文件转化为json的两种方式

    万次阅读 多人点赞 2017-07-29 15:09:18
    好了废话不多说,进入正题,最近有个需求,要将xml转json之后存储在redis中,找来找去发现整体来说有两种方法,使用json-lib包中的net.sf.json或者使用org.json,这里将两种方式的实现代码写下来记录一下,以后方便...
  • java让程序休眠的两种方式

    千次阅读 2020-09-05 09:44:51
    在需要程序等待的地方加入这个语句,实现让程序等待,这里的参数1000是以毫秒为单位,即这语句可以让程序等待1秒。 方法二:TimeUnit类里的sleep方法。 import java.util.concurrent.TimeUnit; 1 TimeUnit.DAYS....
  • Java对Elasticsearch的操作都是使用Client对象...Java操作ES的Client有两种:TransportClient和Rest Client。但是Elasticsearch 7.0中开始弃用TransportClient,在8.0中完全删除它。故在实际使用过程中建议使用Jav...
  • 当你问大多数程序员Java是传值还是引用的时候,你可能会得到两种答案之一:(1)Java传递原始类型数据时使用的是传值方式;传递对象时则使用引用方式;String类型的数据采用的是传值方式,因为字符串是不可变的...
  • java发送http请求有三种方式,除了原生连接方式HttpURLConnection,还有另外两种方式:HTTPClient和CloseableHttpClient 下面分别简单介绍使用HTTPClient和CloseableHTTPClient进行Get和Post请求的方式。 详情使用...
  • java反射class的三种方式,反射创建对象的两种方式

    万次阅读 多人点赞 2018-08-15 11:46:21
    Java API 中,提供了获取 Class 类对象的三方法: 第一,使用 Class.forName 静态方法。 前提:已明确类的全路径名。 第二,使用 .class 方法。 说明:仅适合在编译前就已经明确要操作的 Class 第三...
  • Java数组转List的三种方式及对比

    万次阅读 多人点赞 2018-03-18 00:10:04
    本文介绍Java中数组转为List三情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析。
  • package com.yy.thread; public class Demo4_Thread { public static void main(String[] args) { demo1(); //匿名内部类,第一,继承Thread demo2(); //匿名内部类,第二,实现Runnable接口 } ...
  • 最近使用Spring 的 RestTemplate 工具类请求接口的时候... 使用RestTemplate post请求的时候主要可以通过三种方式实现 1、调用postForObject方法 2、使用postForEntity方法 3、调用exchange方法 postForObject和...
  • java通过反射创建对象的两种方式

    千次阅读 2019-03-07 15:44:05
    java中,通过反射创建对象有两种方式 使用Class对象的newInstance()方法来创建对象; 具体步骤是 1、获取类的Class对象(有三种方式可以获取,可以自行百度一下) 2、通过调用所获取到的Class对象的newInstance...
  • Fragment传递参数两种方式

    千次阅读 2019-03-19 11:07:32
    我们经常在fragment中传递参数,但是我们经常会使用一些不正常的手段,比如构造方法等之类的和其他的投机取巧的方法,这些方法都是不建议使用的,不利代码高效性和性能的要求,因此建议使用下面两种传递参数方式 ...
  • Java中Http连接的两种方式

    万次阅读 2017-08-16 20:15:26
    java中连接http,介绍两种方法,一种是java的HttpUrlConnection,另一种是apacha公司的httpClient,后者是第三方的类库需要从外部,导入,同时这也是第一次使用外部的类库,以后还会有很多需要导入外部类库的需求...
  • Java两种动态代理JDK动态代理和CGLIB动态代理

    万次阅读 多人点赞 2018-08-07 15:33:35
    代理模式是23设计模式的一,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式。为了对外开放协议,B往往实现了一个接口,A也会去实现接口。但是B是“真正”实现类,A则比较“虚”,他借用了B的...
  • 【写作原由】  今天刚刚刷了一道二叉树路径搜索的题(LeetCode ... 在C/C++中,参数传递分为两种:值传递和地址传递,其中:  1.值传递:实际参数将值传递给形式参数,对形式参数进行操作不影响实际参数,如: int
  • java中的参数传递(只有值传递没有引用传递)

    万次阅读 多人点赞 2019-07-31 19:25:14
    Java中只有传值调用(值传递),没有传址调用(址传递或者引用...相应的,变量也分这两种类型:基本类型和引用类型。 基本类型的变量保存原始值,即它代表的值就是数值本身; 而引用类型的变量保存的值是引用值,...
  • java封装数据的两种常用方式

    千次阅读 2018-11-01 11:47:35
    java后台在传输数据时,会对数据进行处理封装,下面介绍一下最常用的方式: 1.通过bean对象进行封装 User user =new User();//User中包含三项 id ,name,sex 三项 //下边为了省事写的是静态数据代替 user....
  • 1.普通的SID实例名配置 ... 此种方式java连接: url=jdbc:oracle:thin:@136.155.131.111:1521:dzyw 2.RAC(集群方式连接)配置  jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRES...
  • AJAX对于JAVA接收HttpServletRequest和json字符串两种方式的传递写法 1、json字符串的接收形式   在JAVA项目开发中,接口的接收参数有的是以json字符串 形式接收的,后台写法如下: public ObjectMapper ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,154,062
精华内容 461,624
关键字:

java传参数的两种方式

java 订阅