1.length是数组长度
int []a={1,2,3,3}; int b=a.length;
length()是字符串长度
String c="fasdfasdfla"; c.length();
size()是集合长度
2.静态方法里只能访问本类方法中的静态成员,不能直接访问非静态的属性和方法。
这是因为静态方法不依赖于对象,所以当类加载成功后,静态方法就可以访问了。而此时对象不一定存在,非静态成员自然也不一定存在。静态方法也不能出现this关键字,因为this是针对对象而言的。本类中的静态方法可以访问本类的静态属性,也可以调用静态方法。
静态数据成员的值是可以修改的。比如:3.
static int a = 1;
我可以继续写:
a = 2;
这样没有问题。只是静态数据存储的区域不同而已。
不可修改的是常量。
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() ; //必须强制类型转化
关键的来了,不论向上或者向下转型,都是一句话,“编译看左边,运行看右边”。也就是编译时候,会看左边引用类型是否能正确编译通过,运行的时候是调用右边的对象的方法。