继承和多态
继承
1.继承是2个类之间的一种关系,用extends
关键字实现,被继承的类叫做父类(超类),继承的类叫做子类;
2.子类从父类继承所有的非private的属性和方法;
3.一个父类可以拥有很多个子类;
4.单重继承:一个父类
多重继承:多个父类(Java只支持单重继承,用接口实现多重继承的思想)
5.继承的好处:提高程序的抽象程度,接近人类的思维方式;程序结构更加清晰,降低编码和维护的工作量
6.为什么要继承?什么时候用到继承?实现了代码复用,避免重复代码;多个类有相同的特征(属性)和行为(方法),把这些内容抽象到一个父类中,其他的类无需重新定义,只需要继承即可。因此父类更通用,子类更具体。
7.方法重写?子类中重写父类的方法
8.super:在子类的构造方法中,用super调用父类的构造函数(必须是构造函方法的第一条语句);如果子类重写了父类的方法,通过super调用父类的方法
9.创建对象时,先创建父类对象,在创建子类对象。如果没有显示调用父类的构造方法,将自动调用父类的无参构造方法。
10.一切类的老大是Object类
:java.lang.Object;Object类到底实现了哪些方法?(华为面试题)
- clone:保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。
- getClass:获取运行时类型
- toString:用的很多,一般子类都会覆盖
- finalize:释放资源,很少用
- equals:一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法。
- hashCode:用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。
一般必须满足obj1.equals(obj2)==true。可以推出obj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。 - wait:使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。
- notify:唤醒在该对象上等待的某个线程。
- notifyAll:唤醒在该对象上等待的所有线程。
多态
1.多态是一个程序中同名的不同方法
;
2.多态分为重载(编译时多态)和动态绑定的覆盖/接口实现(运行时多态);
3.多态的好处:提高程序的灵活性和可扩展性,代码更简洁;
4.多态存在的必要条件:要有继承;要有重写;父类引用指向子类对象(向上转型)
;
5.多态的实现方式:继承父类进行方法覆盖;同一个类中方法重载;接口实现(实现其方法)
;
- 方法的继承:继承父类非私有成员;
- 方法的覆盖:子类中的和父类相同的方法,默认调用子类自己的方法,除非加super关键字;
- 方法的重载:同名方法重新定义,通过参数列表(类型 顺序 数目)区分;
public float setarea(){} public float setarea(float a){}
6.this:
super:
7.static
:
8.abstract
:
- 抽象类,没有具体实例对象的类,用来实现类之间的继承关系;
- 抽象方法:只有方法头,没有具体的方法体
,方法体的实现由当前类的不同子类在各自的类中完成,抽象方法只能存在于抽象类中;
- 两者关系:抽象类可以有0个或者多个抽象方法,也可以包含非抽象的方法;抽象类中可以没有抽象方法,但是有抽象方法的一定是抽象类;抽象类派生的子类必须实现抽象类中定义的所有抽象方法
abstract class Shapes{
protected double circumference;
protected double area;
abstract void setCircumference();
abstract void setArea();
}
public class Circle extends Shapes{
protected int radius;
static final double pi=3.14;
//重写
public void setCircumference(){
circumference=2*pi*radius;
}
//重写
public void setArea(){
area=pi*radius*radius;
}
}
9.final
:
- 最终类:
不能被继承
- 最终属性:不能被改变,为节省空间,常量还会声明为static
- 最终方法:
不能被当前类的子类重写覆盖
final class C1{ int i; public void print(){ System.out.println("i="+i); } }
10.volatile:
可以同时被几个线程所控制和修改
11.synchronized:同步方法修饰符
多线程共存的程序中同步
12.修饰符混合使用
13.接口:由抽象方法和常量组成的特殊体(类似多重继承),关键字interface
- 接口也有继承性,用
extends
声明,一个接口可以有一个以上的父接口,之间用逗号分隔(区别于继承) - 接口只是定义对外的接口和规范,并没有实现其功能,功能室靠实现该接口的类重写抽象方法
- 接口中的属性必须是public static final,方法必须是默认的public abstract
- 接口实现多态
List 接口的两个实现类,ArrayList,LinkedList。
public class ListStudy {
public static void main(String args[]) {
List<String> list = new ArrayList<>();
List<String> list1 = new LinkedList<>();
}
}