大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
同意愚二亮的回答!
我们提供的服务有:网站设计制作、网站设计、微信公众号开发、网站优化、网站认证、海南ssl等。为上千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的海南网站制作公司
tygzzudxyb的说法错误!
我的回答:
publicprotecteddefaultprivate
假设一个人(类本身),他有儿女(子类), 也有家族(同包),家族之外是社会(异包);
public属性----向社会公开
--------本类,子类直接使用,如userName;
--------类外(包括其它包)本类对象和子类对象以: 对象.username 的方式使用;
protected属性----向子女和家族公开
--------其它包内,只有其子类可以使用,因为是他的子女...
default属性----不让其它包内的子女使用
--------可以想象成:进入社会的子女就不要用父亲的东西了...
private属性----仅自己可用
--------仅本类中可以使用.
这个类似于C++中的友元,在JAVA中是没有相对应的语法的。因为JAVA认为C++中的友元在一定程度上破坏了代码的封装等面向对象的架构,使程序不易管理。
而且就你说到的情况,A和B不在同一个包中,你做出这种限制也是不合软件架构逻辑的。建议你别想了。
Java中有四种访问级别:
public: 任何外部代码都能访问
默认(无关键字): 只有同一个包中的代码可以访问
protected: 只有同一个包中的代码,和这个类的子类代码可以访问
private: 任何外部代码都不能访问
只要把所有方法设为public的,那么B类所在的包的所有类都可以访问到了。
List list = Arrays.asList(arr);
使用Arrays.asList方法可以得到一个ArrayList,但是得到这个ArrayList其实是定义在Arrays类中的一个私有的静态内部类。这个类虽然和java.util.ArrayList同名,但是并不是同一个类。java.util.Arrays.ArrayList类中实现了set, get contains等方法,但是并没有定义向其中增加元素的方法。也就是说通过Arrays.asList如果在开发过程中,想得到一个真正的ArrayList对象(
ArrayListString arrayList = new ArrayListString(Arrays.asList(arr));
中包含一个可以接受集合类型参数的构造函数。因为这个内部类继承了AbstractList类,所以,该类也是Collection的子类。
SetString set = new HashSetString(Arrays.asList(arr));return set.contains(targetValue);
在Java中如何高效的判断数组中是否包含某个元素一文中,深入分析过,以上方式虽然可以实现功能,但是效率却比较低。因为将数组压入Collection类型中,首先要将数组元素遍历一遍,然后再使用集合类做其他操作。
在判断一个数组是否包含某个值的时候,推荐使用for循环遍历的形式或者使用Apache Commons类库中提供的ArrayUtils类的contains
三、在循环中删除列表中的元素
ArrayListString list = new ArrayListString(Arrays.asList("a","b","c","d"));
for(int i=0;ilist.size;i++){
list.remove(i);
}
System.out.println(list);
[b,d]
以上代码的目的是想遍历删除list中所有元素,但是结果却没有成功。原因是忽
略了一个关键的问题:当一个元素被删除时,列表的大小缩小并且下标也会随之变化,所以当你想要在一个循环中用下标删除多个元素的时候,它并不会正常的生效。
也有些人知道以上代码的问题就由于数组下标变换引起的。所以,他们想到使用增强for循环的形式:
for(String s:list){
if(s.equals("a")){
list.remove(s);
}
}
但是,很不幸的是,以上代码会抛出ConcurrentModificationException,有趣的是,如果在remove操作后增加一个break,代码就不会报错:
for(String s:list){
if(s.equals("a")){
list.remove(s);
break;
}
}
迭代器(Iterator)是工作在一个独立的线程中,并且拥有一个 mutex 锁。 迭代器被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 迭代器会马上抛出java.util.ConcurrentModificationException
ArrayListString list = new ArrayListString(Arrays.asList("a", "b", "c", "d"));
IteratorString iter = list.iterator;
while (iter.hasNext) {
String s = iter.next;
if (s.equals("a")) {
iter.remove;
}
}
next方法必须在调用remove方法之前调用。如果在循环过程中先调用remove,再调用next,就会导致异常
了解算法的人可能对HashTable比较熟悉,因为他是一个数据结构的名字。但在Java里边,用HashMap来表示这样的数据结构。Hashtable和 HashMap的一个关键性的不同是,HashTable是同步的,而HashMap不是。所以通常不需要HashTable,HashMap用的更多。
HashMap完全解读、Java中常见亲属比较等文章中介绍了他们的区别和如何选择。
在Java里边,原始类型和无界通配符类型很容易混合在一起。以Set为例,Set是一个原始类型,而Set ? 是一个无界通配符类型。 (可以把原始类型理解为没有使用泛型约束的类型)
public static void add(List list, Object o){
list.add(o);
}
public static void main(String args){
ListString list = new ArrayListString;
add(list, 10);
String s = list.get(0);
}
上面的代码将会抛出异常:
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
使用原始集合类型是很危险的,因为原始集合类型跳过了泛型类型检查,是不安全的。Set、Set ? 和Set Object 之间有很大差别。关于泛型,可以参考下列文章:《成神之路-基础篇》Java基础知识——泛型
程序员们经常使用public作为类中的字段的修饰符,因为这样可以很简单的通过引用得到值,但这并不是好的设计,按照经验,分配给成员变量的访问级别应该尽可能的低。参考Java中的四种访问级别当程序员们不知道LinkedList的区别时,他们经常使用ArrayList,因为它看起来比较熟悉。然而,它们之前有巨大的性能差别。在ArrayList vs LinkedList vs Vector 区别、Java中常见亲属比较等文章中介绍过,简而言之,如果有大量的增加删除操作并且没有很多的随机访问元素的操作,应该首先LinkedList。(LinkedList
八、可变与不可变
在为什么Java要把字符串设计成不可变的一文中介绍过,不可变对象有许多的优点,比如简单,安全等等。同时,也有人提出疑问:既然不可变有这么多好处,为什么不把所有类都搞成不可变的呢?
通常情况下,可变对象可以用来避免产生过多的中间对象。一个经典的实例就是连接大量的字符串,如果使用不可变的字符串,将会产生大量的需要进行垃圾回收的对象。这会浪费CPU大量的时间,使用可变对象才是正确的方案(比如StringBuilder)。
String result="";
for(String s: arr){
result = result + s;
}
StackOverflow中也有关于这个的讨论。
九、父类和子类的构造函数
上图的代码中有两处编译时错误,原因其实很简单,主要和构造函数有关。首先,我们都知道:
如果一个类没有定义构造函数,编译器将会插入一个无参数的默认构造函数。
如果一个类中定义了一个带参数的构造函数,那么编译器就不会再帮我们创建无参的构造函数。
上面的Super类中定义了一个带参数的构造函数。编译器将不会插入默认的无参数构造函数。
子类的所有构造函数(无论是有参还是无参)在执行时,都会调用父类的无参构造函数。
所以,编译器试图调用Super类中的无参构造函数。但是父类默认的构造函数未
定义,编译器就会报出这个错误信息。
要解决这个问题,可以简单的通过
public Super{}
➁ 移除自定义的父类构造函数
➂ 在子类的构造函数中调用父类的super(value)。
关于这个问题,也是程序员经常出现困惑的地方,在该如何创建字符串,使用” “还是构造函数?中也介绍过.
如果你只需要创建一个字符串,你可以使用双引号的方式,如果你需要在堆中创建一个新的对象,你可以选择构造函数的方式。
String d = new String("abcd")时,因为字面值“abcd”已经是字符串类型,那么使用构造函数方式只会创建一个额外没有用处的对象。
多态是面向对象的核心之一,面向接口编程也是以面向对象编程为核心。
接口就是一种规范,我们平时编程要融入生活,比如说电脑的主板,上面有很多接口,插CPU得接口只要插上CPU就可以工作,不管它是哪个厂家生产的CPU,不管它内部如何工作,只要是CPU就可以用。好比你写个接口,里面有个fly方法,实现此接口的类都要实现这个方法,至于你如何飞是你的问题,不管你用翅膀飞,还是骑扫把飞,只要实现’fly飞‘就可以。
上面是让你将编程融入生活,说说编程的东西。
多态就是父类或者接口的引用指向子类的对象的情况。比如child类 extends Fahter类
那么可以Father f=new Child(); 如果一段代码可以用父类运行,当换成子类时,功能不变,那么就是多态。多态主要一定要记得两段话,编译时看引用,运行时看对象。这句话的意思是在IDE编译阶段,你用f点出来的方法(f.这里会提示Father类有得实例方法)都是Fahter类自己有得,而Child类里自己有得方法不会被自动提示出来。但是如果子类重写父类的方法了(重写:就是子类定义了一个与父类一模一样的方法,只是方法体不同),运行时还要看后面new出来的是谁,new Child();那么执行要执行Child类重写的方法体,这样做的好处是我可以在一个方法里写f.fly();(比如Father和Child都有fly方法)
public void test(Father f){
f.fly();
} 在这样的代码下 我里面代码不用动,但是可以让f.fly()效果不同,因为我传进去的子类对象可以不同,比如test(new Child1()); test(new Child2()); test(new Child3());然而这三个子类里面的fly都有自己的具体实现,这就是多态的表现,同一个引用调用同一个方法而表现出多种状态。接口换成父类是一样的。 再有不懂得地方追问。 呵呵