【 JavaSE 】 类和对象(一)

简介: 类的定义方式以及对象的实例化类中的成员变量和成员方法的使用对象的整个初始化过程


类和对象初步认知


C语言(面向过程):

关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题


面向过程注重的是过程,在整个过程中所涉及的行为,就是功能


JAVA(面向对象):

关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成


面向对象注重的是对象,也就是参与过程所涉及到的主体,通过逻辑将一个个功能实现连接起来


举例:将大象放入冰箱

面向过程: 1.把冰箱打开 2. 把大象放入 3. 冰箱关起来


面向对象: 打开冰箱,储存,关闭都是对冰箱的操作,是冰箱的行为。冰箱就是一个对象,所以只要操作冰箱所具备的功能,都要定义在冰箱中


面向对象基本概念:

面向对象是思考问题的一种思考方式,是一种思想

类就是一类对象的统称;对象就是这一类具体化的一个实例

面向对象的好处:将复杂的事情变简单了,只要面对一个对象就行

简单来说:

面向对象就是用代码(类)描述客观世界的事物的一种方式,一个类主要包含一个事物的属性和行为


面向对象的重点:

找对象

创建对象

使用对象


类和类的实例化


定义:

类就是一类对象的统称;对象就是这一类具体化的一个实例


类比:

类相当于一个模板,对象是由模板产生的样本,故而,一个类可以产生无数的对象


类的声明:

类在 Java 中属于引用类型, Java 使用关键字 class 来声明类


注:声明一个类就是创建一个新的数据类型


基本语法:


// 创建类
class <class_name>{  
    field;//成员属性
    method;//成员方法
}
// 实例化对象
<class_name> <对象名> = new <class_name>();


  • 注:
  1. class为定义类的关键字;ClassName为类的名字;{}中为类的主体
  2. 类中的元素称为:成员属性;类中的函数称为:成员方法


  • 示例:


class Person {
    public int age;//成员属性 实例变量
    public String name;
    public String sex;
    public void eat() {//成员方法
       System.out.println("吃饭!"); 
       int a=0;//局部变量(必须初始化) 
   }
    public void sleep() {
       System.out.println("睡觉!");  
   }
}


注意:此处写的方法不带 static 关键字


类的实例化

  • 定义:
  1. 用类类型创建对象的过程,称为类的实例化
  2. 类是模型,限定其中的成员有什么
  3. 类的实例化出的对象占用内存,存储类成员变量(内容)


  • 示例:


class Person {
    public int age;//成员属性 实例变量
    public String name;
    public String sex;
    public void eat() {//成员方法
       System.out.println("吃饭!");  
   }
    public void sleep() {
       System.out.println("睡觉!");  
   }
}
public class Main{
 public static void main(String[] args) {
        Person person = new Person();//通过new实例化对象
        person.eat();//成员方法调用需要通过对象的引用调用
        person.sleep();
        //产生对象     实例化对象
        Person person2 = new Person();
        Person person3 = new Person();
 }
}
输出结果:
吃饭!
睡觉!


注意:

new 关键字用于创建一个对象的实例

使用 . 来访问对象中的属性和方法

同一个类可以创建许多实例

对于实例化的对象以及该类中的类成员变量是保存在堆中


类的成员

成员类型包括:

字段、方法、代码块、内部类和接口等


字段/属性/成员变量

定义:

在类中, 但是方法外部定义的变量(字段/属性/成员变量三种称呼都可以)


示例:


class Person {
    public String name;   // 字段
    public int age;
}
class Test {
    public static void main(String[] args) {
    Person person = new Person();
        System.out.println(person.name);
        System.out.println(person.age);
   }
}
// 执行结果:
null
0


注意:

使用 . 访问对象的字段:"访问" 既包含读, 也包含写

对于一个对象的字段如果没有显式设置初始值, 那么会被设置一个默认的初值


默认值规则

对于各种数字类型, 默认值为 0

对于 boolean 类型, 默认值为 false

对于引用类型(String, Array, 以及自定制类), 默认值为 null

对于 char 类型,默认值为 ‘\u0000’


注意:

null 在 Java 中为 "空引用", 表示不引用任何对象(类似于 C 语言中的空指针)


如果对 null 进行 . 操作就会引发异常(非法访问)


方法


定义:

用于描述一个对象的行为


前文基本已经讲解过,这里提一下构造方法


构造方法:

在实例化对象的时候会被自动调用到的方法, 方法名字和类名相同, 用于对象的初始化


虽然属性能就地初始化, 但是有些时候可能需要进行一些更复杂的初始化逻辑, 那么就可以使用构造方法(后面再讲)


static 关键字


修饰对象:

修饰属性

修饰方法

代码块

修饰类


修饰属性

Java静态属性和类相关, 和具体的实例无关:即同一个类的不同实例共用同一个静态属性


示例:


class TestDemo{
    public int a;
    public static int count;
}
public class Main{
 public static void main(String[] args) {
        TestDemo t1 = new TestDemo();
        t1.a++;
        TestDemo.count++;
        System.out.println(t1.a);
        System.out.println(TestDemo.count);
        System.out.println("============");
        TestDemo t2 = new TestDemo();
        t2.a++;
        TestDemo.count++;
        System.out.println(t2.a);
        System.out.println(TestDemo.count);
   }
}
输出结果:
1
1
============
1
2


注:count被static所修饰(存放在方法区),所有类共享。且不属于对象,访问方式为:类名 . 属性


修饰方法

任何方法使用 static 关键字称为静态方法


静态方法:

静态方法属于类,而不属于类的对象

可以直接调用静态方法,而无需创建类的实例

静态方法可以访问静态数据成员,并可以更改静态数据成员的值


示例:


class TestDemo{
    public int a;
    public static int count;
    public static void change() {
        count = 100;
        //a = 10; error 不可以访问非静态数据成员
   }
}
public class Main{
    public static void main(String[] args) {
        TestDemo.change();//无需创建实例对象 就可以调用
        System.out.println(TestDemo.count);   
   }
}
输出结果:100


注意:

静态方法和实例无关, 而是和类相关

静态方法不能直接使用非静态数据成员或调用非静态方法(非静态数据成员和方法都是和实例相关的)


this和super两个关键字不能在静态上下文中使用(this 是当前实例的引用, super是当前实例父类实例的引用, 也是和当前实例相关)


实际中方法具体要不要带 static, 需要是情形而定(main 方法为 static 方法)


main如果是非静态的:

要使用 main 方法,就需要使用对象调用,那么我们就在 main 方法里创建对象并且调用好了,可是创建的对象在 main 方法里面(便会很矛盾)


如下:


class TestDemo{
    public void main(String[] args){
        TestDemo testDemo = new TestDemo();
        testDemo.main();
    }
}


小总结


class Person {
    public int age;//实例变量   存放在对象内
    public String name;//实例变量
    public String sex;//实例变量
    public static int count;//类变量也叫静态变量,编译时已经产生,属于类本身,且只有一份。存放在方法区
    public final int SIZE = 10;//被final修饰的叫常量,也属于对象。 被final修饰,后续不可更改
    public static final int  COUNT = 99;//静态的常量,属于类本身,只有一份 被final修饰,后续不可更
    //实例成员函数
    public void eat() {
       int a = 10;//局部变量
       System.out.println("eat()!");  
   }
    //实例成员函数
    public void sleep() {
       System.out.println("sleep()!");  
   }
    //静态成员函数
     public static void staticTest(){
         //不能访问非静态成员
        //sex = "man"; error
        System.out.println("StaticTest()");
     }
}
public class Main{
    public static void main(String[] args) {
        //产生对象 实例化对象
        Person person = new Person();//person为对象的引用
        System.out.println(person.age);//默认值为0
        System.out.println(person.name);//默认值为null
        //System.out.println(person.count);//会有警告!
        //正确访问方式:
        System.out.println(Person.count);
        System.out.println(Person.COUNT);
        Person.staticTest();
        //总结:所有被static所修饰的方法或者属性,全部不依赖于对象。
        person.eat();
        person.sleep();
 }
}


  • 数据属性的内存布局:


image.png



相关文章
|
Java 编译器
【JAVASE】类与对象 中
【JAVASE】类与对象
|
Java 编译器
【JAVASE】类与对象 下
【JAVASE】类与对象
|
存储 Java 编译器
【javaSE】 类和对象详解(下)
【javaSE】 类和对象详解(下)
|
6月前
javaSE&多态
javaSE&多态
34 1
|
6月前
|
存储 Java 编译器
JavaSE学习之--类和对象(一)
JavaSE学习之--类和对象(一)
51 0
|
6月前
|
Java 编译器
JavaSE学习之--类和对象(三)
JavaSE学习之--类和对象(三)
45 0
|
6月前
|
存储 Java 编译器
JavaSE学习之--类和对象(二)
JavaSE学习之--类和对象(二)
45 0
|
11月前
|
Java 程序员 编译器
【JavaSE】面向对象之继承
【JavaSE】面向对象之继承
|
存储 安全 Java
类和对象【JavaSE】
类和对象【JavaSE】
78 0
|
Java Android开发
【javaSE】 类和对象详解(上)
【javaSE】 类和对象详解(上)