1.1 体现形式
第一种:函数(提高代码的复用性)
第二种:属性的私有化--将属性设置为私有的,通过对外提供访问的方法来操作对应的属性,可以做一系列的限定使之满足需求。(提高=代码的安全性)
eg:问题提出,对象.属性 不能约束范围;问题解决 private+setter(getter)
public class Person{
private int age;
public void setAge(int age){
this.age=age;
}
public int getAge(){
return this.age;
}
}
eclipse的快捷键:alt+shift+s Generate Getters and Setters
1.2权限修饰符
本类 | 子类 | 同包类 | 其他类 | |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | |
默认 | √ | 同包子类 | √ | |
private | √ |
eg:
public Cat{
String name;
String color;
public void eat(){
}
pulic void sleep(){
}
}
public Dog{
String name;
String color;
public void eat(){
}
pulic void 犬吠(){
}
}
上述两类的重复部分提取到Pet类中:
class Pet{
String name;
String color;
public void eat(){
}
}
//Cat和Dog改造:继承Pet类(extends)
//提取出来的类为父类(超类、基类),原来的叫子类(派生类)
class Dog extends Pet{
}
class Cat extends Pet{
}
对一些类中共有的属性和方法进行提取,提取出来一个新类,通过extends关键字是新的类和原来的类产生联系,这种继承称之为继承。新的类称之为父类(超类、基类),原来的类称之为子类(派生类)
java继承为多继承,摒弃多继承
class A{
int m(){
return 0;
}
}
class B{
String m(){
return 0;
}
}
//假设下述成立,则
class C extends A,B{
}
//主函数中
C c=new C():
c.m();//二义性
优点:
提高安全性
提高复用性
统一结构
*在创建父类对象的时候,先会创建一个父类对象,而这个父类对象在子类中以super关键字的形式存在。
*子类中调用父类中属性和方法:super
*super可以认为是父类对象的引用,可以认为
*注:如果子类构造函数中没有手动添加,JVM会在编译的时候自动添加一个super(),调用super()的时候,会自动匹配父类中对应形式的构造函数;必须放在首行;
*如果一个构造函数已经存在this,那么不能写super,此时创建父类对象应该在其他构造函数中写
*子类的每个构造函数中直接或间接地有一个super语句--√
*如果父类只提供含参构造,子类的构造函数不能使用super语句,必须显示写。
*继承时注意private不能通过super来调用,可以通过this来调用,因为在子类中找不到会去父类中找
方法重写(方法覆盖):在父子类中,方法的返回值类型,函数名,参数一致
重写遵守原则:两等两小一大【方法签名一致、当方法类中的方法的返回值类型一致(基本、void、最终类型)】【 返回值类型是引用数据类型,要么一致,要么是返回值类型的子类】
【权限修饰符要大于父类的权限(看权限从根上看)】
eg:
class A{
protected void mm(){}
}
class B extends A{
public static void main(String [] args){
B b=new B();
b.mm();//可用
}
}
class C extends A{
public static void main(String [] args){
B b=new B();
b.mm();//不可用
}
}
1. 体现形式
编译时多态--重载(同一个类中相同的方法不同的函数体)
运行时多态--向上造型(创建的是子类对象,内存中存的也是子类对象,但只能调父类中存在的方法),重写(不同类的相同方法)
2. 上造型对象
父类声明,子类创建;父类在声明的时候就相当于给了这个对象一份题纲,由于这个对象是父类声明的,所以对象能干什么需要看父类;由于是用子类初始化,具体怎么干看子类。
理解:子类哪一个也行,并不关心子类具体是谁,在编译的时候并没有检查具体的子类
运行时,才绑定子类中的方法
3. 重写
方法名完全一致
子类重写方法的返回值类型必须一致或者子类方法的返回值类型是原类返回类型的子类
子类重写的方法的权限修饰符要大于等于父类--要不产生了冲突(父类中的方法子类可以用,子类有的方法父类不一定有)
4. 不能提高复用性和安全性,但是能解耦!(多态的出现是为了解耦,降低模块之间的联系,依赖性变小)