面向对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象相关的知识,希望对你有一定的参考价值。

1 面向对象的概念

  • 面向对象就是一种常见的思想,符合人们的思考习惯。
  • 面向对象的出现,将复杂的问题简单化。
  • 面向对象的出现,让曾经在过程中的执行者,变成了对象中的指挥者。

 

  • 面向对象的开发、设计和特征
    • 开发:就是不断的创建对象,使用对象和指挥对象做事情。
    • 设计:其实就是管理和维护对象之间的关系。
    • 面向对象的特征:封装、继承和多态  

 

2 类与对象的关系

  • 我们学习编程语言,就是为了模拟现实十几节的事物,实现信息化。比如:去超市买东西的计费系统,去银行办业务的系统。
  • 我们是如何表示一个现实世界的事物呢?
    • 属性:就是该事物的描述信息。
    • 行为:就是该事物能够做什么。  
  • Java语言最基本的单位是类,所以,我们就应该把事物用一个类来表示。

 

  • 类:是一组相关属性和行为的集合。
  • 对象:是该类事物的具体体现。
  • 举例:类--学生,对象--班长。

技术分享

  • 类的定义
    • 现实世界的事物
      • 属性  人的身高,体重等。
      • 行为  人学习,吃饭等。    
  • Java中用class来描述事物也是如此。
    • 成员变量 ,就是事物的属性。
    • 成员方法 ,就是事物的行为。  
  • 定义类其实就是定义类的成员(成员变量和成员方法)。

 

  • 示例:汽车 
package java006;

/**
 * 2017/9/6
 * 说明:汽车类
 */
public class Car {
    int num;//轮胎数
    String color;//颜色

    /**
     * 运行
     */
    public void run(){
        System.out.print(num +""+color);
    }

}
package java006;

/**
 * 2017/9/6
 * 说明:
 */
public class CarTest {
    public static void main(String[] args) {
        Car car = new Car();
        car.num = 4;
        car.color = "红色";

        car.run();
    }
}
  • 成员变量和局部变量的区别
    • 在类中的位置不同
      • 成员变量定义在类中方法外。
      • 局部变量定义在方法内或者方法声明上。    
    • 在内存中的位置不同
      • 成员变量,在堆内存。
      • 局部变量,在栈内存。    
    • 生命周期不同
      • 成员变量,随着对象的存在而存在,随着对象的消失而消失。
      • 局部变量,随着方法的调用而存在,随着方法的调用完毕而消失。    
    • 初始化值不同
      • 成员变量,有默认的初始化值。
      • 局部变量,没有默认的初始化值,必须先定义,赋值,再使用。    

 

  • 解析对象的内存体现
    • 示例:  
package java006;

/**
 * 2017/9/6
 * 说明:汽车类
 */
public class Car {
    int num;//轮胎数
    String color;//颜色

    /**
     * 运行
     */
    public void run(){
        System.out.print(num +" "+color);
    }

}
package java006;

/**
 * 2017/9/6
 * 说明:
 */
public class CarTest {
    public static void main(String[] args) {
        Car car1 = new Car();
        car1.num = 4;
        car1.color = "红色";

        Car car2 = new Car();
        car2.num = 4;
        car2.color = "黑色";

        car1.run();
        car2.run();
    }
}

技术分享

 

    • 示例:  
package java006;

/**
 * 2017/9/6
 * 说明:汽车类
 */
public class Car {
    int num;//轮胎数
    String color;//颜色

    /**
     * 运行
     */
    public void run(){
        System.out.print(num +" "+color);
    }

}
package java006;

/**
 * 2017/9/6
 * 说明:
 */
public class CarTest {
    public static void main(String[] args) {
        Car car1 = new Car();
        car1.num = 4;
        car1.color = "红色";

        Car car2 = car1;

        car1.run();
        car2.run();
    }
}

技术分享

 

  • 匿名对象
    • 定义:就是没有名字的对象,是对象的一种简化表现形式。
    • 使用场景:
      • 对象调用方法仅仅一次的时候。
      • 作为实际参数传递。    
    • 示例1:  
package java006;

/**
 * 2017/9/6
 * 说明:汽车类
 */
public class Car {
    int num;//轮胎数
    String color;//颜色

    /**
     * 运行
     */
    public void run(){
        System.out.print(num +" "+color);
    }

}
package java006;

/**
 * 2017/9/6
 * 说明:
 */
public class CarTest {
    public static void main(String[] args) {
        Car car1 = new Car();


        new Car().run();
    }
}
    • 示例2:  
package java006;

/**
 * 2017/9/6
 * 说明:汽车类
 */
public class Car {
    int num;//轮胎数
    String color;//颜色

    /**
     * 运行
     */
    public void run(){
        System.out.print(num +" "+color);
    }

}
package java006;

/**
 * 2017/9/6
 * 说明:
 */
public class CarTest {
    public static void main(String[] args) {

        show(new Car());


    }
    public static void show(Car c){
        c.num = 4;
        c.color = "黑色";
        c.run();
    }
}

 

3 封装

  • 封装:是指隐藏对象的属性和实现细节,仅仅对外提供公共访问方式。
  • 封装的好处
    • 将变化隔离。
    • 便于使用。
    • 提高重用性。
    • 提高安全性。   
  • 封装的原则:
    • 将不需要对外提供的内容都隐藏起来。
    • 把属性都隐藏,提供公共方法对其访问。  

 

  • 示例:
package java006;

/**
 * 2017/9/6
 * 说明:人类
 */
public class Person {
    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age > 0 && age <=200){
            this.age = age;
        }

    }

    public void speak(){
        System.out.print("我的年龄是:"+age);
    }

}
package java006;

/**
 * 2017/9/6
 * 说明:
 */
public class PersonTest {
    public static void main(String[] args) {
        Person p = new Person();
        p.setAge(-1);
        p.speak();
    }

}

 

4 构造函数

  • 特点:
    • 函数名和类名相同。
    • 不用定义返回值类型,连void都没有。
    • 没有具体的返回值。  
  • 作用:
    • 给对象进行初始化。 
  • 注意
    • 如果你不提供构造方法,系统会给出默认的构造方法。
    • 如果你提供了构造方法,系统就不会再提供。
    • 构造方法时可以重载的。  

 

  • 示例:
package java006;

/**
 * 2017/9/6
 * 说明:人类
 */
public class Person {
    private int age;
    private String name;

    public Person(){

    }

    public Person(String name,int age){
        this.setName(name);
        this.setAge(age);
    }


    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age > 0 && age <=200){
            this.age = age;
        }

    }

    public void speak(){
        System.out.print("我的姓名是:"+this.name+"我的年龄是:"+age);
    }

}
package java006;

/**
 * 2017/9/6
 * 说明:
 */
public class PersonTest {
    public static void main(String[] args) {
        Person p = new Person("张三",26);
        p.speak();
    }

}

 

  • 构造函数和一般函数有什么区别
      • 构造函数:创建对象的时候,就会调用与之对应的构造函数,对对象进行初始化。
      • 一般函数:对象创建完毕,需要函数功能的时候才会调用。    
      • 构造函数:对象创建的时候,会调用并且只调用一次。
      • 一般函数:对象创建后,可以被调用多次。    

 

5 this关键字

  •  this代表其所在函数所属对象的引用。话句话说,this代表的是本类对象的引用。

 

  • 什么时候使用this关键字呢?
    • 当在函数内需要用到调用该函数的对象的时候,就用this。
    • 注意的是,方法被那个对象调用,this就代表那个对象。  

 

  • 示例:
package java006;

public class Person {
    private String name;
    private int age;
    
    public Person(String name,int age) {
        this.name = name;
        this.age = 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 speak() {
        System.out.println(name+" "+age);
    }

    
    

}
package java006;

public class PersonTest {
    public static void main(String[] args) {
        Person p = new Person("哈哈",23);
        p.speak();
        
        Person p2 = new Person("呵呵",29);
        p2.speak();
        
    }
}

技术分享

 

6 static关键字

  • static关键字,用于修饰成员(成员变量和成员函数)。
  • 被修饰的成员具备以下的特点:
    • ①随着类的加载而加载。
    • ②优先于对象存在。
    • ③被所有对象所共享。
    • ④可以直接被类名调用。   
  • 注意事项
    • ①静态方法只能访问静态成员。
    • ②静态方法不可以写this,super关键字。
    • ③主函数是静态的。  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7 单例设计模式

 

以上是关于面向对象的主要内容,如果未能解决你的问题,请参考以下文章

面向面试编程代码片段之GC

PHP面向对象之选择工厂和更新工厂

Java中面向对象的三大特性之封装

python之路之前没搞明白4面向对象(封装)

Scala的面向对象与函数编程

Python面向对象学习之八,装饰器