一、面向对象特征之一:封装性
二、面向对象特征之二:继承性
/*
* 面向对象的特征二:继承性
* 1、为什么要设计继承性?
* 2、通过"class A extends B"类实现类的继承子类:A;父类(或基类SuperClass):B
* 3、子类继承父类以后,父类中声明的属性与方法可以直接使用。
* 4、父类中的私有属性和方法也会被子类获取到,但是因为权限的问题,在子类中无法访问。
* 5、子类除了继承外,还可以再自身定义父类中没有的属性和方法。
* 6、子类是对父类功能的扩展,明确子类不是父类的子集;
* 子类只能单继承,即一个子类只能有一个父类。反之,一个父类可以有多个子类。
* */
将多个类中都有的代码,封装在一个单独的类中,用到时,直接在需要用到的类中继承即可。如图:
- Person类:
package com.atguigu.java1;
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println("吃饭");
}
}
- Student类:
package com.atguigu.java1;
public class Student extends Person{
//构造器
public Student() {
}
public Student(String name,int age) {
//此处不能用this.name=name;和this.age=age;因为在父类Person中,name与age属性都是私有的,在其子类中可以获取到父类的私有属性,但是在子类中因为权限原因,父类的私有属性不会被访问。必须用下列的调用函数方式来访问父类的私有属性。
this.setName(name);
this.setAge(age);
}
}
- Worker类:
package com.atguigu.java1;
public class Worker extends Person{
}
- 测试类(TestExtends):
package com.atguigu.java1;
/*
* 面向对象的特征二:继承性
*
* 1、为什么要设计继承性?
*
* 2、通过"class A extends B"类实现类的继承
* 子类:A;
* 父类(或基类SuperClass):B
* 3、子类继承父类以后,父类中声明的属性与方法可以直接使用。
* 4、父类中的私有属性和方法也会被子类获取到,但是因为权限的问题,在子类中无法访问。
* 5、子类除了继承外,还可以再自身定义父类中没有的属性和方法。
* 6、子类是对父类功能的扩展,明确子类不是父类的子集;
* 子类只能单继承,即一个子类只能有一个父类。反之,一个父类可以有多个子类。
* */
public class TestExtends {
public static void main(String[] args) {
Student s=new Student();
s.eat();
Worker w=new Worker();
w.eat();
Person p=new Person();
p.eat();
}
}
习题1:
1、ManKind类:
package com.atguigu.cn03;
public class ManKind {
int sex;
int salary;
public void manOrWorman() {
if(sex==1)
System.out.println("man");
if(sex==0)
System.out.println("women");
}
public void employeed() {
if(salary==0)
System.out.println("no job");
else
System.out.println("job");
}
}
2、Kids类:
package com.atguigu.cn03;
public class Kids extends ManKind{
public static void main(String[] args) {
Kids someKid=new Kids();
someKid.salary=12;
someKid.manOrWorman();
someKid.employeed();
}
int yearsOld;
public void printAge() {
System.out.println(yearsOld);
}
}
习题2:
1、Circle类:
package com.atguigu.cn03;
public class Circle {
private double radius;
public Circle() {
this.radius=1;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
//计算圆的面积
public double findArea() {
return Math.PI*radius*radius;
}
}
2、Cylinder类:
package com.atguigu.cn03;
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 Math.PI*this.getRadius()*this.getRadius()*length;
return findArea()*length;
}
}
3、测试类(test):
package com.atguigu.cn03;
public class test {
public static void main(String[] args) {
Cylinder c=new Cylinder();
double area=c.findVolume();
System.out.println(area);
c.setRadius(2.3);
c.setLength(1.2);
area=c.findVolume();
System.out.println(area);
}
}
三、重写:在子类中重写了父类的同名方法。
- 前提:有子类继承父类
- 子类继承父类以后,若父类的方法对子类不适用,那么子类可以对父类的方法重写、覆盖、覆写。
- 重写规则:1)、要求子类的“返回值类型 方法名 (参数列表)”与父类的方法一致。
2)、子类方法的修饰符不能小于父类的修饰符。
//3)、若父类方法抛异常,那么子类方法的异常类型不能大于父类的。
//4)、子父类的方法必须同为static或非static的。
重写例题:
解答:省略;
接口:一个类已经继承了一个父类,但是还想继承一个另外的很好的功能,我们可以把那个好的功能定义成接口,从而让类实现接口。