继承(super、this)
super的三种用途:
super的三种用途
1. 可以访问父类的成员变量。
super.成员变量
2. 可以访问父类的成员方法
super.成员方法()
3. 可以访问父类的构造方法
super();
this的三种用途:
this的三种用途:
1. 可以访问本类中的成员变量。
this.成员变量
2. 可以访问本类中的成员方法
this.成员方法()
3. 可以访问本类中的构造方法。
this(参数);
如果this调用构造方法,也必须放在第一行
Employee
/*
我们可以将多个类(子类)中的共性向上抽取,抽取到另一个类(父类)中。
子类继承父类,会自动拥有父类所有的成员(私有成员也能继承,不过无法直接访问)
继承的格式:
public class A {}
public class B extends A {}
上面代码表示B类继承了A类,B是子类,A是父类,B类会自动拥有A类所有的成员。
*/
public class Employee {
//姓名
String name;
//年龄
int age;
}
Teacher
/*
讲师类
*/
public class Teacher extends Employee{
//讲课方法
public void teach() {
System.out.println("讲师讲课");
}
}
Assistant
/*
助教类
*/
public class Assiatant extends Employee{
//辅导方法
public void help() {
System.out.println("助教辅导");
}
}
DemoTest
/*
测试类
*/
public class Demo01Test {
//定义main方法
public static void main(String[] args) {
//创建讲师对象
Teacher t = new Teacher();
//给讲师对象的属性赋值
t.name = "小明老师";
t.age = 30;
System.out.println("姓名:" + t.name + ",年龄:" + t.age);
//调用方法
t.teach();
}
}
匿名对象
匿名对象顾名思义就是没有名字的对象,如果我们创建了一个对象但是在左边没有用变量接收这个对象,那么就是一个匿名对象。
比如创建对象的格式:
数据类型 对象名 = new 数据类型();
如果上面格式只写了右边,没有写左边,那么就是一个匿名对象。
好处:
匿名对象可以稍微简化我们的操作。
匿名对象的使用场景:
1. 如果某个对象我们只需要用一次,那么可以使用匿名对象【匿名对象没有接受,用完之后就找不到了】
2. 当做方法参数进行传递。
继承中成员变量的特点:
继承关系中成员变量的访问特点:
通过子类访问成员,子类没有,会向上找父类。
通过父类访问成员,父类没有,不会向下找子类。
父类和子类成员变量同名时的访问特点(了解):
直接访问(通过子类对象直接访问):
使用的是子类自己的成员。
间接访问(通过方法的方式去访问)
调用的是哪个类中的方法,访问到的就是哪个类中的成员变量。
继承中成员方法的特点:
继承中成员方法的访问特点
如果子类中的成员方法和父类中的成员方法同名,那么通过子类对象访问成员方法,访问的是子类中定义的成员方法。 如果子类中出现了和父类一模一样的方法,那么这个就叫做方法的重写。
重写和重载的区别:
重载: 方法名,参数列表不同。
重写: 在子类中出现了和父类一模一样的方法。
方法重写注意事项:
方法重写的注意事项:
1. 子类在重写父类方法时,参数列表必须相同。
2. 子类重写父类方法时,子类方法的权限一定要大于等于父类方法的权限【了解】
public > protected > 默认 > private
默认权限指的是省略不写,如果省略权限修饰符,那么方法就是默认权限。
3. 私有的方法不能被重写
一般来说,方法重写时,权限修饰符,返回值类型都是一致的。
继承中的构造方法:
在继承关系中构造方法的注意事项:
1. 构造方法不能继承。
2. 创建子类对象时会先执行父类的构造方法,然后执行子类的构造方法。 原因是因为在子类构造方法的第一句有一个隐藏的super(),是在调用父类的空参数构造方法
3. 我们也可以使用super关键字手动调用父类的构造方法。
super(参数)
4. 如果使用super调用构造方法,那么只能放在第一行。
抽象类的定义和使用(举例):
动物类。
动物有吃的行为,但是动物吃什么,我们是说不清的, 这种说不清道不明的方法,我们可以定义成抽象方法。
抽象方法:
使用abstract修饰,没有方法体。
抽象方法格式:
public abstract 返回值类型 方法名(参数);
抽象类:
抽象方法存在的类必须是一个抽象类。抽象类就是使用abstract修饰的类。
抽象类的格式:
public abstract class 类名 {}
抽象类的使用:
1. 抽象类不能创建对象。
2. 抽象类是给子类用的,我们要定义一个子类去继承抽象类。
3. 重写抽象类中的所有的抽象方法。
4. 创建子类对象,通过子类对象调用方法。
抽象类的注意事项:
抽象类的注意事项:
1. 抽象类不能创建对象
2. 抽象类中也是有构造方法的,抽象类中的构造方法是给子类用的。
3. 抽象类中可以有抽象方法,也可以有非抽象的方法。
抽象方法所在的类必须是一个抽象类。
4. 一个普通类在继承抽象类时,必须重写这个抽象类中所有的抽象的方法。
一个抽象类在继承抽象类时,可以不重写抽象类中的抽象方法。
5. 抽象类的目的是为了让子类继承,体现的是模板思想。
模板方法模式:
模板方法模式
将固定的流程定义在父类中,不同的地方使用抽象方法,让子类继承重写
final关键字(final修饰类,方法,变量)
如果final修饰类,这个类不能被继承,但是这个类可以继承其他类。
如果final修饰方法,这个方法不能被重写,但是可以被子类继承使用。
如果final修饰变量,这个变量的值不能被改变,从效果上看,这个变量也就变成了常量。
如果final修饰的是局部变量,那么变量的值只能赋值一次,一旦赋值就不能更改了。
如果final修饰的是成员变量,该变量也是只能赋值一次,一旦赋值不能更改。
final修饰的成员变量,必须在创建对象之前完成赋值(可以直接赋值,也可以构造方法中赋值)
常量的命名规范:所有字母都大写,如果有多个单词,多个单词之间使用下划线隔开。比如: AAA_BBB_CCC