面向对象与static详解

2019-03-15  本文已影响0人  Binary_r

一、万物皆对象

对象:在现实生活中存在具体的一个事物。;
类:实际就是对某种类型事物的共性属性与行为的抽取。
人类认识世界: 对象---->类。
在java中: 类 ----->对象。

  //举个例子
  public class Car {    
  String color;// 成员变量
    int num; // 成员变量

    // 成员函数
    void run() {
        System.out.println(color + "的车,轮胎数:" + num + "个,跑起来了");
    }
  } 

二、封装的实现

设置类的属性为private(关键字),不能使用对象名.属性名的方式直接访问对象的属性。

public class EmployeeDemo {
    public static void main(String[] args) {
        // 创建对象
        Employee jack = new Employee();
        // 调用公有方法,给成员变量赋值。
        jack.setId("007");
        jack.setName("jack");
        jack.setGender("男xx");

        // 调用成员方法
        jack.work();

    }
}

class Employee {
    private String name;
    private String id;
    private String gender;

    // 提供公有的get set方法
    public String getName() {
        return name;
    }
    public void setName(String n) {
        name = n;
    }
    public String getId() {
        return id;
    }
    public void setId(String i) {
        id = i;
    }
    public String getGender() {
        return gender;
    }

    public void setGender(String gen) {
        if ("男".equals(gen) || "女".equals(gen)) {
            gender = gen;
        } else {
            System.out.println("请输入\"男\"或者\"女\"");
        }

    }
    public void work() {
        System.out.println(id + ":" + name + ":" + gender + " 努力工作中!!!");
    }
}

2.1 封装的好处

1:隐藏了类的具体实现
2:操作简单
3:提高对象数据的安全性

三、构造方法

作用:对对象进行初始化

siclass Employee {
    private String name;
    private int id;
    private String gender;
    //全参构造方法给对象赋初值
    Employee (String n, int i, String g){
              name =  n;
              id = i;
              gender = g;
    }
    //无参构造方法
    Empioyee(){

    }

四、static 静态关键字

1、解决问题,优化内存,使用static将数据放入共享区。
2:使用static 是为了实现对象之间重复属性的数据共享
3:static使用
(1)、主要用于修饰类的成员
①:非静态成员变量:需要创建对象来访问
②:静态成员变量:使用类名直接调用,也可以通过对象访问
(2)、成员方法
可以使用类名直接调用
①:静态函数:
1:静态函数中不能访问非静态成员变量,只能访问静态变量。
2:静态方法不可以定义this,super关键字.
3:因为静态优先于对象存在.静态方法中更不可以出现this
②:非静态函数:非静态函数中可以访问静态成员变量

class Person {
    String name;
    int age;
    String gender;
    //static 修饰成员变量
    static String country = "CN";

    Person() {

    }

    Person(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;

    }
    //非静态方法
    void speak() {
        //非静态方法可以访问静态成员
        System.out.println("国籍:" + country );
        
        System.out.println("国籍:" + country + " 姓名:" + name + " 性别:" + gender
                + " 年龄:" + age + " 哈哈!!!");
        
    }
    //静态方法
    static void run(){
        //静态方法只能访问静态成员变量。
        System.out.println("国籍:"+country);
        
        //静态方法访问非静态成员变量,编译报错。
        System.out.println(" 姓名:" + name);
        
        //静态方法中不可以出现this,编译报错
        this.speak();
    }
}

4:细节:
(1):静态函数中不能使用非静态变量
(2):非静态函数可以访问静态变量

    public static void main(String[] args) {

        // 访问静态成员
        // 直接通过类名来调用
        String country = Person.country;
        System.out.println(country);

        // 通过对象.成员的形式访问
        Person p1 = new Person("jack", 20, "男");
        p1.country = "US";
        p1.speak();

    }
}

5:为什么静态函数中不能访问非静态成员

    (1):static修饰的成员在共享区中。优先于对象存在
    (2):使用静态代码块验证
            ①:静态代码块
                static{
                    静态代码块执行语句;
                }
            ② :静态代码块特点:随着类的加载而加载。只执行一次,优先于主函数。用于给类进行初始化。
class Person {
    String name;
    int age;
    String gender;
    // static 修饰成员变量
    static String country = "CN";
    static {
        System.out.println("这是静态代码块");
    }

    {
        System.out.println("这是构造代码块");
    }

    Person() {
        System.out.println("无参数构造");
    }

    Person(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
        System.out.println(" 有参数构造");

    }

6:static特点

1 随着类的加载而加载,静态会随着类的加载而加载,随着类的消失而消失。说明它的生命周期很长。
2 优先于对象存在。-->静态是先存在,对象是后存在。
3 被所有实例(对象)所共享。
4 可以直接被类名调用

7:静态变量(类变量)和实例变量的区别:

    1存放位置
        1:类变量随着类的加载而加载存在于方法区中.
        2:实例变量随着对象的建立而存在于堆内存中.
    2生命周期
        1:类变量生命周期最长,随着类的消失而消失.
        2:实例变量生命周期随着对象的消失而消失.

8:静态优缺点

1: 优点:对对象的共享数据进行单独空间的存储,节省空间 例如Person 都有
国籍。该数据可以共享可以被类名调
2:缺点:生命周期过长
访问出现局限性。(静态只能访问静态)

9: 什么时候定义静态变量
    1:静态变量(类变量)当对象中出现共享数据
      例如:学生的学校名称。学校名称可以共享
            对象的数据要定义为非静态的存放在对内存中(学生的姓名,学生的年龄)
10:什么时候定义静态函数

如果功能内部没有访问到非静态数据(对象的特有数据。那么该功能就可以定义为静态)

11:静态的应用

// 1:定义一个遍历数组的函数
    public static void print(int[] arr) {
        for (int x = 0; x < arr.length; x++) {
            if (x != (arr.length - 1)) {
                System.out.print(arr[x] + ",");
            } else {
                System.out.print(arr[x]);
            }
        }
    }
// 2:定义一个获取数组最大值的功能函数
    public static int getMax(int[] arr) {
        int max = 0;
        for (int x = 0; x < arr.length; x++) {
            if (arr[max] < arr[x]) {
                max = x;
            }
        }
        return arr[max];
    }
// 3:冒泡排序
    public static void test(int[] arr) {
        for (int x = 0; x < arr.length - 1; x++) {
            if (arr[x] > arr[x + 1]) {
                int temp = arr[x + 1];
                arr[x + 1] = arr[x];
                arr[x] = temp;
            }
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读