一、继承
1.继承概念
至少有两个类,一个父类一个子类,满足is a的关系,父类不可以获取到子类的资源,子类可以获取到父类的资源。
2.继承注意点
2.1子类不能继承父类的私有资源
用private修饰的资源都只能在本类进行访问
2.2子类不能继承父类的构造方法
构造方法必须是和类名一样的,子类父类的类名不一样
但是可以进行调用,使用关键字super
2.3Java中继承是单继承的,最大的父类是Object
3.继承中访问成员变量的特点
3.1如果子类和父类的变量名重名时,优先访问子类的变量
3.2如果不重名的时候,优先访问子类的变量,如果子类没有则向上查找,一直找到Object类,如果找不到就报错
4.继承中访问成员方法亦是如此
拿以下代码为例,在fu类中我们定义并赋值了变量age为100,并且在zi类中再一次定义了变量age,实例化一个对象erzi,在最后打印出来的erzi.age为0(int类型数据的默认值)
public class Test1 {
public static void main(String[] args) {
zi erzi=new zi();
erzi.name="小绿";
System.out.println(erzi.name);
System.out.println(erzi.age);
erzi.print();
erzi.show();
erzi.showInfo("小黄");
erzi.setSe("今天没洗脸");
}
}
class fu{
String name="小红";
int age=100;
private String se;
public fu() {
System.out.println("父类无参构造已执行");
}
public fu(String name, int age, String se) {
this.name = name;
this.age = age;
this.se = se;
}
public void setSe(String se) {
this.se = se;
}
public String getSe() {
return se;
}
public void print() {
System.out.println("执行了一个方法");
}
}
class zi extends fu{
int age;
String name;
public void show(){
super.print();
System.out.println("执行了一个子类方法");
}
public void showInfo(String name){
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
二、this和super关键字
this表示的是当前对象的引用 super表示的是当前对象父类的引用
this和super的区别
1.构造方法的特点
this()表示调用自身的构造方法, super()调用的是父类的构造方法。根据括号里面是否有参判断调用的是无参构造还是有参构造,this()或者super()都只能写在调用函数的第一句并且只能同时存在一个
2.访问成员变量的特点
this.变量名:既可以访问自身的成员变量,也可以访问父类成员变量
super.变量名:只能访问父类的成员变量
3.访问方法的特点
this.方法名()、super.方法名()和访问成员变量一样,super只能访问父类的方法
综上:this表示既能获取子类的资源,又能获取父类的资源。super只能获取父类的资源
三、方法重写
1.方法重载:同一个类、方法名相同、形参列表不同和访问修饰符以及返回值无关
2.方法重写:继承中、方法名相同、参数列表相同、与修饰符和返回值有关
3.@override 用于检验方法是否重写
4.方法重写的场景:子类需要在父类方法的基础上进行扩展就需要使用重写
四、继承中访问构造方法的特点
1.如果子类没有调用父类的构造方法,则会默认执行父类的无参构造
2.如果子类调用了父类的有参构造,则不会执行父类的无参构造
3.如果父类只有有参构造,则子类必须调用父类的有参构造,所以在定义类中一般定义无参和有参两个构造方法
五、访问修饰符
六、final
final修饰成员
1.修饰类:使用final修饰的类是不能被继承的
2.修饰方法:使final修饰的方法不能被重写的,但是可以重载的
public class Test3 {
public static void main(String[] args) {
print(11);
print("小黑");
}
public static final void print(int num) {
System.out.println(num);
}
public static final void print(String name){
System.out.println(name);
}
}
3.变量
使用final修饰的成员变量在声明是就要进行赋值,只能赋一次值
使用final修饰的局部变量只能赋值一次,可以不用在声明时就进行赋值
注意点:
使用final修饰引用数据类型对象 不能改变的是地址值,可以改变对象的属性值