@ ## 标题
(子类、父类、抽象类、祖宗类)(封装、继承、多态、getter、setter、构造方法
类的封装
定义
对一个类的属性进行私有化,并提供getter和setter方法。
package class_private;
public class Animal {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
好处
- 安全
- 规范
封装后,类中的属性必须通过对象调用getter和setter方法进行操作,我们可以在getter和setter方法中添加一些条件对访问进行限制,起到安全和规范的作用。
JavaBean
- 属性私有
- 提供getter和setter方法
- 必须有空参构造方法,有参构造方法视情况
package class_private;
public class Animal {
private String name;
private int age;
public Animal() {
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
类的继承
定义
类A通过关键字extends继承类B,则A除了拥有自己的属性和方法外,还具有B中所有的属性和方法(除了B的构造方法不能被继承),使用时不需要通过B,因为继承就表示A也有了,所以能直接使用,但是只能使用B中非私有的(public、protect或者默认),私有private的虽然也会继承过来但是不能直接访问。
public class Dog extends Animal {
public void call(){
System.out.println("汪汪汪");
}
}
public class DemoTest {
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("阿黄");
dog.setAge(2);
dog.call();
}
}
继承的关系
一个类只能有一个父类,但是可以多级继承,比如类的父类再继承别的类;
一个类可以有多个子类
继承的好处
- 提高代码的复用性
- 具有现实意义,让代码之间搭建起一定的联系
重写
类A继承类B后,可以对类B中的方法进行重写。
什么是重写: 重写只发生在继承当中,是子类对父类中的方法进行重写,重写要求:
- 权限修饰符必须>=父类中方法的权限修饰符
- 返回值类型相同
- 参数相同(类型、数量)
- 方法体可以不同
- 重写方法前必须带上@Override
继承的构造方法
当子类继承了父类后,那么在子类的构造方法中(子类所有的构造方法)会多出一个隐藏的调用父类构造方法的方法super(),我们也可以手动的给出super方法,也可以在里面传递参数来调用对应的父类构造方法,这个super方法可以让子类创建对象的时候先启动父类的构造方法,但是手动给出的super方法必须位于构造方法中的首行,不然会报错,因为子类对象的创建必须先调用父类的构造方法,把父类里面的内容继承过来才能去创建子类的对象。
public class Dog extends Animal {
public Dog() {
//隐藏super();
}
public Dog(String name, int age) {
super(name, age);
}
public void call(){
System.out.println("汪汪汪");
}
}
类的多态
多态的前提是继承,没有继承关系就不能说是多态。
格式
父类类型 对象名 = new 子类类型(参数);
编译和运行
- 多态调用成员变量的特点:
编译看左边父类,如果父类没有该属性,那么编译时期会报错;
运行看左边父类,真正使用的是父类的变量;
这里的编译指的是在idea编写代码的时候; - 多态调用方法的特点:
编译时看左边父类,如果父类没有该属性,那么编译时候会报错,因为在编写代码的时候并不知道这个对象指的是子类,它仅仅进行语法检查,发现对象是父类类型,就会去父类的方法检查; - 解决方案:
1. 把子类的方法在父类中用抽象方法写,然后子类继承时就必须要重写一次;
2. 多态转型:向下转型
2.1 格式:子类类型 变量名 = (子类类型) 父类变量名;
2.2 使用新的变量名来调用子类的内容,使用父类变量名不可以,但是这里的父类变量名和子类变量名的值表示都是一样的,因为没有新new;
好处:提高代码的灵活性(参数是父类类型,那么可以传递任何的子类对象)