一(继承)
继承的含义:就是抽取子类的共性,子类继承父类,就具备了父类的非私有属性和行为
实现继承的语法格式:通过extends关键字实现,格式: class 子类 extends 父类
注意:类与类之间只能实现单继承,就例如:你只能有一个亲生父亲一样!!!
继承的好处:
1.提高了代码的复用性(多个类里边,如果有相同的成员变量或方法,则可以将这些相同的放 到同一个类中,该类就是父类,子类再使用extends继承该父类即可)
2.提高了代码的维护性(如果方法的代码需要修改,只需要去父类中修改方法即可)
继承的弊端:
继承让类与类之间产生父子关系,当父类发生变化时,子类实现也不得不跟着改变,
削弱了子类的独立性
继承中的成员访问的特点
1.继承中成员变量访问的特点:
在子类方法中访问一个变量,采用的是就近原则
1.1子类局部范围找
1.2子类成员范围找
1.3父类成员范围找
1.4如果上述三个都没有则报错(不考虑父类的父类)
package day09;
public class Demo1 {
public static void main(String[] args) {
B b=new B();
b.test();//输出的是test方法中的局部变量int age=40;
b.show();
//当子类方法与父类方法相同时:sayHi在子类父类中都定义了
b.sayHi(); //b是子对象,sayHi方法最终调用的是子类的方法
A a=new A();
a.sayHi();//a是父对象,sayHi方法最终调用的是父类的方法
// b.hello();???b中没有这个方法,a中也没有这个方法,所以报错!
}
}
class A{
int age=20;
public void show(){
System.out.println("A的show方法");
}
public void sayHi(){
System.out.println("A的sayHi方法");
}
}
class B extends A{
int age=30;
public void test(){
int age=40;
System.out.println(age);
}
@Override
public void sayHi(){
System.out.println("B的sayHi方法");
}
}
2.继承中成员方法访问的特点:
通过子类对象访问一个方法
2.1子类成员范围找
2.2父类成员范围找
2.3如果上述都没有则报错(不考虑父类的父类)
3.继承中构造方法的访问特点:
3.1当类中没有手动添加构造方法的时候,自动生成一个无参构造;若手动添加了构造方法,则不会默认生成无参构造。
3.2在创建子类对象时,需要调用父类的构造方法
(1.父类的构造方法用来初始化父类的成员变量。2.子类可以使用父类的成员变量,所以需要调用父类的构造方法)。
3.3子类中如果没有手动添加调用父类的哪个构造,默认调用的父类的无参构造
方法1.在父类中给自己提供一个无参构造(最优!!!)
方法2.通过使用super关键字去调用父类的有参构造
4.什么时候用继承?(继承的好处)
在开发中,通常,如果多种类型具有共同的属性和方法时,我们可以将这些
属性和方法抽离出来形成一个父类。然后让这些类型去继承这个父类
所有的子类,可以在父类的基础上进行扩展,相当于是父类的延伸
当父类和子类有相同的方法时,会将父类的方法覆盖掉,不会执行父类的方法,会执行自己的方法(方法的覆盖|方法的重写)
属性可以被继承: 如果定义一个和父类同名的属性,那么在调用的时候,是自己的属性,而不是父类的;若没有自己的属性,则直接使用老爸的.
方法也可以被继承: 如果定义一个和父类同名的方法,那么在调用的时候,是自己的方法,而不是父类的;若没有自己的方法,则直接使用老爸的.
5. 构造器是不能继承的!!!!!!!!!!!!!!!!!!
二( super和this关键字)
2.1 this和super的意义
this:代表本类对象的引用
super:代表父类存储空间的标识(可以理解为父类对象的引用)
2.2this和super的使用:
成员变量:
this.变量名-----表示访问本类的成员变量
super.变量名----表示访问父类的成员变量
成员方法:
this.方法名----表示访问本类的成员方法
super.方法名----表示访问父类的成员方法
构造方法:
this(有参写参) ---访问本类的构造方法
super(有参写参)---访问父类的构造方法
注意:当成员变量的名字与局部变量的名字冲突,则使用this关键字来区分成员变量和局部变量。 变量名没有冲突,则不需考虑加this super。
在创建子类对象时,都会默认先调用父类的无参构造器。在子类的所有构造器的第一行默 认的都会有super();
当在子类中需要调用父类的属性和方法时,可以使用super关键字
package day09;
public class Demo3{
public static void main(String[] args) {
Eoo e=new Eoo() ;
e.test();
}
}
class Foo{
String name="波多野结衣";
int age=20;//成员变量
public Foo(){
this("",0);//调用当前类的传两个参的构造方法
}
public Foo(String name,int age){//这里的age name是局部变量
//当成员变量的名字与局部变量的名字冲突了
//则使用this关键字来区分成员变量和局部变量
//this.成员变量---访问本类成员变量
//成员变量name=局部变量name
this.name=name;
//成员变量age=局部变量age
this.age=age;
}
public void sayHi(){
System.out.println("Foo的sayHi");
}
}
class Eoo extends Foo{
int age=30;
public Eoo(){
super("",10);//调用父类的传两个参的构造
}
public void test(){
int age=40;
/*
变量名冲突,才需要通过this super来区分不同地方的变量
*/
System.out.println("局部变量age"+age);//输出的局部变量age=40
System.out.println("Eoo的成员变量age"+this.age);//输出的是当前类的成员变量age=30
System.out.println("Foo的成员变量age"+super.age);//输出的是父类的成员变量age=20
//变量名没有冲突,则不需考虑加this super
System.out.println("Foo的成员变量name:"+name);
//方法命名冲突情况下需要加this和super做区分
System.out.println("this.sayHi()");
this.sayHi();//表示访问本类的成员方法
System.out.println("super.sayHi()");
super.sayHi();//表示访问父类的成员方法
}
@Override
public void sayHi(){
System.out.println("Eoo的sayHi");
}
}