牛客网错题集锦6

1.length是数组长度

int []a={1,2,3,3};
int b=a.length;

length()是字符串长度

String c="fasdfasdfla";
c.length();

size()是集合长度

2.静态方法里只能访问本类方法中的静态成员,不能直接访问非静态的属性和方法。

这是因为静态方法不依赖于对象,所以当类加载成功后,静态方法就可以访问了。而此时对象不一定存在,非静态成员自然也不一定存在。静态方法也不能出现this关键字,因为this是针对对象而言的。本类中的静态方法可以访问本类的静态属性,也可以调用静态方法。

静态数据成员的值是可以修改的。比如:
static int a = 1;
我可以继续写:
a = 2;
这样没有问题。只是静态数据存储的区域不同而已。
不可修改的是常量。
3.
class A {
    public A(String str) {
    }
}

class Test {
    public static void main(String[] args) {
        A classa = new A("he");
        A classb = new A("he");
        System.out.println(classa == classb);
        System.out.println(classa.equals(classb));
    }
}

答案都是 false

equals也错误是因为子类没有覆盖Object的eqauls()方法,而默认调用 ‘ == ’来比较

判断两个对象是否相等需要覆盖equals()方法和hashcode()方法

object.equals源码如下:

 public boolean equals(Object obj) {
        return (this == obj);
    }

4.

class A {
    public int func1(int a, int b) {
        return a - b;
    }
}

class B extends A {
    public int func1(int a, int b) {
        return a + b;
    }
}

public class ChildClass {
    public static void main(String[] args) {
        A a = new B();
        B b = new B();
        System.out.println("Result=" + a.func1(100, 50));
        System.out.println("Result=" + b.func1(100, 50));
    }
}
答案:150,150



  对于多态,可以总结它为:        


     一、使用父类类型的引用指向子类的对象; 


    二、该引用只能调用父类中定义的方法和变量; 


    三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用) 


    四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。 


多态的3个必要条件: 


        1.继承   2.重写   3.父类引用指向子类对象。 




向上转型: Person p = new Man() ; //向上转型不需要强制类型转化 


向下转型: Man man = (Man)new Person() ; //必须强制类型转化 

关键的来了,不论向上或者向下转型,都是一句话,“编译看左边,运行看右边”。也就是编译时候,会看左边引用类型是否能正确编译通过,运行的时候是调用右边的对象的方法。 


猜你喜欢

转载自blog.csdn.net/guanghuichenshao/article/details/79642817