• 关于 Java修饰符 的搜索结果

回答

"枚举类可以实现一个或多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是继承Object类。其中java.lang.Enum类实现了java.lang.Serializable和java.lang. Comparable两个接口。 使用enum定义、非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类。 枚举类的构造器只能使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰;如果强制指定访问控制符,则只能指定private修饰符。 枚举类的所有实例必须在枚举类的第一行显式列出,否则这个枚举类永远都不能产生实例。列出这些实例时,系统会自动添加public static final修饰,无须程序员显式添加。"

星尘linger 2020-04-07 13:24:42 0 浏览量 回答数 0

回答

定义:Java中,可以使用访问修饰符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。 分类 private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类) default (即缺省,什么也不写,不使用任何关键字): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。 protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。 public : 对所有类可见。使用对象:类、接口、变量、方法 访问修饰符图

问问小秘 2020-03-27 16:31:52 0 浏览量 回答数 0

问题

如何在包外部的接口中访问默认方法?虽然默认访问修饰符的可访问性仅在包中

七天一失眠 2020-04-11 15:53:34 0 浏览量 回答数 1

新手开公司,教你化繁为简

开公司到底有没有那么难,传统的手续繁琐,线下跑断腿,场地搞不定等问题,通过阿里云”云上公司注册“解决你的烦恼。

问题

Eclipse总是提示语法错误

蛮大人123 2019-12-01 20:02:41 1074 浏览量 回答数 1

问题

java方法参数的修饰符问题

蛮大人123 2019-12-01 19:27:42 1142 浏览量 回答数 1

问题

[@小川游鱼][¥20]volatile 修饰符的有过什么实践?

李博 bluemind 2019-12-01 19:25:57 516 浏览量 回答数 1

回答

private是java面向对象编程的访问权限修饰符,更像是开发者之间的沟通协议。反射是java提供的动态获取信息以及动态调用对象方法的一种机制,代码调用链上会出现断层,不建议使用。

t.s.f.h 2019-12-02 01:49:25 0 浏览量 回答数 0

回答

使用interface来定义一个接口。接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成。定义接口的基本格式如下: [修饰符] interface 接口名 [extends 父接口名列表]{ [public] [static] [final] 常量; [public] [abstract] 方法; } 修饰符:可选,用于指定接口的访问权限,可选值为public。如果省略则使用默认的访问权限。 接口名:必选参数,用于指定接口的名称,接口名必须是合法的Java标识符。一般情况下,要求首字母大写。 extends 父接口名列表:可选参数,用于指定要定义的接口继承于哪个父接口。当使用extends关键字时,父接口名为必选参数。 方法:接口中的方法只有定义而没有被实现。 例如,定义一个用于计算的接口,在该接口中定义了一个常量PI和两个方法,具体代码如下: 1 public interface CalInterface 2 { 3 final float PI=3.14159f;//定义用于表示圆周率的常量PI 4 float getArea(float r);//定义一个用于计算面积的方法getArea() 5 float getCircumference(float r);//定义一个用于计算周长的方法getCircumference() 6 } 注意: 与Java的类文件一样,接口文件的文件名必须与接口名相同。

小勿悔 2019-12-02 01:00:40 0 浏览量 回答数 0

回答

抽象类和接口的区别:默认的方法实现 抽象类可以有默认的方法实现完全是抽象的。接口根本不存在方法的实现。抽象类中可以有已经实现了的方法,也可以有被abstract修饰的方法(抽象方法),因为存在抽象方法,所以该类必须是抽象类。但是接口要求只能包含抽象方法,抽象方法是指没有实现的方法。所以就不能像抽象类那么无赖了,接口就根本不能存在方法的实现。实现 抽象类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现。抽象类虽然不能实例化来使用,但是可以被继承,让子类来具体实现父类的所有抽象方法。有点老子没完成的梦想交给儿子来完成,但是如果子类将抽象方法没有全部实现,就必须把自己也修饰成抽象类,交于继承它的子类来完成实现。就相当于,儿子能力不够也没完成老爹的梦想,现在儿子等着再生儿子(被继承),然后让孙子去完成。以此类推,知道没有抽象函数。接口的实现,通过implements关键字。实现该接口的类,必须把接口中的所有方法给实现。不能再推给下一代。和抽象类相比,抽象类是将梦想传给家族,一代一代去完成。那么接口就是掌门人找大师兄来完成帮派的鸿星伟业,这时候就只有一次希望,要么有能力就实现,没能力就不要接。抽象类可以有构造器,而接口不能有构造器这个原因很简单,我们回到双方的定义上来,抽象类再怎么流氓无赖也好,终究是属于类,就天生享有类的所有特性(但是不能实例化),当然包括类的构造方法,也就是构造器。但是接口是所有抽象方法的集合,注意,是集合,不是类。当然没有构造方法一说,更别提什么构造器了。抽象方法可以有public、protected和default这些修饰符 接口方法默认修饰符是public。你不可以使用其它修饰符。抽象类的目的就是被继承,抽象方法就是为了被重写,所以肯定不能用private修饰符,肯定是可以用public的。但是protected和default也是可以的。接口就有且只有一个public修饰。(是不是感觉抽象类像小儿子各种耍无赖,接口就像私生子,说什么只能是什么)抽象类在java语言中所表示的是一种继承关系,一个子类只能存在一个父类,但是可以存在多个接口。java在类的继承上并没有多继承。抽象类属于类,所以可以被继承。但子类只能继承一个父类。java为了实现多继承,使用了接口。一个类可以实现多个接口。继承就好比生了孩子,只能有一个爹,但是这个孩子可以学语文,学数学,学英语等等很多东西,而语文、数学、英语就相当于接口。总的来说,因为java中抽象类只有单继承,接口就可以实现多继承。抽象方法比接口速度要快接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。记住抽象方法是小儿子,从小吃的好所以跑的快,接口是私生子,从小日子苦,营养不良。如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 如果你往接口中添加方法,那么你必须改变实现该接口的类。抽象类可以有一些非抽象方法的存在,这些方法被称为默认实现。如果添加一个默认实现方法(不能是抽象方法),就不需要在子类中去实现,所以继承这个抽象类的子类无须改动。但是,接口中只能添加抽象方法,当你添加了抽象方法,实现该接口的类就必须实现这个新添加的方法。因为,定义中说的很清楚,接口的实现必须实现所有的方法。所有,当然包括新添加的方法。

hiekay 2019-12-02 01:39:31 0 浏览量 回答数 0

回答

"Java提供的4个基本Annotation的用法——使用Annotation时要在其前面增加@符号,并把该Annotation当成一个修饰符使用,用于修饰它支持的程序元素。4个基本的Annotation如下: @Override @Deprecated @SuppressWarnings @SafeVarargs"

星尘linger 2020-04-12 10:18:42 0 浏览量 回答数 0

问题

Java程序.如果从主方法中删除静态修饰符,会发生什么情况?

YDYK 2020-04-26 10:18:38 0 浏览量 回答数 1

回答

为了实现一些内容,常常需要这么玩: 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修饰符是为了在匿名对象的方法中使用此变量

蛮大人123 2019-12-02 02:21:42 0 浏览量 回答数 0

回答

确定在netbeans里能运行吗? 在java8语法里面是支持的,你的eclipse没有更新的原因。在eclipse-jee-kepler-SR2-Java8-win32中,使用java8,类似你那代码是能通过编译的。 在java8里面,可以简单认为,如果一个变量加上final之后,程序不会报错,也就是说这个变量自初始化之后再没有赋值过(这叫effectivelyfinal),那么就可以跟加final的变量一样被内部类引用。 既然用java8.那么可以这么写:addActionListener(e->{if....else...}); lambda里面如果引用外部变量,那么必须是final类型,当然你可以不声明final修饰符。但是jvm会自动转换为final. 如下代码: intnum=0; addActionListener(e->num++);//Error addActionListener(e->System.out.println(num));//OK,Num被转为finalnum++//Error,

爱吃鱼的程序员 2020-06-20 19:21:19 0 浏览量 回答数 0

回答

实际上非static内部类里, static数据成员不是加了final的变量就可以了比如:import java.util.Date; public class Outter { class Inner{ int x; final static int i=1; final static Date t=new Date(); } }用jdk1.7的javac, 可以看到这个:Outter.java:7: 错误: 内部类Outter.Inner中的静态声明非法 final static Date t=new Date();; ^修饰符 'static' 仅允许在常量变量声明中使用明显是不对的.java在这上面有bug: https://bugs.eclipse.org/bugs/show_bug.cgi?id=343480 如果在新版的eclipse上, 可以看到: The field t cannot be declared static in a non-static inner type, unless initialized with a constant expression不仅需要final, 还需要初始化为一个常量表达式.最后补充一下我的理解, 为什么限制 非静态内部类不可以有静态成员的声明如果我们不从抽象的语义方面去理解, 可以这么想:public class Outter { class Inner{ static Inner a1=new Inner(); } }如果上面的代码编译无误, 我们可以直接 Outter.Inner.a来拿到Inner类的实例, 而内部类的实例是一定要绑定到一个外部类的实例的. 然后java里试图用final来为上述限制松绑, 以提供更多的灵活性.

蛮大人123 2019-12-02 01:57:43 0 浏览量 回答数 0

回答

这种错误一般都是因为没有访问权限导致的,问题多出现在反射的使用中,反射中调用私有方法或者私有属性。我们可以使用他们继承父类(AccessibleObject)中的setAccessible()方法,来设置或取消访问检查,以达到访问私有对象的目的。java的四种访问权限修饰符:public是公共的,被public所修饰的成员可以在任何类中都能被访问到。protected是受保护的,受到该类所在的包所保护。default(默认,缺省的),也被称为friendly。private,private是私有的,即只能在当前类中被访问到,它的作用域最小。在编写代码的时候要主要访问权限的问题。

爱吃鱼的程序员 2020-05-26 10:02:16 0 浏览量 回答数 0

问题

java包访问控制权限和公有静态成员变量该怎么理解?

蛮大人123 2019-12-01 20:02:57 1118 浏览量 回答数 1

回答

优点kotlin提供了很多好的特性,比如:null安全检测,属性访问,unchecked exceptions, publication有更详细的介绍。 1.1 java 自动转换成kotlinkotlin项目开发总结有介绍如何使用,这个是有JetBrains提供的,目前已经集成到了IDEA/AS, 虽然它不是很完美(我的上篇博客也已经介绍到了),但是对比重新用Kotlin开发一个完全一样功能的类来说,可以节省不少时间。 1.2 lateinit Delegates.notNull and lazykotlin的null安全监测是个非常好的特性,但是也有有个问题,比如: var aMap: AMap? = null onCreate(){ aMap = ... aMap!!.projection .... }1234567虽然我们可以保证aMap已经在onCreate方法定义了,但是因为我们在定义aMap的时候是AMap?类型,所以在以后使用的都必须使用aMap!!来告诉编译器aMap不为null,会显得非常麻烦。幸运的是kotlin已经帮我们考虑到了应对方法 lateinit var name: Stringvar age: Int by Delegates.notNull()12通过上面两种方法,可以在定义的时候不提供初始化,可以延迟到需要的时候,但是就像我在kotlin项目开发总结说的,需要慎用,除非你能确保不会在后面遗漏掉重新赋值,否则会在运行时报空指针错误,这就浪费了kotlin的null安全监测这个非常好的特性。 lazy代理是个很好用的东西,就像下面这样的定义 val imm: InputMethodManager by lazy { getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager }123lazy后面跟着的block只会在你第一次read这个imm的时候调用,以后读取imm会直接返回block保存的值。在需要追求启动速度的APP可以很好的使用。 1.3 扩展后的collectionskotlin提供了很多对collections和iterables的扩展,具体可以看下 我写的分析和使用collections。 1.4 Named 和 默认的函数参数Named 函数参数和默认函数参数非常简单,但有时候可以帮我们省掉很多代码。特别是当构造函数有超过4个以上的参数时,可以指定默认几个默认参数,在调用的时候可以只提供一个参数。比如 class Presenter( val okhttp: OkHttp = productionOkHttp(), val picasso: Picasso = productionPicassoInstance() ) {...}1234在调用的时候,我们不提供参数,那么默认参数会被使用 var prensenter = Presenter()1 缺点虽然kotlin非常强大,但它毕竟不是完美的。它也会有一些可能未来会解决的缺点。 2.1 编译速度慢大家在使用kotlin开发项目的时候应该有注意到了,主要还是因为kotlin会自动自动生成更多的代码,比如为属性生成get/set, 对比java会存在更多的方法数量。https://youtrack.jetbrains.com/issue/KT-6246,这篇博客有做分析 2.2 annotation processing的问题我目前开发的项目使用了dagger,permissionsdispatcher,deeplinkdispatch,databinding,都需要使用kapt来做annotation proccessing,但是我已经碰到了好多次,kapt报的很奇怪的错误,有一次,我重构dagger的module时,报了一个蛋疼的问题,我以为我是dagger没用好,找了很多资料对比都没有解决,花了大概一天的时间,后面没办法只能clean project,但是奇怪的问题还在,后面我让application继承了DaggerApplication,clean下就可以。后面还是碰到好几次这样的问题,都是clean之后build就可以了,这个问题应该不只我一个人碰到,我想可能是kapt的一个bug, 我还是很相信google/JetBrains, 所以还是继续坚持使用kotlin开发项目。 2.3 没有命名空间kotlin允许定义top-level的函数和属性,比如 //demo.ktvar a = "aa"fun printlnA(){ println(a) }12345这可能是一个非常好的特性,但是也会有问题,比如在项目下面有两个甚至更多的printlnA方法,那么在调用的时候(特别是在阅读代码),很难区分方法来自哪个地方,除非你F3跳转到声明处。为了避免这个问题,你可以选择把printlnA方法移到一个object中,比如 object PrintlnHelper{ fun printlnA(){ println(a) } }12345让我们来看下kotlin和java的调用方式 //kotlinPrintlnHelper.printlnA()//javaPrintlnHelper.INSTANCE.printlnA()1234为了避免如上在Java中调用的怪怪的。。,可以使用@JvmStatic注解该方法 object PrintlnHelper{ @JvmStatic fun printlnA(){ println(a) } }123456通过上面的分析,对于有代码洁癖或者同时用Java和kotlin开发的项目,也是不够完美的,这个缺点是可以避免的,但是你需要花费一点时间去熟悉Kotlin 2.4 没有静态修饰语还是像上面的问题,如果项目同时存在kotlin和Java,而且Java需要调用kotlin代码,看代码分析问题 //Javapublic class View { public static final int VISIBLE = 0x00000000; public static final int INVISIBLE = 0x00000004; public static View inflate(Context context, int resource) {...} }123456使用kotlin使用同样的功能,如下: class View { companion object { @JvmField val VISIBLE: Int = 0x00000000 @JvmField val INVISIBLE: Int = 0x00000004 @JvmStatic fun inflate(context: Context, resource: Int) {...} } }12345678910下面是有@JvmField和没有的Java调用方式 // With annotations:View.VISIBLE;//Without annotations:View.Companion.getVISIBLE();1234其实这个问题也不是很严重的,但是对比Java还是多了个@JvmField, 但是kotlin新手或者容易忘记,使用@JvmField,这个缺点可以通过熟悉kotlin来避免 2.5 Java自动转换成kotlin带来的问题Java自动转换成kotlin是个非常好的特性,但是也会带来问题。Javadoc原来的结构会被破坏掉,静态field和方法会转换成companion object中的普通声明,如果有Java代码调用这个类,就会出现点问题,除非你后面手动给这个转换后的companion object 添加上@JvmField和@JvmStatic。这是个不小的隐患,需要特别注意下。 2.6 会增加方法数量过多的方法数量会导致编译速度变慢。kotlin通过闭包,内联函数等可以显著减少代码的总行数,但它可能也会增加编译后的方法数量。对于Android项目来说这肯定是一个不小的缺点。有很多原因会导致方法数量增加,但是最大的来源是kotlin实现属性。 kotlin不像Java可以直接访问field, 而是通过创建property的方式来访问。这是一个很好的特性,你可以自定义实现property的set/get,对比Java的set/get方法是个很大的进步。 但是这个是有代价的,对于val属性,kotlin自动生成backing field和getter函数来供java调用。public var属性会自动生成setter/getter函数。幸运的是private var属性已经有默认的setter/getter,需要不需要额外生成。所以这个时候你想想如果你定义了很多个public var和val属性,那么kotlin会帮你自动生成更多的函数,所以带来的后果就是方法数量会越来越多,导致编译速度变慢。 假如方法数量已经接近限制,不需要使用自定义setter的属性可以用@JvmField修饰,被@JvmField修饰的属性不会自动生成setter/getter函数,如下 @JvmFieldvar aMap: aMap? = null122.7 “==”在kotlin中,”==”和”equals”都是比较引用是否相等。如何项目中只有kotlin代码,那这个肯定是个非常好的特性,但是如果项目同时包含java和kotlin(比如:你是在旧的java工程基础上,用kotlin开发新功能),那么“==”很容易产生混淆和错乱。 设计原则3.1 kotlin的class默认是final, 如果想要能被继承,那么需要使用open 修饰,它的设计原则来自于 Effective Java 这种默认的设计原则,会导致第三方/未完成的sdk的大多数会是不可继承的,从提供者角度来说:它必须保证这个类是足够完整的,从使用者角度来说:这个类必须要提供我需要的所有东西,否则,我必须重写。当然提供者可以为这个类加上open来表示这个类是可以继承的,但是这是另外一种设计思维。 Roedy Green, How to Write Unmaintainable Code有提到: 给你的所有类设置为final。 毕竟,你完成了这个项目 - 当然没有人可以通过扩展你的class来改善你的工作。 这甚至可能是一个安全漏洞 - 毕竟,为什么不是java.lang.String final? 如果您的项目中的其他编程人员抱怨,请告诉他们您的执行速度提升 3.2 错误的使用运算符重载kotlin允许对类的变量运算符进行重载,设想有下面的代码 var person3 = person1 + person21 “+” 这个运算符有可能在很多个地方做了重载,在后期维护代码,很难区分哪个是哪个 作者:安卓机器人 来源:CSDN 原文:https://blog.csdn.net/ncuboy045wsq/article/details/74853107 版权声明:本文为博主原创文章,转载请附上博文链接!

auto_answer 2019-12-02 01:49:53 0 浏览量 回答数 0

回答

Java也支持面向对象的三大特征:封装、继承和多态,Java提供了private、protected和public三个访问控制修饰符来实现良好的封装,提供了extends关键字来让子类继承父类,子类继承父类就可以继承到父类的Field和方法,如果访问控制允许,子类实例可以直接调用父类里定义的方法。继承是实现类复用的重要手段,除此之外,也可通过组合关系来实现这种复用,从某种程度上来看,继承和组合具有相同的功能。使用继承关系来实现复用时,子类对象可以直接赋给父类变量,这个变量具有多态性,编程更加灵活;而利用组合关系来实现复用时,则不具备这种灵活性。

星尘linger 2020-04-07 12:03:07 0 浏览量 回答数 0

问题

Java技术1000问(3)【精品问答】

问问小秘 2020-06-02 14:27:10 42 浏览量 回答数 1

回答

JAVA反射机制是在运行状态中, 对于任意一个类, 都能够知道这个类的所有属性和方法; 对于任意一个对象, 都能够调用它的任意一个方法和属性。 从对象出发,通过反射(Class类)可以取得取得类的完整信息(类名 Class类型,所在包、具有的所有方法 Method[]类型、某个方法的完整信息(包括修饰符、返回值类型、异常、参数类型)、所有属性 Field[]、某个属性的完整信息、构造器 Constructors),调用类的属性或方法自己的总结: 在运行过程中获得类、对象、方法的所有信息。

游客bnlxddh3fwntw 2020-04-10 13:30:54 0 浏览量 回答数 0

回答

Flink实现了自己的序列化框架,Flink处理的数据流通常是一种类型,所以可以只保存一份对象Schema信息,节省存储空间。又因为对象类型固定,所以可以通过偏移量存取。 Java支持任意Java或Scala类型,类型信息由TypeInformation类表示,TypeInformation支持以下几种类型: BasicTypeInfo:任意Java 基本类型或String类型。 BasicArrayTypeInfo:任意Java基本类型数组或String数组。 WritableTypeInfo:任意Hadoop Writable接口的实现类。 TupleTypeInfo:任意的Flink Tuple类型(支持Tuple1 to Tuple25)。Flink tuples 是固定长度固定类型的Java Tuple实现。 CaseClassTypeInfo: 任意的 Scala CaseClass(包括 Scala tuples)。 PojoTypeInfo: 任意的 POJO (Java or Scala),例如,Java对象的所有成员变量,要么是 public 修饰符定义,要么有 getter/setter 方法。 GenericTypeInfo: 任意无法匹配之前几种类型的类。 针对前六种类型数据集,Flink皆可以自动生成对应的TypeSerializer,能非常高效地对数据集进行序列化和反序列化。对于最后一种数据类型,Flink会使用Kryo进行序列化和反序列化。每个TypeInformation中,都包含了serializer,类型会自动通过serializer进行序列化,然后用Java Unsafe接口写入MemorySegments。如下图展示 一个内嵌型的Tuple3<integer,double,person> 对象的序列化过程: 操纵二进制数据: Flink提供了如group、sort、join等操作,这些操作都需要访问海量数据。以sort为例:首先,Flink会从MemoryManager中申请一批 MemorySegment,用来存放排序的数据。 这些内存会分为两部分,一个区域是用来存放所有对象完整的二进制数据。另一个区域用来存放指向完整二进制数据的指针以及定长的序列化后的key(key+pointer)。将实际的数据和point+key分开存放有两个目的。 第一,交换定长块(key+pointer)更高效,不用交换真实的数据也不用移动其他key和pointer; 第二,这样做是缓存友好的,因为key都是连续存储在内存中的,可以增加cache命中。排序会先比较 key 大小,这样就可以直接用二进制的 key 比较而不需要反序列化出整个对象。访问排序后的数据,可以沿着排好序的key+pointer顺序访问,通过 pointer 找到对应的真实数据。

茶什i 2019-12-02 03:19:32 0 浏览量 回答数 0

回答

知道了。原来不同包的问题。刚试了。在同一包中可以。在不同包中就不行了。不同包中只有子类实例化才可以调用。奇葩... 1.问为什么不能直接调用,请翻回Java面向对象一章重看访问修饰符的内容 2.问为什么报错的先看清楚报错的异常信息,以及在什么地方报错的,看API文档对应的方法会在什么情况下抛这个异常,明明写的很明白。 removeRange方法不是public的,在包外怎么能使用。 还有就是B类已经集成了ArrayList为什么不用B实例化,调用removeRange()方法呢? removeRange方法是protect的,也就是只能子类或包内访问。 你的B类虽然是ArrayList的子类,但是你。。<preclass="brush:java;toolbar:true;auto-links:false;">ArrayListarr=newArrayList();arr.removeRange(1,2);就不对了,你这里并不是B类的实例调用removeRange方法,不满足条件。 如果这么来是可以的。<preclass="brush:java;toolbar:true;auto-links:false;">Bb=newB();b.removeRange(1,2);protected只能在子类或包内访问,我在B中访问A中的protected的方法可以访问啊,为什么?

爱吃鱼的程序员 2020-06-22 19:20:02 0 浏览量 回答数 0

回答

建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下:(1)在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件。该文件的语法类似于Java代码,但会稍有不同。详细介绍见实例52的内容。(2)如果aidl文件的内容是正确的,ADT会自动生成一个Java接口文件(*.java)。(3)建立一个服务类(Service的子类)。(4)实现由aidl文件生成的Java接口。(5)在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。建立AIDL服务本例中将建立一个简单的AIDL服务。这个AIDL服务只有一个getValue方法,该方法返回一个String类型的值。在安装完服务后,会在客户端调用这个getValue方法,并将返回值在TextView组件中输出。建立这个AIDL服务的步骤如下:(1)建立一个aidl文件。在Java包目录中建立一个IMyService.aidl文件。IMyService.aidl文件的位置如图IMyService.aidl文件的内容如下:Java代码:package eoe.demo;interface IMyService {String getValue();}IMyService.aidl文件的内容与Java代码非常相似,但要注意,不能加修饰符(例如,public、private)、AIDL服务不支持的数据类型(例如,InputStream、OutputStream)等内容。(2)如果IMyService.aidl文件中的内容输入正确,ADT会自动生成一个IMyService.java文件。读者一般并不需要关心这个文件的具体内容,也不需要维护这个文件。关于该文件的具体内容,读者可以查看本节提供的源代码。(3)编写一个MyService类。MyService是Service的子类,在MyService类中定义了一个内嵌类(MyServiceImpl),该类是IMyService.Stub的子类。MyService类的代码如下:Java代码:package eoe.demo;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;public class MyService extends Service {public class MyServiceImpl extends IMyService.Stub {@Overridepublic String getValue() throws RemoteException {return "Android/OPhone开发讲义";}}@Overridepublic IBinder onBind(Intent intent) {return new MyServiceImpl();}}在编写上面代码时要注意如下两点:IMyService.Stub是根据IMyService.aidl文件自动生成的,一般并不需要管这个类的内容,只需要编写一个继承于IMyService.Stub类的子类(MyServiceImpl类)即可。onBind方法必须返回MyServiceImpl类的对象实例,否则客户端无法获得服务对象。(4)在AndroidManifest.xml文件中配置MyService类,代码如下:Java代码:下面来编写客户端的调用代码。首先新建一个Eclipse Android工程(ch08_aidlclient),并将自动生成的IMyService.java文件连同包目录一起复制到ch08_aidlclient工程的src目录中,如图所示。调用AIDL服务首先要绑定服务,然后才能获得服务对象,代码如下:Java代码:package net.blogjava.mobile;import net.blogjava.mobile.aidl.IMyService;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle; import android.os.IBinder;import android.view.View; import android.view.View.OnClickListener;import android.widget.Button; import android.widget.TextView;public class Main extends Activity implements OnClickListener {private IMyService myService = null;private Button btnInvokeAIDLService;private Button btnBindAIDLService;private TextView textView;private ServiceConnection serviceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// 获得服务对象myService = IMyService.Stub.asInterface(service);btnInvokeAIDLService.setEnabled(true);}@Overridepublic void onServiceDisconnected(ComponentName name) {}};@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.btnBindAIDLService:// 绑定AIDL服务bindService(new Intent("net.blogjava.mobile.aidl.IMyService"), serviceConnection, Context.BIND_AUTO_CREATE);break;case R.id.btnInvokeAIDLService:try {textView.setText(myService.getValue());// 调用服务端的getValue方法} catch (Exception e) {}break;}}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);btnInvokeAIDLService = (Button) findViewById(R.id.btnInvokeAIDLService);btnBindAIDLService = (Button) findViewById(R.id.btnBindAIDLService); btnInvokeAIDLService.setEnabled(false);textView = (TextView) findViewById(R.id.textview);btnInvokeAIDLService.setOnClickListener(this);btnBindAIDLService.setOnClickListener(this);}。

元芳啊 2019-12-02 00:55:39 0 浏览量 回答数 0

问题

【Java学习全家桶】1460道Java热门问题,阿里百位技术专家答疑解惑

管理贝贝 2019-12-01 20:07:15 27612 浏览量 回答数 19

问题

【精品问答】关于Java,那些入门级的面试题

问问小秘 2020-03-27 18:39:09 1073 浏览量 回答数 3

回答

输出、数据类型、访问权限、定义变量和方法不同1、输出Python: print 默认换行,不换行要加逗号。PHP: echo 可以输出多个变量;print ()只输出一个变量,且成功返回值为1,失败为0;print_r() 只输出数组;die() 先输出,后关机;printf() 格式化输出字符串;var_dump()可以判断一个变量的类型与长度,并输出变量的数。2、数据类型PHP:七个数据类型:String,Integer,Float,Boolean,Array,Object,NULLPython:五个标准的数据类型:Number,String,List,Tuple,Dictionary 其中包括Numberint,long,float,complex3、访问权限PHP:三种访问权限,由高到低为public,protected,privatePython: _foo代表不能直接访问的类属性,需要通过类提供的接口访问;__foo代表类的私有成员;__foo__特殊方法专用的标识4、定义变量和方法PHP: 弱类型语言,用$定义变量,一般情况下变量引用变量时也要带着$(区别于Java), 在类中定义变量时还要加var ,定义方法时 function test (){} 要用function声明。Python:弱类型语言,定义变量时直接写,除了访问权限修饰符不需要加别的。定义方法时 def __init__(self,name): 要用def声明,self是必须要加的常量,代表该类的对象,方法体不用{}。

大财主 2019-12-02 01:05:09 0 浏览量 回答数 0

问题

【精品问答】100+ Java和JavaSE常用技术点

游客pklijor6gytpx 2020-03-29 23:26:40 1148 浏览量 回答数 1

回答

反射机制什么是反射机制简单来说,放射可以帮助我们在动态运行的时候,对于任意一个类,可以获得其所有的方法(包括 public protected private 默认状态的),所有的变量 (包括 public protected private 默认状态的)。是不是很强大呢。 反射机制有什么作用呢?获取某些类的一些变量,调用某些类的私有方法。(例如在Android开发中我们可以用来开启 WiFi 热点,调用 WifiManager 中的 setWifiApEnabled() 方法 )增加代码的灵活性。很多主流框架都使用了反射技术.像ssh框架都采用两种技术 xml做配置文件+反射技术.假如有这样一个类 Person,它拥有多个成员变量,country,city,name,province,height,age 等,同时它拥有多个 构造方法,多个方法,这些变量,方法的访问权限既有 public 也有 private 的。下面我们以这个为例子,一起看怎样使用反射获得相应的 Filed,Constructor,Method。 public class Person { public String country; public String city; private String name; private String province; private Integer height; private Integer age; public Person() { System.out.println("调用Person的无参构造方法"); } private Person(String country, String city, String name) { this.country = country; this.city = city; this.name = name; } public Person(String country, Integer age) { this.country = country; this.age = age; } private String getMobile(String number) { String mobile = "010-110" + "-" + number; return mobile; } private void setCountry(String country) { this.country=country; } public void getGenericHelper(HashMap<String, Integer> hashMap) { } public Class getGenericType() { try { HashMap<String, Integer> hashMap = new HashMap<String, Integer>(); Method method = getClass().getDeclaredMethod("getGenericHelper",HashMap.class); Type[] genericParameterTypes = method.getGenericParameterTypes(); if (null == genericParameterTypes || genericParameterTypes.length < 1) { return null; } ParameterizedType parameterizedType=(ParameterizedType)genericParameterTypes[0]; Type rawType = parameterizedType.getRawType(); System.out.println("----> rawType=" + rawType); Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); if (actualTypeArguments==genericParameterTypes || actualTypeArguments.length<1) { return null; } for (int i = 0; i < actualTypeArguments.length; i++) { Type type = actualTypeArguments[i]; System.out.println("----> type=" + type); } } catch (Exception e) { } return null; } @Override public String toString() { return "Person{" + "country='" + country + '\'' + ", city='" + city + '\'' + ", name='" + name + '\'' + ", province='" + province + '\'' + ", height=" + height + '}'; } } 使用反射获得所有构造方法(包括私有的,非私有的)默认权限的指的是没有修饰符修饰的 几个重要的方法讲解方法 描述public Constructor getConstructor(Class… parameterTypes) 获得指定的构造方法,注意只能获得 public 权限的构造方法,其他访问权限的获取不到public Constructor getDeclaredConstructor(Class… parameterTypes) 获得指定的构造方法,注意可以获取到任何访问权限的构造方法。public Constructor[] getConstructors() throws SecurityException 获得所有 public 访问权限的构造方法public Constructor[] getDeclaredConstructors() throws SecurityException 获得所有的构造方法,包括(public, private,protected,默认权限的)看了上面的几个方法,其实很好区分 后缀带 s 的返回对象时数组类型,是可以获得相应权限的所有方法的,如 Constructor getConstructor() 方法 和 Constructor获得所有的构造方法public static void printConstructor(String className) { try { Class<?> aClass = Class.forName(className); Constructor<?>[] constructors = aClass.getConstructors(); print(constructors); Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors(); print(declaredConstructors); } catch (ClassNotFoundException e) { e.printStackTrace(); } }print: private com.example.reflectdemo.Person(java.lang.String,java.lang.String,java.lang.String) print: public com.example.reflectdemo.Person() print:public com.example.reflectdemo.Person(java.lang.String,java.lang.Integer) print:public com.example.reflectdemo.Person(java.lang.String,java.lang.Integer) 对比 Person 里面所有的构造方法,可以知道我们代码的逻辑是正确的 获得指定的构造方法public static Constructor getConstructor(String className, Class<?>... clzs) { try { Class<?> aClass = Class.forName(className); Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(clzs); print(declaredConstructor); // if Constructor is not public,you should call this declaredConstructor.setAccessible(true); return declaredConstructor; } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } return null; } public class TestHelper { public static final String TAG="xujun"; public static final String CLASS_NAME = "com.example.reflectdemo.Person"; public static final String CHINA = "China"; public static void testConstructor(){ ReflectHelper.printConstructor(CLASS_NAME); Constructor constructor = ReflectHelper.getConstructor(CLASS_NAME, String.class, Integer.class); try { Object meinv = constructor.newInstance(CHINA, 12); Person person = (Person) meinv; Log.i(TAG, "testConstructor: =" + person.toString()); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } } 我们将可以看到以下的输出结果 testConstructor: =Person [country=China, city=null, name=null, province=null, height=null, age=12] 可以看到 country=China,age=12 这说明我们成功通过反射调用 Person 带两个参数的沟改造方法。 注意事项如果该方法,或者该变量不是 public 访问权限的,我们应该调用相应的 setAccessible(true) 方法,才能访问得到 //if Constructor is not public,you should call thisdeclaredConstructor.setAccessible(true);12使用反射获得所有的 Filed 变量获得所有的 Filed 变量public static void printFiled(String className) { try { Class<?> aClass = Class.forName(className); Field[] fields = aClass.getFields(); PrintUtils.print(fields); Field[] declaredFields = aClass.getDeclaredFields(); PrintUtils.print(declaredFields); } catch (ClassNotFoundException e) { e.printStackTrace(); } } 获得指定的成员变量现在假如我们要获得 Person 中的私有变量 age ,我们可以通过以下的代码获得,同时并打印出所有的成员变量。 public static Field getFiled(String className, String filedName) { Object o = null; try { Class<?> aClass = Class.forName(className); Field declaredField = aClass.getDeclaredField(filedName); // if not public,you should call this declaredField.setAccessible(true); return declaredField; } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } return null; } public static void testFiled(){ ReflectHelper.printFileds(CLASS_NAME); Person person = new Person(CHINA, 12); Field field = ReflectHelper.getFiled(CLASS_NAME, "age"); try { Integer integer = (Integer) field.get(person); PrintUtils.print("integer="+integer); } catch (IllegalAccessException e) { e.printStackTrace(); } } 我们可以看到以下的输出结果 print: public java.lang.String com.example.reflectdemo.Person.country print: public java.lang.String com.example.reflectdemo.Person.city print: public java.lang.String com.example.reflectdemo.Person.country print: public java.lang.String com.example.reflectdemo.Person.city print: private java.lang.String com.example.reflectdemo.Person.name print: private java.lang.String com.example.reflectdemo.Person.province print: private java.lang.Integer com.example.reflectdemo.Person.height print: private java.lang.Integer com.example.reflectdemo.Person.age print:integer=12 使用反射执行相应的 Method主要有以下几个方法, public Method[] getDeclaredMethods()public Method[] getMethods() throws SecurityExceptionpublic Method getDeclaredMethod()public Method getMethod(String name, Class获取所有的 Method public static void printMethods(String className) { try { Class<?> aClass = Class.forName(className); Method[] declaredMethods = aClass.getDeclaredMethods(); PrintUtils.print(declaredMethods); } catch (ClassNotFoundException e) { e.printStackTrace(); } } print: public java.lang.String com.example.reflectdemo.Person.toString() print: public java.lang.Class com.example.reflectdemo.Person.getGenericType() print: private void com.example.reflectdemo.Person.setCountry(java.lang.String) print: public void com.example.reflectdemo.Person.getGenericHelper(java.util.HashMap) print: private java.lang.String com.example.reflectdemo.Person.getMobile(java.lang.String) 对比 Person 里面的所有方法,毫无疑问我们的代码逻辑是正确的。 获取指定的 Method我们可以使用 getDeclaredMethod(String name, Class public static void testMethod(){ ReflectHelper.printMethods(CLASS_NAME); Person person=new Person(); Method method = ReflectHelper.getMethod(CLASS_NAME, "setCountry", String.class); try { // 执行方法,结果保存在 person 中 Object o = method.invoke(person, CHINA); // 拿到我们传递进取的参数 country 的值 China String country=person.country; PrintUtils.print(country); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } public class ReflectHelper { private static final String TAG = "ReflectHelper"; public static Method getMethod(String className, String methodName, Class<?>... clzs) { try { Class<?> aClass = Class.forName(className); Method declaredMethod = aClass.getDeclaredMethod(methodName, clzs); declaredMethod.setAccessible(true); return declaredMethod; } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } return null; } } 执行上面的函数,将可以看到下面的结果 print:China 即我们成功利用反射调用 Person 的 setCountry 方法,并将值成功改变。 使用反射操作数组/** * 利用反射操作数组 * 1 利用反射修改数组中的元素 * 2 利用反射获取数组中的每个元素 */ public static void testArrayClass() { String[] strArray = new String[]{"5","7","暑期","美女","女生","女神"}; Array.set(strArray,0,"帅哥"); Class clazz = strArray.getClass(); if (clazz.isArray()) { int length = Array.getLength(strArray); for (int i = 0; i < length; i++) { Object object = Array.get(strArray, i); String className=object.getClass().getName(); System.out.println("----> object=" + object+",className="+className); } } } —-> object=帅哥,className=java.lang.String —-> object=7,className=java.lang.String —-> object=暑期,className=java.lang.String —-> object=美女,className=java.lang.String —-> object=女生,className=java.lang.String —-> object=女神,className=java.lang.String 从结果可以说明,我们成功通过 Array.set(strArray,0,”帅哥”) 改变数组的值。 使用反射获得泛型类型public static void getGenericHelper(HashMap map) { } 现在假设我们有这样一个方法,那我们要怎样获得 HashMap 里面的 String,Person 的类型呢? 对于 Java Type还不熟悉的可以先读这一篇博客 java Type 详解 public static void getGenericType() { try { Method method =TestHelper.class.getDeclaredMethod("getGenericHelper",HashMap.class); Type[] genericParameterTypes = method.getGenericParameterTypes(); // 检验是否为空 if (null == genericParameterTypes || genericParameterTypes.length < 1) { return ; } // 取 getGenericHelper 方法的第一个参数 ParameterizedType parameterizedType=(ParameterizedType)genericParameterTypes[0]; Type rawType = parameterizedType.getRawType(); System.out.println("----> rawType=" + rawType); Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); if (actualTypeArguments==genericParameterTypes || actualTypeArguments.length<1) { return ; } // 打印出每一个类型 for (int i = 0; i < actualTypeArguments.length; i++) { Type type = actualTypeArguments[i]; System.out.println("----> type=" + type); } } catch (Exception e) { } } 执行上面的代码,输出结果 —-> rawType=class java.util.HashMap —-> type=class java.lang.String —-> type=class com.example.reflectdemo.Person 怎样获得 Metho,Field,Constructor 的访问权限 ( public,private,ptotected 等)其实很简单,我们阅读文档可以发现他们都有 getModifiers() 方法,该方法放回 int 数字, 我们在利用 Modifier.toString() 就可以得到他们的访问权限 int modifiers = method.getModifiers();Modifier.toString(modifiers);

hiekay 2019-12-02 01:41:01 0 浏览量 回答数 0

问题

Java基础

游客pklijor6gytpx 2019-12-01 22:02:53 69 浏览量 回答数 1

问题

为什么对于以下方法,我们需要访问修饰符“静态”?

七天一失眠 2020-04-09 11:19:41 2 浏览量 回答数 2
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 云栖号物联网 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 云栖号弹性计算 阿里云云栖号 云栖号案例 云栖号直播