**
多态:Animal a=new Cat();
**
这样a对象就可以访问到父类Animal中的成员变量
访问子类中被重写的方法,子类中特有的方法访问不到(可以通过向下转型访问子类对象),也可以返回父类中没被子类重写的方法
成员变量:编译看左边,执行看左边(返回父类中的成员变量)
成员方法:编译看左边,执行看右边(调用子类重写后的方法)
多态可以通过父类对象访问子类重写的父类方法(不能访问到具体的子类特有的方法),以及父类成员变量
但有一个问题就是它访问不到子类成员变量?
解决办法:
解决方法
采用get()/set()
Java
public class Person {
private String name = "person";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Dad extends Person {
private String name = "Dad";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Person dad = new Dad();
System.out.println(dad.getName());
得到结果:
Dad
由于dad.getName()执行的是子类中重载父类的getName(),因此返回的也是子类中定义的name。这种方法最为推荐,但用起来也繁琐一些。因为这种方法同时维护了两个相同的成员变量,因此使用起来也得小心一些。
向上向下转型
抽象类
关键字:abstract
抽象类的特点
public abstract class abstractProject {
public abstract void eat();
}
若有抽象方法必须是在抽象类
抽象类不可以直接创建对象,要通过多态的形式
创建一个子类继承这个抽象类
其中这个子类要么也是抽象类,要么就必须重写他的父类抽象类的抽象方法
然后
抽象类类名 a=new 子类();
接口
接口本来就是一种抽象类
接口的成员特点
Math常用方法
集合
接口不可直接创建对象,通过实现类来创建对象
比如:List list=new ArrayList();
List集合
List是一个接口,它继承了Collection,所以Collection的所有方法都可使用
特点:有序可重复
List特有的方法
集合迭代器
public class Fu {
public static void main(String[] args) {
Collection<String> c=new ArrayList<>();
c.add("hello");
c.add("world");
c.add("hhello");
System.out.println(c);
//迭代器
Iterator<String> it=c.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
}
列表迭代器
listIterator
与集合迭代器用法相同,当list需要遍历时,若用Iterator会引起并发错误