继承:
让类与类之间产生关系.子类可以直接使用父类中非私有成员
多各类中出现重复性内容时,把重复性的内容抽取出来,做成父类,让子类继承父类.
继承的好处:
提高了代码的复用性
提高了代码的维护性
让类与类之间产生了关系,是多态的前提
继承的弊端:
继承是侵入性的
降低了代码的灵活性
增强了代码的耦合性
继承的特点:
Java只支持单继承,不支持多继承,支持多层继承
继承的成员变量访问特点:
在子类方法中访问一个变量
子类局部范围找,子类成员范围找,父类成员范围找
注意:如果子父类中,出现了重名的成员变量,通过就近原则,会优先使用子类的
如果一定要使用父类的,可以通过super关键字,进行区分.
super关键字的用法和this关键字的用法相似
this:代表本类对象的引用
super:代表父类存储空间的标识(可以理解为父类对象引用)
案例:
public class Test1 {
public static void main(String[] args) {
Dog d = new Dog();
d.getName();
}
}
class SuperAnimal{
String name = "SuperAnimal";
public void getName(){
System.out.println(name);
}
}
class Animal extends SuperAnimal{
String name = "小花";
}
class Dog extends Animal{
String name = "小黑";
public void getName(){
String name = "小黄";
System.out.println(name);//局部变量
System.out.println(this.name);//成员变量
System.out.println(super.name);//父类成员变量
}
}
运行结果:
小黄
小黑
小花
成员方法:
super.方法名()
方法重写:override
在继承关系下,出现相同的方法
方法重写和重载的区别:
方法重写:Override
发生在继承体系时,子类出现和父类一模一样的方法,这两个方法构成的关系叫"方法重写"
特点:子父类中,方法生命一模一样
方法重载:Overload
发生在同一个类中,出现"同名不同参"的方法,那这些方法之间就构成方法重载
方法重写注意事项:
父类中私有方法不能被重写
父类静态方法,子类必须通过静态方法重写,父类非静态方法,子类必须通过非静态方法重写
子类重写父类方法时,访问权限必须大于父类
权限修饰符:
private:私有的,出了本类,别的类都不能访问
什么都不写:只能在同一个包
protected:不同包的子类访问
public:权限最大,公共的,任何地方都可以访问
继承中成员的访问特点:
成员变量:就近原则
成员方法:就近原则
子类构造方法的访问特点
子类执行构造方法,先执行父类构造方法
子类默认执行父类的无参,如果没有无参,就不执行.
如果父类没有无参,有有参,想要执行有参
1.子类通过super,手动调用父类的带参构造方法///super(参数)
2.子类通过this调用本类的构造方法,最终还是要调用父类构造方法
public class Test {
public static void main(String[] args) {
Cat c1 =new Cat();
c1.setName("加菲");
c1.setColor("花色");
Cat c2 = new Cat("英短","黑白");
System.out.println(c1.getName()+c1.getColor());
System.out.println(c2.getName()+c2.getColor());
}
}
class Cat extends Animal{
public Cat() {
}
public Cat(String name, String color) {
super(name, color);
}
}
class Animal {
String name;
String color;
public Animal() {
}
public Animal(String name, String color) {
this.name = name;
this.color = color;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
抽象类(abstract):
抽象方法:将共性行为(方法)抽取到父类后,发现该方法的实现逻辑无法在弗雷中给出具体明确,该方法就可以定义为抽象方法.
抽象类:如果一个类中存在抽象方法,name该类就必须声明为抽象类.
public class TestDemo {
public static void main(String[] args) {
Cat c = new Cat();
c.eat();
Dog d = new Dog();
d.eat();
}
}
class Cat extends Animal{
public void eat(){
System.out.println("猫吃鱼");
}
}
class Dog extends Animal{
public void eat(){
System.out.println("狗吃肉");
}
}
abstract class Animal{
String name;
int age;
public void drink(){
System.out.println("喝水");
}
//抽象方法特点
//1.抽象方法没有方法体
//2.抽象方法所在的类必须是抽象类
//3.抽象方法的子类必须重写子类的所有抽象方法
public abstract void eat();
}
注意事项:
1.抽象类不允许实例化(创建对象)
2.抽象类中有构造方法
3.抽象类的子类:必须要重写父类中的所有抽象方法
4.抽象类中的方法可以没有抽象方法,但是有抽象方法的类一定是抽象类