一、继承关系成员的访问
(一)继承中构造方法的关系
1.概述
父类的构造方法子类不能够继承,只能调用父类的构造方法
子类会继承父类中的数据(成员变量),可能还会使用父类的数据。所以子类初始化对象之前- -定要先完成父类数据的初始化.子类是如何初始化从父类中继承过来的数据呢?
每一个子类构造方法的第一- 条语句默认都是: super() 表示访问父类的空参构造,父类继承过来成员都赋的事默认值
每创建一一个子类对象,都会调用父类的构造方法,目的就是为了初始化父类那部分成员变量的.我们每次创建子类自己没有显示的调用父类的构造方法,其实是系统默认在子类构造方法第一句,加了:super()调用的是父类的空参构造.
注意:
1、子类中所有的构造方法默认都会访问父类中无参的构造方法.
2、子类的构造方法中手动调用父类的其他构造,就不会默认访问父类的无参构造.
3、如果在子类构造方法中,手动调用父类构造方法,必须写在子类构造方法的第一条语句.
4.子类调用父类构造方法的格式: super([实参]);
public class Fu {
public String name;
public int age;
public Fu(){
System.out.println("Fu... 空参构造");
}
public Fu(String name,int age){
this.name = name;
this.age = age;
System.out.println("fu...有参构造执行了");
}
}
public class Zi extends Fu {
public String sex;
public Zi(){
System.out.println("Zi...空参构造");
}
public Zi(String name,int age,String sex){
super(name, age);
this.sex = sex;
System.out.println("Zi.....有参构造");
}
}
public class UseZi {
public static void main(String[] args) {
Zi z = new Zi();
Zi z1 = new Zi("张三",18,"男");
}
}
this和super调用构造方法区别:
this也可以访问构造方法,但是只能访问本类的构造方法.格式:this([实参])
super也可以访问构造方法,但是只能访问父类的构造方法.格式: super([实参])
1. this语句和super语句不能同时出现. this语句和super语句都必须出现构造方法的第一-行
2.一个构造方法无论手动显示调用this语句还是super语句,系统都不在添加:super()
3.不要写出this语句的循环调用
public class Fu {
public String name;
public int age;
public Fu(){
System.out.println("Fu... 空参构造");
}
}
public class Zi extends Fu{
public String sex;
public Zi(){
//this("男");
System.out.println("Zi...空参构造");
}
public Zi(String sex){
this();
//super();
this.sex = sex;
System.out.println("Zi...有参构造");
}
}
public class UseZi {
public static void main(String[] args) {
Zi z = new Zi("男");
}
}
this&super的使用总结(简答题)
成员变量:
-this.成员变量一既可以访问本类成员变量,也可以访问父类的
-super .成员变量一只能访问父类成员变量
成员方法:
-this.成员方法一既可以访问本类成员方法,也可以访问父类的
-super .成员方法一访问父类成员方法
构造方法:
-this(_)一 访问本类构造方法 this( )
-super(_) -访问父类构造方法 super()
2.继承的注意事项
1)、私有的成员不能被继承(不能被直接访问)
①.父类中有一一些私有成员,不能在子类中直接使用
②.其实在子类对象中,仍然包含了父类中定义的私有成员变量
③.只不过在子类中,不能直接访问父类中定义的私有成员变量,只能通过setter和getter方法操作
2)、父类中的构造方法,不能继承
原因:父类的构造方法需要和父类的类名-致、子类的构造方法需要和子类类名-致,父类和子类的类名不一样。因此无法继承,名称有冲突。Zi z= new Fu();编译报错
父类的构造方法用于给父类的成员变量赋值,子类的构造方法用于给子类的成员变量赋值,子类的成员变量较多,使用父类的构造方法无法将子类中所有的成员变量都进行赋值,因此不继承父类的构造方法.
解决:子类不继承父类的构造,但是可以[调用]父类的构造方法。super(实参)语句.
3.java语言中继承的特点
1)、java支持单继承,不支持多继承,java支持多层继承
单继承: -一个子类只能继承一个父类(-个孩子只能有生物学上的亲爹)
不能多继承:一个子类不能同时继承多个父类
可以多层继承: A类可以继承B类,B类可以继承C类,A类中拥有B、C类中的所有属性和方法。
ctrl+h:查看一一个类的体系结构
说明:越是顶层的类,定义的功能越是共性功能,功能和属性就越少;越是底层的类,定义的特有功能和属性就越多,就更加强大。学习一个体系结构的时候,先学顶层的类,共性功能学习完,学习底层特有的方法即可;使用一个类创建对象的时候,选择底层的类型,功能更多更强大。
Object类是java中根类(基类),所有java类要么直接继承Object,要么间接的继承自0bject.
如果我们定义一个类没有显示指明父类是谁默认它的父类就是0bject
2、不能多继承原因:
如果支持多继承,那么可能一一个子类继承了两个父类,两个父类中有相同的方法声明,却拥有不同的方法实现。子类继承之后,就不知道该走哪个父类的方法实现了。 (安全隐患)
单继承性如下图:
多层继承如下图:
二,final关键字
1.概述
final是一个关键字最终的意思主要 用来修饰java资源的。
被他修饰的元素变成了最终元素,不能修改。
可以修饰变量方法类
变量:
最终变量-----变量不能改变 [ 变相的成为了常量] 这就 是所谓的常量符号
特点:
最终变量只能赋值- -次
值不可改变
常量符号命名规范:全部大写,多个单词之间使用下划线连接
方法:
最终方法-----方法不能被改变[功能就定死]
场景:父子之间,如果父类的方法不想被子类重写,就可以使用final修饰父类的方法
特点:
最终方法不可以被重写,可以被继承
类:
最终类不能改变
场景:如果-一个类你不想让他拥有子类,在定义这个类的时候使用final修饰即可
特点:不能 被继承
public class Animal {
public final void eat(){
System.out.println("吃");
}
}
public class Dog extends Animal {
/* public final void eat(){
System.out.println("chi");
}*/
}