什么是继承?
Java中提供了一个关键字extends,用这个关键字,可以让一个类和另一个类建立父子关系。
继承的特点
1.子类能继承父类的非私有成员(成员变量、成员方法)。
2.继承后对象的创建子类的对象是由子类、父类共同完成的。
public class A {
//公开成员
public int i;
public void print(){
System.out.println("====print====");
}
//私有成员
private int j;
private void print2()
{
System.out.println("+++print+++");
}
}
public class B extends A{
///子类可以继承父类的私有成员
public void print3()
{ ///
System.out.println(i);
print1();
//报错System.out.println(j);
//报错print2
}
}
public class Test{
public static void main (String []args)
{
//目标:认识继承,掌握继承的特点
B b= new b();
System.out.println(b.i);
//System.out.print(b.j); 报错
//System.out.print(b.k); 报错
b.print();
//b.print2(); 报错
b.print3();
}
}
继承的执行原理
带继承关系的类,Java会怎样创建它的对象?对象创建出来以后,可以直接访问那些成员?
带继承关系的类,java会用类和其父类,这多张设计图来一起创建类的对象。
对象能直接访问什么成员,是由子父类这张设计图共同决定的,这张设计图对外暴露了什么成员,对象就可以访问什么成员。
使用继承有什么好处
减少重复代码
可以将重复代码放到父类去
//父类
public class People {
private String name;
public String getname();
{
return skill;
}
}
//子类
public class Teacher extends
{
private int skill;
public void setSkill(String skill)
{
this.skill = skill;
}
public void printinfo()
{
System.out.println(getName()+"具备的技能"+skill());
}
}
继承相关的注意事项
1.权限的修饰
就是用来限制类中的成员 (成员变量、成员方法、构造器、代码块…) 能够被访问的范围。
权限修饰符有几种?各自的作用是什么?
修饰符 | 在本类中 | 同一个包下的其它类里 | 任意包下的子类里 | 任意包下的任意类里 |
---|---|---|---|---|
private | ✓ | |||
缺省 | ✓ | ✓ | ||
protected | ✓ | ✓ | ✓ | |
public | ✓ | ✓ | ✓ | ✓ |
private<缺省<protected<public
2.Object 单继承、Object类
Java 是单继承的,Java中的类不支持多继承,但是支持多层继承。
public class Test()
{
public static void main()
{
//目标:掌握继承的两个注意事项。
//1. java 是单继承的,一个类只能继承一个直接父类,Java中的类不支持多继承,但是支持多层继承。
//2.Object 类是Java中所有类的祖宗。
}
}
class A()
{
}
class B extends A {
}
//class C extendsB ,A{}//报错
class D extends B{
}
3.Object 类是Java中所有类的祖宗
什么是方法重写
当子类觉得父类中的某个方法不好用,或者无法满足自己的需求时,子类可以重写一个方法名称,参数列表一样的方法,去覆盖父类这个方法,这就是方法重写。
注意:重写后,方法的访问,Java会遵循就近原则。
1.方法重写的其它注意事项
重写技巧 :使用Override 注解,他可以指定java编译器,检查我们的方法重写格式是否正确,代码可读性也会更好。
子类重写父类方法时,访问权限必须大于或者等于父类该方法的权限(public > protected > 缺省)。
重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小。
私有方法,静态方法不能被重写,如果重写会报错。
子类写了一个方法名称,形参列表与父类某个方法一样的方法去覆盖父类方法。
2.方法重写的应用场景
当子类觉得父类的方法不好用,或者不满足自己的需求时,就可以用方法重写。
子类中访问其它成员的特点
1、在子类中访问其它成员(成员变量、成员方法),是依照就近原则的。
先子类局部范围找
然后子类成员范围找
然后父类成员范围找,如果父类范围还没有找到则报错。
public class F{
public void print()
{
System.out.print("==父类的print方法执行==");
}
}
public class Z extends F {
String name = "子类名称";
public void showname()
{
String name = "局部名称";
System.out.println(name);//局部名称
System.out.println(this.name);//子类成员名称
System.out.println(super.name);//父类中的成员变量
}
@Override
public void print1()
{
System.out.println("==子类的方法执行了==");
}
public void showMethod()
{
print1();//子类的
super.print1();//父类的
}
}
2.如果子父类中,出现了重名的成员,会优先使用子类的,如果此时一定要在子类中使用父类的怎么办?
可以通过super 关键字,指定访问父类的成员:super.父类成员/父类成员方法
子类构造器的特点
子类的全部构造器,都会先调用父类的构造器,在执行自己。
class F
{
public F()
{
System.out.println("===父类f的 无参数构造器 执行了 ===");
}
}
class Z extends F
{
public Z(){
System.out.println("==子类Z的 无参数构造器 执行了===");
}
}
public class Test()
{
public static void main(String []args){
//mu
}
}