Java 面向对象之理解类和对象

类和对象

1.类和对象的初步认识

什么是类:类是具有相同的状态和相同的行为的一组对象的集合。
什么是对象:万事万物皆对象,对象强调的是一个具体的个体。
例如:杨树就不是对象,我家门前第一颗杨树就是对象。

类和对象是什么关系?

类和对象的关系就如同模具和用这个模具制作出来的物品之间的关系。一个类给出它的全部对象的一个统一的定义,而它的每个对象则是符合这种定义的一个实体(也称作实例),因此类和对象的关系就是抽象和具体的关系。

对象的构成

对象由状态行为构成。
对象的状态是指对象的数据,对象的状态由变量表示,也叫对象的属性。
对象的行为是指对象的功能,对象的行为由方法表示。
对象是由类实例化时创建的,因此创建对象必须先定义类。

类的构成

类是由属性和方法构成的
示例:

public class Student {
    //类的属性(类的状态)
    String name; 
    int score;
    String no;
    //类的方法(类的行为)
    public void play(){
        System.out.printf("我的名字是%s,我的成绩是%d,我的学号是%s",name,score,no);
    }
}

2.类和类的实例化

通过类创建对象的过程称为类的实例化。实例化的结果是产生了一个实例,实例也叫对象。
语法:类名 对象名 = new 类名();
示例:

Student s1 =new Student();
Student s2 =new Student();
类和对象的区别
  • 类是对某一类事物的抽象描述,不是具体的个体
  • 对象是对某一事物的具体描述,是具体的个体

3.类的成员

3.1变量

变量分为成员变量和局部变量

局部变量

局部变量是定义在方法内的变量
示例:

public void sayHello(){
        int height = 20;//局部变量
    }
成员变量

成员变量是类的属性,是定义在类内,方法外的变量。
示例:

class Student {
    String name;
    int score;
    String no;
}
成员变量与局部变量的区别
  • 作用域不同
    成员变量作用域:整个类;局部变量的作用域:方法内。
  • 初始值不同
    成员变量由构造函数初始化的;局部变量需要手动初始化。

在同一个方法中不允许有同名的局部变量,在不同的方法中可以有同名的局部变量。
局部变量可以和成员变量名相同,并且在使用时局部变量有更高的优先级。

3.2方法

类方法分为静态方法、构造方法、普通方法

静态方法

由static关键字修饰的方法。
示例

public static void show(){
         System.out.printf("静态方法");
}
构造方法

为类属性赋值的方法
示例:

class Student {
    //构造方法
    Student(){

    }
}
普通方法

3.3static关键字

在类中,用static声明的成员变量为静态成员变量,也称为类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效。

作用:在同一个类的对象中共享数据。
注意

  • static修饰的成员变量和方法,从属于类
  • 普通变量和方法从属于对象
  • 静态方法不能调用非静态成员,编译会报错
static与instance的区别

static:静态(属于类,只有一份)

instance:实例(实例也叫对象,就是new出来的堆的内存空间,实例是每个对象专有的,每new一次就分配一次内存)

  • 实例变量是在new类时在堆中分配内存的。
  • 构造函数可以为实例属性初始化。构造函数不会为静态属性初始化。
  • 由于静态属性是所有对象共有的,所有对象就是类,因此静态属性也称为类属性,或者类变量,或者类成员。
  • 既然静态属性属于类,不属于某个具体的对象,因此在new对象时,不会给静态属性分配内存。那静态时什么时候分配内存呢?
  • 当在程序运行期间,首次出现类名时,会暂时停止程序运行,去为类的静态属性分配内存,然后继续运行。
  • 静态变量被分配在方法区中,常驻内存,永不回收。静态变量只有一份。相当于c语言的全局变量。
  • 静态变量由类名操作,由类名赋值,取值。
  • 类名调用静态属性时,可以省略类名。
static用法

修饰变量、修饰方法、修饰代码块
示例

public class Demo{
    public static De(int i){
        this.i = i;
    }
    //静态块,为static变量初始化,静态块在首次类名出现时调用,但后于分配静态变量。
    static{
        age = 20;
    }
    static int age=0;
}

4.封装

封装是为了保护数据,对对象的属性的读写权限的限制。
封装是如何实现的?是通过访问修饰符实现的。

4.1封装实现

访问修饰符共有四个

  • public:公共的
  • protected:受保护的
  • 默认|default(什么都不写)
  • private:私有的

使用范围如下:


示例:

public class Person {
    public String name;//公有
    private int age;//私有
    String address;//默认
    protected int heigth;//保护
}

4.2get方法与set方法

最典型封装是:共有方法封装私有属性
例如

public class Person {
    private String name;//私有的属性,类外不能访问
    private int money;//私有的属性,类外不能访问

    public String getName() {//共有的读方法,外界可以读取
        return name;
    }

    public void setName(String name) {//共有的写方法,外界可以写入
        this.name = name;
    }

    public int getMoney() {//共有的读方法,外界可以读取
        return money;
    }

    public void setMoney(int money) {//共有的写方法,外界可以写入
        if(money<0){//封装中可以验证数据有效性
            return;
        }
        this.money = money;
    }
}

5.构造方法

构造方法也叫构造函数,或者叫构造器

  1. 构造方法的方法名必须与类名相同
  2. 构造方法没有返回值,也不写void
    示例:
class Student {
    //构造方法
    Student(){

    }
}
构造方法的作用

类的属性在实例化时被赋予默认值。那么是谁给类的属性赋的默认值呢

class Student {
    String name;
    int score;
    String no;
    
    public static void main(String[] args) {
        Student s1 = new Student();//实例化,此时name,score,no都有默认值了。
    }
}

对象的属性的默认值是由构造方法赋值的。构造方法的作用:为对象的属性初始化。

默认构造方法

一个类如果没有显示的定义构造函数,那么这个类默认具有无参的构造函数。
默认构造函数为对象的属性赋默认值。
代码示例

class Student {
    String name;
    int score;
    String no;
    public void play(){
        System.out.printf("我的名字是%s,我的成绩是%d,我的学号是%s",this.name,this.score,this.no);
    }
}
public class StudentTest {
    public static void main(String[] args) {
        Student s1 =new Student();
        s1.play();
    }
}

输出结果是:我的名字是null,我的成绩是0,我的学号是null
为什么输出的是null,0null?
因为本例中没有定义构造函数,系统会自动添加一个默认构造函数,默认构造函数是无参的,会为所有的属性赋默认值,因此name是null,score是0,no是null。
特殊情况:如果显示的定义了构造函数,那么默认构造函数就没有啦。
例如:

class Student {
    String name;
    int score;
    String no;
    //显示定义构造函数,此时默认构造函数就没有了
    Student(){
        
    }
}
构造方法的调用

构造方法是在实例化对象时调用的。并且实例化时传递的参数必须有构造方法的参数一致。
例如

class Student {
    String name;
    int score;
    String no;

    /**
     * 有两个参数的构造方法
     * @param name1
     * @param score1
     */
    Student(String name1,int score1){
        name= name1;
        score= score1;
    }
}
public class StudentTest {
    public static void main(String[] args) {
        Student s1 =new Student("haha",76);//调用student类的构造方法,为name和score属性初始化,no为默认值null
    }
}
构造方法的重载
class Student {
    String name;
    int score;
    String no;

    //第1种构造方法的重载
    Student(String name1,int score1){
        name= name1;
        score= score1;
    }
    //第2种构造方法的重载
    Student(String name1, int score1, String no1) {
        name = name1;
        score = score1;
        no = no1;
    }
}
public class StudentTest {
    public static void main(String[] args) {
        Student s1 =new Student("haha",76);//调用第1种构造方法的重载
        Student s2 =new Student("yaya",67,"111");//调用第2种构造方法的重载
    }
}

6.总结

1、类是类是具有相同的状态和相同的行为的一组对象的集合。
2、对象强调的是一个具体的个体。
3、类成员由属性、方法;属性又分为局部变量、成员变量;方法分为静态方法、构造方法、普通方法等。
4、对象分为状态与行为或者属性与方法。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容