内部类-java方法参数的修饰符问题

问题描述

java方法参数的修饰符问题

java在写方法时,为什么有的方法参数用final修饰?
还有就是内部类存在的意义是什么?
也就是说方法中的内部类和类中的内部类各有什么应用场景(请有实战经验的大神各自举个例子)?

//问题补充(关于方法中的内部类)
我的意思是:
pubic class TestClass{

                                                    public  void fun(){

                                                                            public  class Test1{
                                                                                            //........
                                                                            }

                                                    }

                                }

解决方案

为了实现一些内容,常常需要这么玩:

 public void test() {
        Comparable c = new Comparable(){
            @Override
            public int compareTo(Object o) {
                return 0;
            }
        };
    }

你所看到的是实现了一个接口(用Comparable为例)的匿名类,现在,提出了一个需求:方法中有一个局部变量a,这个匿名类需要实现将别的值和这个方法中的局部变量值作比较。
这样的方法使用存在着固有问题:

public void test() {
        String str = new String("进行比较");
        Comparable<String> c = new Comparable<String>(){
            public Object comparing;
            @Override
            public int compareTo(String o) {
                return str.compareTo(o);
            }
        };
        str = new String("值改变了");
        c.compareTo("进行比较");
    }
 //警告:这是一段错误的代码

这其中的逻辑漏洞在于:方法中的局部变量已经改变了指向,调用方法时的那个str是该指向"进行比较"还是"值改变了"呢?
c语言的指针用法可以很明确的传达这些信息,但Java抛弃了指针,这个问题就必须用另一种方式进行明确。
final 修饰符的含义是,这个变量所指向的信息是不可修改的。也就是说

 final String str = new String("进行比较");
        str = new String("值改变了");
        //警告:这是一段错误的代码

这两条语句本身就是矛盾的,编译器会直接阻止这种赋值语法。
这样,匿名内部类的方法中取用的变量就一定是定义时的那个值,也就不再害怕因为变量改变指向导致语法逻辑不清晰。

同样的,final修饰符也可以挂在参数上,意义和局部变量是一样的。

简单地说,final修饰符是为了在匿名对象的方法中使用此变量

解决方案二:

方法中那个不是内部类,而是匿名实现接口,场景就是编写一个实现接口的类,但是这个类只使用一次。java不像C++支持函数指针,要传一个函数,只能传一个实现了函数的接口,所以为了简化代码,才有了匿名接口实现。
内部类的好处,内部类可以自由访问所在类的成员,使得内部类像友元类。同样,java不支持友元,所以用内部类变相实现了这一点。同时,内部类使得类的组织更有条理。

解决方案三:

final修饰的类,不允许继承/派生。string就是final类。修饰为final类可以杜绝派生类重写方法篡改某些逻辑的可能。比如随机数生成器之类比较敏感的类。同时final可以提高性能,比如string

解决方案四:

final修饰变量,这个变量除了初始化以外不允许再次赋值。相当于只读变量

详细参考:http://wenjiesu.iteye.com/blog/799332

解决方案五:

有的方法参数用final修饰是为了让子类不能重写,子类无法覆盖

解决方案六:

有的方法参数用final修饰是为了让子类不能重写,子类无法覆盖

解决方案七:

java在写方法时,为什么有的方法参数用final修饰?

这个问题是因为下面是一个匿名的内部类需要用到这个参数所有要加final去修饰

解决方案八:

java方法参数
java方法参数

时间: 2024-09-04 14:21:41

内部类-java方法参数的修饰符问题的相关文章

Java中的访问修饰符详细解析_java

1.类的修饰符分为:可访问控制符和非访问控制符两种. 可访问控制符是:公共类修饰符 public 非访问控制符有:抽象类修饰符 abstract :最终类修饰符 final 1 )公共类修饰符 public : Java 语言中类的可访问控制符只有一个: public 即公共的.每个 Java 程序的主类都必须是 public 类作为公共工具供其它类和程序使用的应定义为 public 类. 2 )抽象类修饰符 abstract :凡是用 abstract 修饰符修饰的类,被称为抽象类.所谓抽象类

探讨Java语言中那些修饰符_java

一.在java中提供的一些修饰符,这些修饰符可以修饰类.变量和方法,在java中常见的修饰符有:abstract(抽象的).static(静态的).public(公共的).protected(受保护的).private(私有的).synchronized(同步的).native(本地的).transient(暂时的).volatile(易失的).final(不可改变的) 二.修饰顶层类的修饰符包括abstract.public和final,而static.protected和private不能修

java方法参数传值传引用的一点看法

  java 跟C++不同,java的方法参数都是传值,没有传引用.很多人都以为是传引用,而且这种错误的观点很普遍,今天在这里具体分析一下.方法参数有基本类型,如int等,另外一种类型是OBJECT,对象.详细说一下方法参数是对象的,跟C++不同的是,JAVA方法参数传对象,传的是对这个对象引用的一份拷贝,即地址值,跟原来的引用都是指向同一个对象.所以说,JAVA方法参数传的都是值. 程序一 传的对象值是改变的.public class Test{public Test(){int [] cou

java方法参数什么时候可以省略数据类型声明

问题描述 java方法参数什么时候可以省略数据类型声明 有时候我看到方法参数是一个匿名对象,那么匿名对象属于什么数据类型,是String类型吗,为什么没有数据类型的声明呢 解决方案 你说的匿名对象,是因为匿名对象本身是有返回值的,而返回值的类型恰好是构造方法的参数类型 A a = new A(new B()): 解决方案二: 看方法的定义,里面包含参数类型. 不知道你说的匿名对象是什么,直接调用构造函数,你可以从构造函数类名知道类型,如果是匿名类,那么这个类型是编译器产生的,实现了参数需要的接口

获取Java方法参数的名称

最近有个需求,需要获取java方法参数的名称,网上查了下,然后自己也实践了下,总结出3点: 1.能不能获取方法参数的名称取决于class文件里是否含有LocalVariableTable. 2.javac编译生成的class文件不含有LocalVariableTable,但是eclipse编译生成的class文件却含有LocalVariableTable. 3.有2种方式可以获得,用Asm和Javassist,Asm的性能略高. 贴代码: maven依赖: <dependency> <g

java方法参数带双引号和不带双引号的区别

问题描述 java方法参数带双引号和不带双引号的区别 java方法参数带双引号和不带双引号的区别 比如map.put( " billNum","订单编号", +stateStr); 为什么会有加号,难道方法参数还可以是一个运算表达式 解决方案 map.put( " billNum","订单编号", +stateStr); 这么写不合法 map.put( " billNum","订单编号"

Java方法参数是引用调用还是值调用?_java

方法调用(call by) 是一个标准的计算机科学术语.方法调用根据参数传递的情况又分为值调用( call by reference ) 和引用调用( call by value ) .江湖上有很多关于这两种调用的定义 ,最通常的说法是传递值的是值调用,传递地址的是引用调用.这其实很不恰当,这种 这些说法很容易让我们联想到Java的对象参数传递是引用调用,实际上,Java的对象参数传递仍然是值调用 . 我们首先用一段代码来证实一下为什么Java的对象参数传递是值调用. public class

详解Java编程中protected修饰符与static修饰符的作用_java

protected 来谈谈protected访问权限问题.看下面示例1: Test.java class MyObject {} public class Test { public static void main(String[] args) { MyObject obj = new MyObject(); obj.clone(); // Compile error. } } 此时出现上文提到的错误:The method clone from the type Object is not v

java 内部类-java方法中定义的局部内部类问题

问题描述 java方法中定义的局部内部类问题 在方法中定义的内部类为什么只能访问方法中的final类型局部变量? package com.study; interface OutInterface2{ //定义一个接口 } class OuterClass3 { public OutInterface2 doit(final String x){//doit方法参数为final类型 //在doit()方法中定义一个内部类 class InnerClass2 implements OutInter