- 继承是什么?
示例:
packagejava_jicheng_demo1;
publicclassA{
//创建公开的成员变量,方法
publicStringnane;
publicintage;
publicvoidprint1(){
System.out.println("666");
}
//创建私有的成员变量,方法
privateStringInfo;
privatevoidprint2(){
System.out.println("111");
}
}
packagejava_jicheng_demo1;
publicclassBextendsA{
//创建A的子类
}
packagejava_jicheng_demo1;
publicclassText{
publicstaticvoidmain(String[]args){
//子类可以继承父类的非私有成员
Bb=newB();
System.out.println(b.age);
System.out.println(b.nane);
//System.out.println(b.Info);会报错
b.print1();
//b.print2();会报错
}
}
- 执行原理
- 使用继承的好处
使用继承:
4.继承的注意事项
- 权限修饰符
权限修饰符是什么?有啥用?
packagejava_jicheng_demo3;
publicclassF{
//创建四种权限修饰符不同的方法
publicvoidpubMe(){
System.out.println("public");
}
protectedvoidproMe(){
System.out.println("protected");
}
voidMe(){
System.out.println("缺省");
}
privatevoidpriMe(){
System.out.println("private");
}
publicvoidtest(){
pubMe();
proMe();
Me();
priMe();//同一个类下均可访问
}
}
packagejava_jicheng_demo3;
publicclassText{
publicstaticvoidmain(String[]args){
Ff=newF();
f.Me();
f.proMe();
f.pubMe();
//f.priMe();同一包下的不同类会报错
}
}
packagejava_jicheng_demo2;
importjava_jicheng_demo3.F;
publicclassF1extendsF{
F1f1=newF1();
publicvoidtest(){
f1.proMe();//不会报错
//f1.priMe();只能在F类中使用
}
}
packagejava_jicheng_demo3;
publicclassText{
publicstaticvoidmain(String[]args){
Ff=newF();
f.Me();
f.proMe();
f.pubMe();
//f.priMe();会报错
}
}
- 单继承,Object类
所有的类都直接或间接地继承了Object类
- 方法重写
例子:希望返回一个具体的对象,而不是一个地址
packagejava_jicheng_demo4;
publicclassStudent{
privateStringname;
privateintage;
publicStudent(){
}
publicStudent(Stringname,intage){
this.name=name;
this.age=age;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicStringtoString(){
return"Student["+name+","+age+"]";
}
}
packagejava_jicheng_demo4;
publicclassTest{
publicstaticvoidmain(String[]args){
Students1=newStudent("张三",19);
System.out.println(s1);
System.out.println(s1.toString());//两行代码是一样的
//想要输出具体的对象而不是地址可以对toString()方法重写
System.out.println(s1.toString());//两行代码是一样的
}
}
注意事项:
- 子类访问其他成员特点
子类中访问父类,要使用super.成员变量/方法
- 子类构造器的特点
代码:
packagejava_jicheng_demo5;
publicclassF{
publicF(){
System.out.println("F类的无参构造器执行了~~");
}
publicF(Stringname,intage){
System.out.println("F类的you参构造器执行了~~");
}
}
packagejava_jicheng_demo5;
publicclassZextendsF{
publicZ(){
System.out.println("子类的无参构造器执行了~~~");
}
publicZ(Stringname,intage){
System.out.println("子类的有参构造器执行了~~");
}
}
packagejava_jicheng_demo5;
publicclasstest{
publicstaticvoidmain(String[]args){
Zz1=newZ();
Zz2=newZ("123",14);
}
}
运行结果:
其实每次子类的构造器前都会有一个super()默认没有显示罢了
如果父类没有无参构造器,则需要自己在子类构造器之前手写super()调用父类构造器
子类构造器调用父类构造器的场景:
关于兄弟构造器:
例子:
代码:
privateintage;
privateStringschoolName;
publicStudent(){
}
publicStudent(Stringname,intage){
this(name,age,"黑马程序员");
}
publicStudent(Stringname,intage,StringschoolName){
this.name=name;
this.age=age;
this.schoolName=schoolName;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicStringgetSchoolName(){
returnschoolName;
}
publicvoidsetSchoolName(StringschoolName){
this.schoolName=schoolName;
}
}
packagejava_jicheng_demo6;
publicclasstext{
publicstaticvoidmain(String[]args){
Students1=newStudent("小李",19,"家里蹲大学");
Students2=newStudent("小黑",10);
}
}