面向对象特征之二:继承:
1.作用:
- 代码量更少
- 功能拓展
- 为之后多态的使用提供了前提
2.继承的格式:class A extends B{}
A:子类、派生类、subclass
B:父类、超类、基类、superclass
3.体现:
- 一旦子类继承父类以后,子类中就获取了父类B中声明的所有属性和方法
特别的:父类中声明为private的属性和方法,子类继承父类以后,仍然认为获取了父类中私有的结构。只是因为封装性的影响,使得子类不能直接调用父类的结构而已。
- 子类继承父类以后,还可以声明自己特有的属性和方法,实现功能的拓展。子类和父类的关系,不同于子集和集合的关系。
extends:延展、拓展
4.Java中关于继承性的规定:
- 一个类可以被多个子类继承;
- Java中的类单继承性,一个类只能有一个父类;
- 子父类是相对的概念;
- 子类直接继承的父类,称为直接父类;间接继承的父类称为间接父类;
- 子类继承父类以后,就获取了直接父类以及所有间接父类中声明的属性和方法
5.关于java.lang.Object类:
- 如果我们没有显示的声明一个类的父类的话,则此类继承于java.lang.Object类;
- 所有的java类(除java.lang.Object类之外)都直接或者间接的继承与java.lang.Object类
- 意味着,所有的java类具有java.lang.Object类声明的功能。
package com.myobjectoriented2.nonworking;
//extends: 继承
public class Person20 {
private String name;//名字
int age;//年龄
public Person20() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
//System.out.println("名字是:"+name);
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package com.myobjectoriented2.nonworking;
public class Man extends Person20 {
String sex;//性别
public void getsex(String sex) {
this.sex=sex;
}
}
package com.myobjectoriented2.nonworking;
public class Person20test {
public static void main(String[] args) {
Person20 p1=new Person20();
Person20 p2=new Person20();
// p1.name="a";
p1.age=20;
Man man=new Man();
man.setName("zhou");
System.out.println(man.getName());
man.age=20;
System.out.println(man.getAge());
}
}
package com.myobjectoriented2.nonworking;
public class Person21 {
private String name;
private char sex;
private int age;
public Person21(String name, char sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public Person21() {
}
public String toString() {
return name;
}
}
package com.myobjectoriented2.nonworking;
public class Student extends Person21{
private long number;
int math;
int englishi;
int computer;
public Student(String name, char sex, int age, long number, int math, int englishi, int computer) {//继承了Person21的构造器添加属性
super(name, sex, age);
this.number = number;
this.math = math;
this.englishi = englishi;
this.computer = computer;
}
public double aver() {
return(math+englishi+computer)/3;
}
}
package com.myobjectoriented2.nonworking;
public class Studenttest {
public static void main(String[] args) {
Student stu1=new Student("zhou",'男', 25, 15623, 80, 60, 75);//调用Person21的构造器添加属性
System.out.println(stu1.aver());
System.out.println(stu1.toString());//调用Person21的方法
}
}
package com.myobjectoriented2.nonworking;
/**
*
* @Desciption
* @author Abraham
* @email 1290807550@qq.com
* @version JDK1.8
* @date 2021年3月27日上午10:40:44
*/
public class Circle {//圆
private double radius;
public Circle() {
this.radius = 1;
}
public void setRadius(double radius) {
this.radius =radius;
}
public double getRadius() {
return this.radius;
}
public double findArea() {
return Math.PI*radius*radius;
}
}
package com.myobjectoriented2.nonworking;
public class Cylinder extends Circle {//圆柱
private double length;
public Cylinder() {
this.length = 1;
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
public double findVolume() {
return this.findArea()*length;
}
}
package com.myobjectoriented2.nonworking;
public class Cylindertest {//测试类
public static void main(String[] args) {
Cylinder cylin=new Cylinder();
cylin.setRadius(2);
System.out.println(cylin.findArea());//计算底面积
cylin.setLength(3);
System.out.println(cylin.findVolume());//计算圆柱体积
}
}
不同包下的子类继承的问题:
首先,先明确权限问题:
- 不同的包下,虽然是子父类关系,但是private/default的属性和方法 都不能用了
- 但是protected 的属性和方法可以用,一般用的少。一般要么就是最小的Private,要么就是最大的public。