继承
1、继承的格式
-
通过extends关键字可以实现继承
-
子类可以通过继承获取父类的属性和方法、也可以自定义自己独有的方法和属性。
-
继承单一性:一个子类只能有一个父类(1个儿子只能有一个父亲)
public class Father { String name; char sex; int age; public void show(){ System.out.println("我是父类的方法!"); } } //子类 public class Son extends Father{ public void run(){ System.out.println("我是子类独有的方法!"); } } //测试类 public class Test { public static void main(String[] args) { Son son = new Son(); son.show();//使用的父类方法 son.run();//使用的是子类方法 } }
子类拥有父类的属性和方法
2、继承中的构造方法
-
子类的构造方法必须通过super关键字调用父类的构造方法,目的是为了初始化成员变量。
super关键字代表父类对象,可以使用super直接使用父类的属性和方法。注意是调用父类并不会新生成一个父类对象,super关键字必须写在构造方法的第一行。
//父类 public class Father { String name; char sex; int age; public Father(int a){ System.out.println("我是父类的有参构造方法"); } public void show(){ System.out.println("我是父类的方法!"); } } //子类 public class Son extends Father{ public Son(){ super(1);//调用父类的有参构造方法 //如果没有写会系统会默认添加一个super();调用父类的无惨构造方法。 System.out.println("我是子类的无惨构造方法"); } public void run(){ System.out.println("我是子类独有的方法!"); } } //测试类 public static void main(String[] args) { Son son = new Son();//调用子类的无惨构造方法 }
3、父类的引用指向子类的对象(向上造型)
-
父类的引用可以指向子类的对象,也叫做子类对象向上造型为父类对象。
-
当父类的引用指向子类对象时,父类的引用只能访问父类的对象和方属性和方法。
4、重写
- 方法的重写:指的是在继承关系中,子类可以重新(覆盖)父类中定义的方法,达到实现自己独有的功能目的。
- 当子类重写的父类方法被引用的对象,调用的方法就是该对象的方法。
- 可以使用super()关键字调用父类的方法
public static void main(String[] args) {
Father father1 = new Father();//父类引用父类对象
Father father2 = new Son();//父类引用子类对象
Son son = new Son();//子类引用子类对象
father1.show();//调用的父类的方法
father2.show();//调用的是子类的重写方法
son.show();//调用的是子类的重写方法
}
-
重写和重载的区别
重载:
发生在编译期 方法名相同,但参数列表不同
调用时根据方法名和参数列表去判断
重写:
发生在运行期
前提是:存在继承关系中,子类定义的方法和父类的“完全一致”。(子类的方法修饰符权限必须比父类小)
调用时根据引用指向的对象类型去判断
案例:
1.有一个图形类(Graph),有计算面积和周长的方法。
2.一个圆类(Circle),继承图形类重写面积和周长的方法。
3.一个长方形类(Sqyare),继承图形类重写面积和周长的方法。
//图形类
public class Graph {
public Graph(){
}
//计算面积方法
public double area(){
System.out.println("area");
return 0;
}
//计算周长
public double perimeter(){
System.out.println("perimeter");
return 0;
}
}
//圆类
public class Circle extends Graph{//继承图形类
double r;//半径
public Circle(double r){
this.r = r;
}
//重新面积方法,计算圆面积
public double area(){
return 3.14 * this.r * this.r;
}
//重新周长方法,计算圆周长
public double perimeter(){
return 3.14 * 2 * this.r;
}
}
//长方形类
public class Square extends Graph{//继承图类
double length;//长
double width;//宽
public Square(double length,double width){
this.length = length;
this.width = width;
}
//重写面积方法,计算长方形面积
public double area(){
return length * width;
}
//重写周长方法,计算长方形周长
public double perimeter(){
return (2 * length) + (2 * width);
}
}
//测试类
public class TestGraph {
public static void main(String[] args) {
Circle circle = new Circle(3);//圆的半径为3
System.out.println("圆的面积为:" + circle.area());//28.259999999999998
System.out.println("圆的周长为:" + circle.perimeter());//18.84
Square square = new Square(10,5);
System.out.println("长方形的面积为:" + square.area());//50
System.out.println("长方形的周长为:" + square.perimeter());//30
}
}