继承:子承父业。
在一些类中拥有一些共性内容(相同的内容),我们把这些共性内容抽取到一个新的类中。这些类通过extends关键字类继承这个拥有共性内容的类,就可以拥有该类的所有内容。这个拥有共性内容的类称为父类(基类、超类)。继承父类的类称为子类。
单根继承:
在java中,类只支持单根继承。一个类只有一个直接父类。
多重继承:
java中,支持多重继承,爷爷..爸爸..儿子..
继承是java中代码重用的重要手段之一,所有的类都直接或间接的继承Object。
继承通常会有 is-a的关系:如:dog is a pet
语法:
class 子类 extends 父类{
}
当前类为子类。
----->属性关系
1.子类继承父类可以拥有父类的所有属性。
2.子类同样可以拥有父类的private修饰的属性,但是private修饰的内容类外无法访问。子类依然会继承来该特性,需要setget方法进行取值和赋值。
3.父类有一个属性,子类也有。使用子类对象调用该属性,调用的是子类的属性。父类有一个属性,子类也有。使用父类的方法获取该属性属性值,获取的是父类的。就近原则!!
4.如果父子类有有同名属性,在子类方法中想要使用父类的属性值,使用super。
-----------this 和 super
this:当前对象。
1>区分同名的局部变量和属性。
2>调用其他构造方法。this(参数)。
super:代表当前类父类的对象的引用。
!!!:
super不是对象。只是子类对象有一个区域可以
指向父类的对象成员。
1>区分同名的子类属性和父类属性。
2>区分同名的(覆盖的)父子类相同方法。
3>子类中调用父类的构造方法。
super(实参列表);
在子类构造方法中调用父类构造方法必须在第一句,而且只能有一个。
this和super在使用的时候,是一样的。
但是两者意义完全不同,this代表当前对象,super只是子类对象有一块内存空间可以执行父类的对象成员罢了,super不是对象。
this和super都不可以在静态方法中使用。
-------------
this:当前对象。
super:代表当前类父类的对象的引用。
----->方法
1.子类继承父类可以拥有父类的所有方法。
2.覆盖、重写。
方法的重载Overload:
1>同一类中
2>方法名相同
3>参数列表不同
4>与返回值无关。
方法的重写(覆盖)Override:
1>父子类中。
2>方法名相同
3>参数列表相同
4>返回值相同或者子类方法的返回值是父类方法返回值的子类。(子类返回儿子,父类返回爹)
5>访问权限相同,或者子类访问权限高于父类。 (子类更大方)
6>子类不能抛出比父类更多的异常。
当子类方法覆盖父类方法后,子类对象调用该方法调用的是子类重写后的。
3.当子类方法覆盖了父类方法。想在子类中调用父类方法,使用super关键字,调用父类方法。
----->构造方法
1.当没有自定义的情况下,jvm会默认分配一个无参构造方法
public 类名(){
super();
}
所有的构造方法第一句都默认调用父类的无参构造
当一个类没有声明直接父类的时候默认继承Object,也就是构造方法中的super()代表Object中的无参构造。
public Object(){}
2.
1>在构造方法中,没有调用任何其他构造方法(this()|super()) 默认调用父类的无参构造方法。
2>如果父类没有无参构造方法,子类中的构造方法也没有调用其他构造方法,编译会报错。所以,需要子类调用父类的其他有参构造方法。
3>使用super(参数)调用父类的构造方法,必须在第一句。只能有一个。
4>在构造方法中,调用其他构造方法(this()|suepr())只能调用一个。而且必须在第一句。
5>子类的构造方法中一定会调用父类的某个构造方法(间接)。一个类中至少有一个构造方法直接调用父类的构造方法。不允许同一类中构造方法1调2,2调3 ,3调1,-->递归构造器,编译不通过!
----->静态方法
1.父类有一个静态方法,子类没有,用子类对象调用该方法,调用的是父类的。
2.当父类中有一个静态方法,子类也有,用子类对象调用的该方法调用的是子类自己的!
不是因为覆盖,是就近原则。
静态方法不存在覆盖!!!
3.静态方法使用类名去调用。
多态:
事物的多种表现形态。
方法的重载、方法的重写都是多态性的体现。
父类类型 指向子类对象
父类类型 对象 = new 子类();
使用父类类型作为方法的参数和返回值,都是多态中的重要应用。
向上转型的对象,是无法调用子类特有的内容!!
--->属性
1.当父类有一个属性,子类没有,调用该属性,调用的是父类的。
2.当父类有一个属性,子类也有,调用该属性,调用的是父类的。
3.当子类有一个属性,父类没有,调用该属性,编译报错!!!
--->方法
1.当父类有一个方法,子类没有,调用该方法,调用的是父类的。
2.当父类有一个方法,子类也有,调用该方法,调用的是子类的。
因为子类方法给父类方法覆盖了!
3.当子类有一个方法,父类没有,调用该方法,编译报错!!!
---->静态方法
1.父类有一个静态方法,子类没有,调用该方法,调用的是父类的。
2.父类有一个静态方法,子类也有,调用该方法,调用的是父类的。
静态方法不存在覆盖!!!
3.子类中有一个静态方法,父类中没有,调用该方法,编译报错!!!
静态方法使用类名去调用。
父类类型对象 转为子类类型:向下转型
类型的强转。
子类类型 对象 = (子类类型)父类类型对象;
判断一个父类类型对象是否可以转换为某个子类类型:
可以使用运算符,关键字:instanceof
父类对象名 instanceof 子类类型-->boolean
向下转型本身应该是在向上转型的基础上,才有向下转型。