您的位置:首页 > 其它

面向对象三大特性(封装、继承、多态)

2017-11-05 15:29 330 查看
一、封装

    1. 修饰符:
   public :公开的、公共的

       private:私有的,被private修饰的属性只能在本类中使用。

    2. 封装的要求:
a. 将属性私有化:private
b. 对私有的属性提供公开的get/set方法:
获取属性值: get属性名()  --->属性名的首字母大写
     public int getAge(){
return this.age;//age


            设置属性的值:set属性名(形参) ----》属性名的首字母大写
     public void setAge(int age){
this.age=age;


       c. 使用
         获取属性数据:s1.getAge();
为属性赋值:  s1.setAge(12);

二、继承

         水杯     是一种  容器
碳素笔   是一种  笔
狗       是一种  动物
A         is-a      B
1. 概念:【理解】
   ① 继承体现的是类之间的"is-a"关系。
           A  is  a   B
   A  继承    B     ====> A 是子类;B是父类
   ② 继承是一种机制,通过这种机制可以让子类使用父类中的属性和方法。
   ③ 继承不能强制使用,继承是本身存在一种"is-a"关系,不是人为、
      刻意创造。
2. 继承的好处:
    体现代码的可复用行、扩展性。
3. 方法的覆盖(override/重写)【面试+开发重点】
   ① 概念:子类中定义了和父类相同的方法。
   ② 要求:
         a. 子类中方法名、形参列表、返回值类型和父类相同
b. 子类中的访问修饰符合父类相同或是比父类更宽。
   ③ 使用:子类引用.方法名(实参);//子类中的方法优先被调用
   ④ 注意:

             a. 方法名、形参列表一样,返回值不同,这种情况下编译报错。

             b. 方法名、返回值类型一样;参数列表不同,这种情况下编译、运行

                都可以,是一种重载。

       ⑤ 应用场景:当父类中的方法无法满足子类的需求时,子类覆盖父类中的方法。

    4. 父类是子类的共性抽取。【理解】
       父类中的信息是一般的、抽象的;
   子类中的信息是特殊的、具体的。

    5. Java的继承特点:【理解+面试重点】
Java中的类之间是单继承关系,即一个类只能有有一个直接的父类;
但是可以采用多级继承,即可以有多个间接父类。

    6. 子类可以继承父类中那些哪容???【理解+面试重点】
    ① 构造方法不能被继承。
   原因:a. 构造方法的方法名必须和类名一致;
         b. 子类中有更多的属性和方法,所有构造过程相对复杂,
     所以父类的构造方法不足以满足子类,所以子类必须
定义自己的构造方法。
    ② 属性/成员方法取决于访问修饰符。

                          本类     同包     不同包的子类    其他(不同包下的非子类)
private :私有的       OK 
[default]:默认的       OK      OK
protected:受保护的     OK      OK          OK
public : 公开的       OK      OK          OK                OK

注意:a. 4 个访问修饰符都可以修饰属性、成员方法、构造方法
      b. 只有public / default可以修饰类
  
    总结:
                         继承(属性/成员方法)
private(私有的)
        不能被继承

                [default](默认的)      同包子类可以继承

                protected(受保护的)       可以被继承

                public (公开的)           可以被继承

7. 对象的创建过程:【理解】

        ① 分配空间(子类+所有的父类):给属性赋默认值

        ② 递归的构造父类对象(初始化父类属性--》调用父类的构造方法)

        ③ 初始化子类的属性

        ④ 调用子类的构造方法

8. super的应用【开发应用重点】

        ① 第一种用法:super()
   super()/super(实参):用在子类的构造方法中,代表创建子类
        对象时,先去创建父类对象,指定创建父类对象时调用父类
的哪一个构造方法。

注意:a.super()用在构造方法中第一行有效语句。
      b.如果构造方法中第一行没有super()/super(实参)/this()
    JVM会默认添加一个super();
  c. 一个构造方法中 this()/this(实参)不能和
     super()/super(实参)同时应用。
  d. 如果构造方法的第一行是this()/this(实参),JVM会放弃在

                         当前构造方法中查找super,从而转向this()所指向的构造方
法去查找super().
 
② super的第二种用法:super.

            super.属性 /super.方法名(实参):代表在子类中调用父类中的属性或是成员方法;
     

            注意: super. 可以用在子类中的成员方法、构造方法中。

            super.属性名 :代表访问父类中属性  

            super.方法名(实参):代表访问父类中成员方法

eg:

package demo20171030;

/**

 * 员工薪资

 * 

 *

 */

public class Question_06 {
public static void main(String[] args) {
Employee[] em = { new SalariedEmployee("张一", 6, 1000), new HourlyEmployee("张二", 6, 12, 2000),
new SalesEmployee("张三", 6, 30000, 0.5), new BasePlusSalesEmployee("张四", 6, 40000, 0.5, 2000) };
// 强转
SalariedEmployee sa = (SalariedEmployee) em[0];
HourlyEmployee ho = (HourlyEmployee) em[1];
SalesEmployee sal = (SalesEmployee) em[2];
BasePlusSalesEmployee ba = (BasePlusSalesEmployee) em[3];
// SalariedEmployee sa = new SalariedEmployee("张一", 6, 1000);
System.out.println("~~~~~~~~~~~~~~~~~~张一的基本信息和薪资~~~~~~~~~~~~~~~~~~");
System.out.println("姓名:" + sa.getName() + "\n" + "出生月份:" + sa.getMonth() + "月" + "\n" + "薪资:" + sa.getSalary(10)+"\n"+"加班费:"+sa.jiaBan());
// HourlyEmployee ho = new HourlyEmployee("张二", 6, 12, 2000);
System.out.println("~~~~~~~~~~~~~~~~~~张二的基本信息和薪资~~~~~~~~~~~~~~~~~~");
System.out.println("姓名:" + ho.getName() + "\n" + "出生月份:" + ho.getMonth() + "月" + "\n" + "工作小时:" + ho.getHours()+ "小时" + "\n" + "薪资:" + ho.getSalary(10));
// SalesEmployee sal = new SalesEmployee("张三", 6, 30000, 0.5);
System.out.println("~~~~~~~~~~~~~~~~~~张三的基本信息和薪资~~~~~~~~~~~~~~~~~~");
System.out.println("姓名:" + sal.getName() + "\n" + "出生月份:" + sal.getMonth() + "月" + "\n" + "月销售额:"+ sal.get
b75b
Sales() + "\n" + "提成率:" + sal.getRate() + "\n" + "薪资:" + sal.getSalary(10));
// BasePlusSalesEmployee ba = new BasePlusSalesEmployee("张四", 6, 40000,// 0.5, 2000);
System.out.println("~~~~~~~~~~~~~~~~~~张四的基本信息和薪资~~~~~~~~~~~~~~~~~~");
System.out.println("姓名:" + ba.getName() + "\n" + "出生月份:" + ba.getMonth() + "月" + "\n" + "月销售额:" + ba.getSales()+ "\n" + "提成率:" + ba.getRate() + "\n" + "底薪:" + ba.getBaseSalary() + "\n" + "薪资:" + ba.getSalary(10)+"\n"+"加班费:"+ba.jiaBan());
    System.out.println("~~~~~~~~~~~~~~~~~~本月公司总共发放的加班费~~~~~~~~~~~~~~~~~~");
    System.out.println("总计:"+(sa.jiaBan()+ba.jiaBan())+"元");
}

}

// 员工

class Employee {
private String name;
private int month;

// 构造方法
public Employee() {
}

public Employee(String name, int month) {
this.name = name;
this.month = month;
}

public void setName(String name) {
this.name = name;
}

public String getName() {
return this.name;
}

public void setMonth(int month) {
this.month = month;
}

public int getMonth() {
return this.month;
}

// 判断员工是否过生日
public double getSalary(int month) {
if (month == this.month) {
return 100;
} else {
return 0;
}
}

}

// 固定工资

class SalariedEmployee extends Employee implements JiaBanfei{
private double salary;

public SalariedEmployee() {
}

public SalariedEmployee(double salary) {
this.salary = salary;
}

public SalariedEmployee(String name, int month, double salary) {
super(name, month);
this.salary = salary;
}

public double getSalary() {
return salary;
}

public void setSalary(double salary) {
this.salary = salary;
}

public double getSalary(int month) {
return this.salary + super.getSalary(month);
}

public double jiaBan() {
return 2000;
}

}

// 按小时

class HourlyEmployee extends Employee {
private int hours;
private double hourlySalary;

public HourlyEmployee() {
}

public HourlyEmployee(String name, int month, int hours, double hourlySalary) {
super(name, month);
this.hours = hours;
this.hourlySalary = hourlySalary;
}

public int getHours() {
return hours;
}

public void setHours(int hours) {
this.hours = hours;
}

public double getHourlySalary() {
return hourlySalary;
}

public void setHourlySalary(double hourlySalary) {
this.hourlySalary = hourlySalary;
}

public double getSalary(int month) {
double dd;
if (hours > 160) {
dd = (hours - 160) * 1.5 * hourlySalary + 160 * hourlySalary;
} else {
dd = hours * hourlySalary;
}
return dd + super.getSalary(month);
}

}

// 销售人员

class SalesEmployee extends Employee {
private double sales;
private double rate;

public SalesEmployee() {
}

public SalesEmployee(String name, int month, double sales, double rate) {
super(name, month);
this.sales = sales;
this.rate = rate;
}

public double getSales() {
return sales;
}

public void setSales(double sales) {
this.sales = sales;
}

public double getRate() {
return rate;
}

public void setRate(double rate) {
this.rate = rate;
}

public double getSalary(int month) {
return this.sales * this.rate + super.getSalary(month);
}

}

// 有固定底薪的

class BasePlusSalesEmployee extends SalesEmployee implements JiaBanfei{
private double baseSalary;

public BasePlusSalesEmployee() {
}

public BasePlusSalesEmployee(String name, int month, double sales, double rate, double baseSalary) {
super(name, month, sales, rate);
this.baseSalary = baseSalary;
}

public double getBaseSalary() {
return baseSalary;
}

public void setBaseSalary(double baseSalary) {
this.baseSalary = baseSalary;
}

public double getSalary(int month) {
return this.baseSalary + super.getSalary(month);
}

public double jiaBan() {

return 1000;
}

}

interface JiaBanfei{                                                //定义一个接口

    public abstract double jiaBan();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: