面向对象特点

java的封装继承多态实验报告 java封装继承多态的定义_python

  1、是一种符合人们思考习惯的思想。

  2、将复杂的问题简单化。

  3、使程序员从动作的执行者变为动作的指挥者。

  4、完成指定的需求时:

            先去找具有所需功能的对象来用。

            如果该对象不存在,那么创建一个具有所需功能的对象。

            这样简化了开发并且提高了复用性。

 面向对象开发、设计、过程

 开发过程:其实就是不断的创建对象、调用对象、指挥对象做事情。

 设计过程:其实就是在管理和维护对象与对象之间的关系。

 面向对象的特性:

   继承、封装、多态、抽象也算

总结

为什么面向对象会如此流行?业界关于这个谈论的最多的是以下几点:

  1. 它能够非常好地进行代码复用
  2. 它能够非常方便地应对复杂代码
  3. 在进行程序设计时,面向对象更加符合程序员的直觉

第一点,在理论上确实成立,但实际往往却是在面向对象的大背景下,写一段便于复用的代码比面向过程背景下难多了。

第二点,你不觉得正是面向对象,才把工程变复杂的么?如果层次清晰,调用规范,无论面向对象还是面向过程,处理复杂业务都是一样好,等真的到了非常复杂的时候,对象间错综复杂的关系只会让你处理起来更加头疼,不如面向过程来得简洁。

第三点,这其实是一个障眼法,因为无论面向什么的设计,最终落实下来,还是要面向过程的,面向对象只是在处理调用关系时符合直觉,在架构设计时,理清需求是第一步,理清调用关系是第二步,理清实现过程是第三步。面向对象让你在第二步时就产生了设计完成的错觉,只有再往下落地到实现过程的时候,你才会发现第二步中都有哪些错误。 

面向对象三大特征:封装、继承、多态

        顾名思义,封:封闭,装:装起来,将具体的实现细节装到一个容器中,并封闭起来,防止容器外部直接访问容器内部的实现细节,仅公开暴露指定的访问路径;生活中的例子:到饭馆吃饭,你只需要跟服务员讲你要吃什么饭菜,服务员就会跟后台厨房的厨师说明一下,等待一段时间后,饭菜就被服务员直接递送到你面前,作为客户的你是不知道也无需知道饭菜的具体做法,后台厨房的厨师及做饭菜的过程就是被封装的细节,而服务员则是公开暴露的访问路径,你只能通过服务员点餐然后获得饭菜,而不能直接去到后台厨房要求厨师如何做饭菜;

封装的好处: 1. 隔离性。    被封装后的对象(这里的对象是泛指代码的编程单元,一般指:程序集,命名空间,类,方法,属性,变量等)其外部对象是无法直接访问对象的内部实现细节,内部实现细节的的改动不会影响到外部对象的访问原则(即:对象内部修改后,在公开暴露指定的访问路径不变的情况下,外部访问它的对象是无需修改的),这是隔离性的体现,同时也是实现高内聚,低耦合的最根本的思想之一; 2. 可复用性。    被封装后的对象可以被外部多个对象访问,而无需为每个外部对象去指定不同的服务对象;如:所有的对象的基类都是object类,object类里面的公共成员可以被其所有子类使用,Ado.Net相关的数据访问类及其公共成员均可被其它所有的对象使用等。 3. 可读性。   被封装后的对象的名称(如:程序集名,类名,方法名)如果命名恰当,那么就能在不看里面的实现细节的前提下,了解该对象的作用;如:DataTable就是用来装表格数据的;ToString就是转换为字符串,Length就是指长度等。

封装的步骤:

java的封装继承多态实验报告 java封装继承多态的定义_开发工具_02

  • 封装的目的:保护类内属性,不允许随便修改。
  • 权限修饰符:控制变量、函数等的权限范围
  • public  :  公共的,谁都可以访问;
  • private :  私有的,只有类内访问的权限;

封装一定要提供 set 和 get 的方法吗? 答: 不一定,根据需求而定。规范 : 在现实开发中一般实体类的所有成员属性(成员变量)都要封装起来。(实体类:实体类就是用于描述一类 事物的就称作为实体类。与实体类相反的就是工具类【Arrays数组】) 封装是不是会使得编码变得复杂和工作辆很大:2*成员变量? 答:eclipse 会解决这个问题,快捷键就可以搞定! 在使用eclipse写java程序中 同时按shift+Alt+s 选择Generate Getters and setters , 可以自动的写出set\get的方法 项目是由多个人去写的,所以大家做的都是封装、继承、多态!!!然后集成!!!大家是按照模块开发的。

  小练习1:

/*
*  1 一个java文件中可以有多了class ,但是只能有一个main函数
* 定义一个类
*/
class Car {    String name;
    String color;
    int wheel;    public void run() {
        if (wheel >= 4) {
            System.out.println(name+"..."+"run ...");
        } else {
            System.out.println("need to repair ...");
        }    }}class CarFactory {
    String name;
    String address;
    int tel;    //public Car repairfun(Car c) {       // 需要返回值的 
    public void repairfun(Car c) {
        if (c.wheel >4) {
            System.out.println("ok...run.... ");
            //Thread.sleep(1000);
        }
        else {
            c.wheel =4;
            System.out.println("ok...run.... ");
        }
        //return c;
    }
}public class ct_class {    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Car car1 = new Car(); // 使用car类声明了一个car1对象,car1对象指向了一个车对象
        // System.out.println(car1.name); // 一般初始化就是null
        car1.name = "BMW";
        car1.wheel=4;
        for (int i = 0; i < 100; i++) {
            car1.run();
        }
        car1.wheel=3;
        car1.run();
        
        CarFactory carFactory= new CarFactory();
        //car1=carFactory.repairfun(car1);    //  对应返回值
        
        carFactory.repairfun(car1);           //  没有返回值
        car1.run();        
    }
}

  小练习2:

class Person{
    
    /*  没有封装的版本
    String name ;
    String sex;
    int age ;
    void eat(Person person)
    {
        System.out.println("eat...");
    }
    */
    private String name ;
    private String sex;    // 封装  ------ 定义一个公共的方法设置sex属性
    public void setSex(String s) {
        if (s.equals("man") || s.equals("woman")) { // 注意: 如果比较两个字符串的内容是否一致,不要使用==比较,
                                                    // 使用equals方法。
            sex = s;
        } else {
            // 默认是男
            sex = "null";
        }
    }    // 定义一个公共的方法获取sex属性
    public String getSex() {
        return sex;
    }
    private int age ;
    private void eat(Person person)
    {
        System.out.println("eat...");
    }
}
 
public class encapsulation {    public static void main(String[] args) {
        // TODO Auto-generated method stub
        /*  没有封装的版本
        Person person1 = new Person();
        person1.age= 10;             // 对应情况     int age ;
        person1.name="DD";            // String name ;
        System.out.println(person1.name+"  "+person1.age);
        person1.eat(person1);
        */
        Person person1 = new Person();    
        person1.setSex("man");
        System.out.println("性别:"+person1.getSex());

        person1.setSex("men");
        System.out.println("性别:"+person1.getSex());
        
    }}

  小练习3:

class Car{
    
    private String name;
    private String address;
    /**
     * @return the name
     */
    public String getName() {
        return name;
    }
    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }
    /**
     * @return the address
     */
    public String getAddress() {
        return address;
    }
    /**
     * @param address the address to set
     */
    public void setAddress(String address) {
        this.address = address;
    }
}