class Person
{
/*
父类拥有name和age两个变量, 其权限是protected, 也就是允许子类访问,但对象不能访问
如果设定成private的话, 子类就不能访问到父类的成员
*/
protected String name;
protected int age;
int num = 4;
public Person(String name , int age)
{
this.name = name;
this.age = age;
}
public void Print()
{
System.out.println("我是父类Person");
}
}
class Student extends Person
{
int num = 5;
public Student(String name , int age)
{
//super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
super(name , age);
}
public void Study()
{
System.out.println(name + "\t" + age + "\t" + num);
}
public void Print()
{
System.out.println("我是子类Student");
//若要在子类调用父类的方法,需使用关键字super
super.Print();
}
}
class Worker extends Person
{
int num = 6;
/*
子类不能继承父类的构造器(构造方法或者构造函数),但是父类的构造器带有参数的,则必须在子类的构造器中显式地通过
super关键字调用父类的构造器并配以适当的参数列表。如果父类有无参构造器,则在子类的构造器中用super调用父类构造器
不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造器。
*/
public Worker(String name , int age)
{
super(name , age);
}
public void Work()
{
System.out.println(name + '\t' + age + "\t" + num);
}
public void Print()
{
System.out.println("我是子类Worker");
super.Print();
}
}
public class ExtendsDemo
{
public static void main(String[] args)
{
Student stu = new Student( "zhangsan" , 18);
stu.Study();
stu.Print();
Worker wor = new Worker( "lisi" , 38);
wor.Work();
wor.Print();
}
}
/*
final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:
*/
1. 继承是多态的基础;
2. java中支持单继承,不直接支持多继承,但对c++中的多继承机制进行改良;
3. 单继承:一个子类只能有一个直接父类;多继承:一个子类可以有多个直接父类(java中不允许,进行改良); 因为比如父类A 和父类B中都有一个相同函数fun,当子类c要继承A和B的时候,调用c的fun函数,就会产生错乱,不知道调用哪一个。
4. java支持多重(多层)继承:C继承B,B继承A;当父类A 和父类B中都有一个相同函数fun时, 这个时候B中的fan函数已经重写了A中的fun函数,所以C继承的是B的fun函数;
5. 写继承的前提是两个类要所属关系: B is A ,B是A的其中一种;
6. 当B中能完全包含A的方法时候才继承A,如果A和B中存在一部分相同的方法的时候, 不能将AB定义为继承, 但是可以将AB中相同的方法写成父类, AB分别继承它;
比如草食动物和肉食动物都是动物, 它们之间有共性, 但不能把它们设定为继承关系;可以把动物这个共性设定为父类,然后草食动物和肉食动物分别继承它;
7. 当本类的成员和局部变量名用this区分;当子父类中的成员变量同名时候用super区分父类;
8. super和this用法很相似;this:代表一个本类对象的引用;super:代表一个父类空间
9. 方法区存放的是代码块,没有内存;
10. 子类不能直接访问父类中private成员,方法;但子类仍然继承了父类中的private成员和方法,只是这些成员和方法前面存在权限, 子类不能访问;
11. 当子类重写父类中的方法时,子类重写的方法的权限不低于父类中的方法;也就是说子类写的方法的权限必须往大了写,父类的方法为public ,子类必须为public;父类的方法权限没写,也就是默认权限,子类必须为默认权限或者public;父类为private,子类根本不能访问父类的方法了, 也就构不成重写了;
12. 静态只能静态覆盖,或者被静态覆盖;