美文网首页
面向对象与static详解

面向对象与static详解

作者: Binary_r | 来源:发表于2019-03-15 16:22 被阅读0次

一、万物皆对象

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

相关文章

  • 面向对象与static详解

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

  • 单例模式引发的思考

    synchronized详解单例详解static详解;设计模式是一种思想,适合于任何一门面向对象的语言。共有23种...

  • 7.1.1 PHP面向对象之面向过程详解

    7.1.1 PHP面向对象之面向过程详解面向对象的编程思想Object Oriented 大象与冰箱1、打开2、装...

  • Static 属性的理解

    C++ 的 static 有两种用法: 面向过程程序设计中的static 和面向对象程序设计中的 static. ...

  • Java 面向对象2

    Java 面向对象 1. static 和 final static关键字---修饰成员变量 用static修饰的...

  • 面向对象(十一)-Static

    Static 简介使用static修饰符声明属于类型本身而不是属于特定对象的静态成员。static修饰符可用于类、...

  • C++中的static关键字的总结

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通...

  • C++中的Static

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通...

  • 面向对象详解

    创建对象各种方法: js封装 JS封装只有两种状态,一种是公开的,一种是私有的。 构造函数方式与原型方式给对象添加...

  • Python的面向对象

    Python面向对象详解 引言:   面向对象是一种编程思想,面向对象是一种对现实世界理解和抽象的方法。它的编程思...

网友评论

      本文标题:面向对象与static详解

      本文链接:https://www.haomeiwen.com/subject/mmcopqtx.html