面向对象编程:封装、继承和多态
《一》封装:
- 封装是什么:就是隐藏实现细节,将属性私有化。
- 为什么要用封装:为了不让外界随意修改或访问该类的属性,对属性进行私有化(private),从而隐藏细节。
- 封装的实现方式:私有的属性+公共的方法get/set方法。
- 封装的好处;增加了数据访问的限制,加强了程序的维护性和灵活性。
构造方法:
1.构造方法的规则:
public 类名(【参数】){
给属性赋值;
}
2.构造方法的意义:
构造方法用于创建对象的;使用new关键字来进行调用
作用:初始化工作。
3.默认的构造方法:任何一给类都有一给默认的无参构造方法。
《二》方法的重载
概念:在一个类中,如果多个方法满足“名同参不同”的关****系,则称为方法的重载。**
《三》继承extends:
1.继承的概念:
子类具有父类的一般特性(属性+方法),以及自身的特殊的特性。
****2.继承的实现:使用extends关键字
class 子类名 extends 父类名 {
}
3.Java继承的特点:
(1)Java只支持单继承。
(2)构造方法不参与继承。
(3)父类私有的东西不继承。
(4)Object类是所有类的顶层父类,所有类都直接或者间接继承他。
4.super关键字:
(1)可以理解为父类的一给引用。
(2)访问父类的成员变量:super.成员变量名。
(3)访问父类的成员方法:super.成员方法名。
(4)访问父类的构造方法:super()。
(5)所有类的构造方法的第一行式super()。
5.继承的优缺点:
继承的好处
a:提高了代码的复用性
b:提高了代码的维护性
c:让类与类之间产生了关系,是多态的前提
继承的弊端
类的耦合性增强了。
开发的原则:高内聚,低耦合。
耦合:类与类的关系
内聚:就是自己完成某件事情的能力
《四》 方法的重写
(1)概念:在子类方法中方法的名称,参数,返回值类型都和父类一样,但实现不同。
(2)注意事项:
a.方法的重写中,访问修饰可以被放大但不能被缩小。
public>protected>默认>private
b.被final修饰的方法子类不能重写。
《五》多态
1、多态的概念:
多态既多种形态,指的是同一个接口(父类),使用不同的实例(子类)而执行不同的操作。
2、为什么需要多态?扩展性
使用多态之后,当需要增加新的子类类型时,无需更改父类,程序的可扩展性及可维护性增强
3、多态的表现形式
第一种:
父类 对象=new 子类();
对象.方法(); ----------->会调用子类重写的方法
第二种:
定义方法(父类)-------->调用方法(子类);
方法中就会调用子类重写的方法
《六》 封装,继承,多态的练习
1、继承练习:计算图形的周长和面积
//父类图形
public class Shape {
public double getPerimeter() {
return 0;
}
public double getArea() {
return 0;
}
}
//子类矩形
public class Squre extends Shape {
private double width;
private double height;
public Squre(double width, double height) {
this.width = width;
this.height = height;
}
public double getPerimeter() {
return (width + height) * 2;
}
public double getArea() {
return width * height;
}
}
//子类圆
public class Circle extends Shape {
private double r;
public Circle( double r) {
this.r=r;
}
public double getPerimeter() {
double zhouchang;
zhouchang=2*3.14*r*r;
return zhouchang;
}
public double getArea() {
double mianji;
mianji=2*3.14*r;
return mianji;
}
}
//测试类
public class Test {
public static void main(String[] args) {
Squre s=new Squre(3,4);
System.out.println("周长是:"+s.getPerimeter()+"\n"+"面积是:"+s.getArea());
Circle c=new Circle(3.2);
System.out.println("圆周长是:"+c.getPerimeter()+"\n"+"面积是:"+c.getArea());
}
}