一、标准类的制作(JavaBean):
- 将属性私有化
- 提供get和set方法
- 提供空参【必须提供】和有参数【选择性提供】的构造方法
注意:构造函数 提供了有参构造后 手动提供无参构造(参数构造不提供时、默认提供无参构造)
public class Student {
// 成员变量
String name;
int age;
// 构造方法
// 提供空参数构造方法 保证使用最通用的方式也能创建对象
public Student(){}
public Student(String name){
this.name = name;
}
public Student(int age){
this.age = age;
}
// 提供有参构造,目的是在创建对象的时候可以直接给属性赋值
public Student(String name, int age){
this.name = name;
this.age=age;
}
// get set 方法
public String getName(){
return this.name;
}
public void setName(String name){
this.name=name;
}
public int getAge(){
return this.age;
}
public void setAge(int age){
this.age=age;
}
// 成员方法
public void study(){
System.out.println("努力学习");
}
public void say(){
System.out.println("学生在说话");
}
public void show(){
System.out.println("姓名:"+this.name+",年龄"+this.age);
}
}
二、继承
java中继承的特点:
- java只能单继承 ; 一个类只能有一个父类
- java支持多级(层)继承; 父类也可以有父类 所有类都会继承Object
- java中一个父类可以有多个子类;
继承的好处:描述了事物之间的所属关系,继承的好处是提高代码的复用性 如下
讲师类: 属性(姓名、年龄、工号),方法(讲师)
班主任类:属性(姓名、年龄、工号),方法(管理班级)
员工类: 属性(姓名、年龄、工号)
观察三者之间的关系:讲师+班主任(派生类) 两类继承员工类 (父类)
将子类的共性向上抽取,抽取到父类;父类拥有所有子类的共性内容,子类除了拥有共性内容外还有自己特有的内容
派生类继承父类自动拥有父类的所有成员【私有成员也能继承、但是不能直接访问】
重写 & 重载
重载 overload:在一个类中方法名字相同、参数列表不同(参数个数&参数类型&多类型参数的顺序)
重写 override:继承中子类和父类出现相同的方法,注解 @override 如 方法名称&参数列表@返回值 完全相同 (意义:父类方法不能满足子类的需求,在子类中对方法进行增强)
重写 注意:
- 子类重写父类方法时,参数列表必须相同
- 子类重写父类方法时,子类的权限一定要大于等于父类的权限 : 子类 public > protected > (default) > private 父类 default权限修饰符省略不写
- 私有方法不能被重写
继承中构造方法注意事项
- 构造方法不能继承(子类不会继承父类的构造方法)
- 创建子类对象时,会先执行父类的构造方法、然后执行子类的构造方法。原因是在子类的构造函数中隐藏着super() 、这个super() 是在调用父类的空参构造方法;
- 我们也可以使用super关键字,手动调用父类的构造方法 super(参数)
- 如果使用super() 调用构造方法,那么必须在构造函数的第一行,所以不能在一个构造函数中调用两次super
三、this & super
super的三种用途
- 访问父类的成员变量 super.成员变量
- 访问父类的成员方法 super.成员方法
- 访问父类的构造方法 super() 子类中的空参数构造会隐藏调用父类空参构造 super() 注意 super调用构造方法只能放在第一行 (this、super不能同时出现)
this的三种用途
- 访问本类的成员变量 this.age
- 访问本类的成员方法 this.show() 如果本类没有 不会报错则向父类寻找
- 访问本类的构造方法 this(参数) 注意 this调用构造方法只能放在第一行,手动有了this 系统则不会提供super方法,(this、super不能同时出现)子类中的构造方法中至少有一个构造方法是有super() 隐藏构造,肯定会先执行父类的构造方法
- 构造方法访问成员方法是没有顺序要求的
-
this super
四、抽象类
抽象类:如果一个方法中的方法体,说不清道不明的就是抽象 abstract ,抽象方法存在的类必须是一个抽象类,抽象类用abstract修饰类
抽象类格式:
- public abstract class 类名{}
- public abstract 返回值类型 方法名(参数) 没有方法体
抽象类注意事项:
- 抽象类不能创建对象;
- 抽象类中可以有构造方法,抽象类中的构造方法是给子类使用的,创建子类对象时会执行父类的构造方法,;
- 抽象类中可有 普通方法 + 抽象方法,抽象方法所在的类必须是抽象类(必要不充分)
- 一个普通类在继承了抽象类之后,必须重写抽象方法(抽象类中的抽象方法 子类必须去重写@override),一个抽象类去继承抽象类可以不重写
- 抽象类的目的是为了让子类继承,体现的是模板思想
// 动物抽象类
public abstract class Animal {
public abstract void eat();// 抽象方法 子类必须重写 起到一定的限制作用
}
// 猫类
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
// 狗类
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
// 测试代码
public class AnimalTest {
public static void main(String[] args) {
Dog dog = new Dog(); // 对象
dog.eat();
Cat cat = new Cat(); // 对象
cat.eat();
}
}