文章目录
- **继承**
- 方法重载和重写
- 访问修饰符
- 进行方法重写的时候,重写的方法的访问修饰符的范围需要大于或等于父类的访问范围
- super,调用父类的成员和方法
- super和this比较
- **构造方法调用时,super和this不能同时出现**
- 继承后的初始化顺序
继承
一种类与类之间的关系
使用已存在的类的定义作为基础建立新类
新类的定义可以增加新的数据或者新的功能,也可以用父类的功能,但不能选择性的选择父类
继承通过extends关键字实现。子类在前父类在后;public class Cat extends Animal{}
一个子类只有一个唯一的一个父类
- 子类可以直接访问父类非私有成员,不能直接访问私有成员,私有成员只能在本类中访问,即使继承也不行,要想访问只能通过get,set方法访问
- 父类不可以访问子类特有的成员,即使是public修饰也不行
- 当子类重写父类方法后,子类的对象调用的是重写后的方法
例如:Dog类继承了Animal类,Dog类重写eat方法。在主方法里面, Dog two = new Dog(); two.eat(“凡凡”);这时候Dog的对象调用的是重写后的eat方法
方法重载和重写
/**
* 方法重载:
* 1、在同一个类里面
* 2、方法名相同,参数列表不同(参数顺序、个数、类型)
* 3、方法返回值、访问修饰符任意
* 4、与方法的参数名无关
*/
//下面这两个方法不是方法重载,参数列表的顺序不同,指的是数据类型的顺序不同,而不是参数名称的顺序不同,下面这两个方法的数据类型顺序是一样的,所以不是方法重载。与方法的参数名无关
public void sleep(int month,String name){
}
public void sleep(int name,String month){
}
/**
/**
* 方法重写:
* 1、在子类之中重写父类的方法,在有继承关系的子类中
* 2、方法名称和参数列表都要与父类完全相同(参数的顺序、个数、类型)
* 3、与方法的参数名无关
* 4、返回值:当方法的返回值是void或基本数据类型的时候,返回值必须完全相同,不允许被修改。当返回值是引用类型时,可以是父类或者子类
* 5、访问修饰符:修饰符访问的范围需要大于或者等于父类的访问范围
*/
*/
- 父类构造方法不允许被继承,不允许被重写,但是会影响子类的实例化
访问修饰符
公有的: public
私有的: private
受保护的: protected
默认:什么权限都不加的情况
/**
* private:只允许在本类中进行访问
* public:允许在任意位置访问
* protect:允许当前类、同包下所有的类调用。跨包子类能调用,跨包非子类不允许调用。
* 默认,什么权限都不加的情况:允许在当前类访问,同包下所有类都能调用,跨包无论是子类还是非子类都不允许调用
*/
访问修饰符 | 本类 | 同包 | 子类(跨包) | 其他 |
---|---|---|---|---|
private | √ | |||
默认 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
根据上面的表格访问修饰符修饰的范围可以得出以下结论
进行方法重写的时候,重写的方法的访问修饰符的范围需要大于或等于父类的访问范围
super,调用父类的成员和方法
代表父类对象的引用
super可以访问父类当中允许被子类派生的任意成员,不仅是方法,成员属性等
super.print(); 访问父类成员方法
super.name; 访问父类属性
super(); 访问父类构造方法
//在子类中的方法用super关键字,代表调用的是父类的eat方法,而不是本类中的eat方法
public void sleep(){
super.eat();//访问父类的eat方法
super.name = "小志";//访问父类的name属性
}
//这是父类的有参和无参两个构造方法,构造对象的时候默认调用父类的无参构造方法
public Animal(){
System.out.println("我是父类的无参构造方法");
}
public Animal(String name,int month){
System.out.println("我是父类的带参构造方法");
}
/**
* 子类构造默认调用父类的无参构造方法
* 可以通过super()调用父类允许被访问的其他构造方法
*super()必须放在子类构造方法有效代码第一行
*/
public Cat(String name,int month){
super(name,month);//通过super关键字调用指定的父类的带参构造方法,因为首先调用Cat类的构造方法,Cat类的构造方法默认调用的是父类的无参构造方法,super指定调用父类的构造方法,而不一定就是无参构造方法
System.out.println("我是子类的带参构造");
//这是的对象实例化,调用的不是Cat类的构造方法,因为子类构造默认调用父类的无参构造方法,所以在继承里面,调用的是父类的构造方法
//这个对象实例化调用Cat类的构造方法,然后调用的是默认的父类的无参构造方法,super就指定调用了哪个父类构造方法
Cat three = new Cat("花花",2);
}
//并不是因为有“new Cat("花花",2)”才调用的是有参的构造方法
//事情是这样的,往下看
//其实它调用的是Cat类的有参构造方法,如果里面没参数就调用的是Cat类的无参构造方法
//无论调用的Cat类的哪个类型的构造方法,都会默认继承父类的无参构造方法
//也就是说,无论调用的什么,都是调用父类无参构造方法
//而super()就指定了要调用父类哪个构造方法,括号里面放上参数就调用有参构造方法
//就不一定调用父类的无参构造方法
//super()必须放在第一行,
super和this一样,都不能在静态方法里面使用
super和this不能用在一个方法里面
super和this比较
构造方法调用时,super和this不能同时出现
this:
- 访问当前类的成员方法
- 访问当前类的成员属性
- 访问当前类的构造方法
- 不能在静态方法中使用
super:
- 访问父类的成员方法
- 访问父类的成员属性
- 访问父类的构造方法
- 不能在静态方法中使用
继承后的初始化顺序
父类静态成员→子类静态成员→父类对象构造(属性、构造代码块、构造方法)→子类对象构造