首页 > 其他分享 >类与对象

类与对象

时间:2024-08-01 10:55:59浏览次数:12  
标签:name 对象 Person NewObject new public

类与对象

1. 面向对象与面向过程

什么是面向过程

概述:自顶而下的编程模式
把问题分解成一个一个步骤,每个步骤用函数实现,依次调用即可
就是说,在进行面向过程编程的时候,不需要考虑那么多
上来先定义一个函数,然后使用各种诸如if-else、for-each等方式进行代码执行
最典型的用法就是实现一个简单的算法,比如实现冒泡排序

什么是面向对象

概述:将事务高度抽象化的编程模式
将问题分解成一个一个步骤,对每个步骤进行相应的抽象,形成对象
通过不同对象之间的调用,组合解决问题
也就是说,在进行面向对象进行编程的时候,要把属性、行为等封装成对象,然后基于这些对象及对象的能力进行业务逻辑的实现
比如:想要造一辆车,上来要先把车的各种属性定义出来,然后抽象成一个Car类

面向对象的五大基本原则

五大基本原则:
单一职责原则(Single-Responsibility Principle)
开放封闭原则(Open-Closed principle)
里氏替换替换原则(Liskov-Substituion Principle)
依赖倒置原则(Dependency-Inversion Principle)
接口隔离原则(Interface-Segregation Principle)

区别

  • 面向过程:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源
    所以当性能是最重要的考量因素时,比如单片机,嵌入式开发,Linux/Unix等一般采用面向过程开发
    但是面向过程没有面向对象易维护,易复用,易扩展
  • 面向对象:易维护,易复用,易扩展;因为面向对象有封装,继承,多态性的特性
    所以可以设计出低耦合的系统,使系统更加灵活,更加易于维护
    但是面向对象性能比面向过程低

2. 类与对象的概念

1.什么是类

  • 类:指的是对客观事物的一种描述,是对现实中一类具有共同属性和行为的事物的抽象。

2.什么是对象

  • 对象:指的是具体存在的事物,是能够看得到摸的着的真实存在的实体。

3.成员变量

成员变量(Member Variable)也称为实例变量(Instance Variable),是定义在类中的变量。它们属于类的每个对象实例,并且可以被类中的所有成员方法访问和使用。

下面是一个简单的例子,演示了一个名为Person的类和其中的成员变量:

public class Person {
    private String name;
    private int age;

// 构造方法
public Person(String name, int age) {
    this.name = name;
    this.age = age;
}

// 成员方法:打印个人信息
public void printInfo() {
    System.out.println("姓名:" + name);
    System.out.println("年龄:" + age);
}

}

在这个例子中,Person类有两个私有的成员变量name和age。这些成员变量存储了每个Person对象的姓名和年龄信息。

成员变量在类中声明,在类的任何方法(如构造方法、成员方法等)之外。它们具有类范围的作用域,意味着它们可被同一类中的所有方法访问和使用。

4.成员方法

成员方法(Member Method)也称为实例方法(Instance Method),是定义在类中的操作或行为。它们用于访问和操作对象的属性,并执行特定的任务。每个对象都可以调用其所属类的成员方法。

下面是一个简单的例子,演示了一个名为Person的类和其中的成员方法:

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 int getAge() {
    return age;
}

// 成员方法:打印个人信息
public void printInfo() {
    System.out.println("姓名:" + name);
    System.out.println("年龄:" + age);
}
}


在这个例子中,Person类包含了两个私有属性name和age,以及构造方法和三个成员方法:getName、getAge和printInfo。getName和getAge方法用于获取对象的姓名和年龄属性值,而printInfo方法用于打印对象的姓名和年龄信息。

5.对象的实例化

一.对象实例化常用方式

方式一:直接new一个对象,最常用的一种。

方式二:反射,通过Class.forName("类的全限定名")。

方式三:构造器,通过Class.forName("类的全限定名"),再获取构造方法。

方式四:序列化,通过java.io.ObjectInputStream对象流的方式。

备注:工厂模式实例化、克隆实例化两种比较少用。

1.new一个对象

声名一个对象
public class NewObject {

/** 测试方法 */
public void print() {
    System.out.println("NewObject print-------");
}

}
实例化

NewObject newObject = new NewObject();
newObject.print();

2.反射

声明一个对象

public class NewObject {

/** 测试方法 */
public void print() {
    System.out.println("NewObject print-------");
}

}
实例化

Class<?> cla = Class.forName("com.oysept.instance.NewObject"); // 包名+类名
NewObject newObject = (NewObject) cla.newInstance(); // 实例化
newObject.print(); // 调用测试方法

3.构造器

声明一个对象

public class NewObject {

public NewObject() {
    System.out.println("构造器1-------");
}

public NewObject(Object str) {
    System.out.println("构造器2-------");
}

public NewObject(String str, Integer s) {
    System.out.println("构造器3-------");
}

/** 测试方法 */
public void print() {
    System.out.println("NewObject print-------");
}

}
场景一:无参构造方法

Class<?> cla = Class.forName("com.oysept.instance.NewObject"); // 包名+类名
			
// 场景一: 无参构造方法
Constructor<?> constructor = cla.getConstructor(); // 构造器
NewObject newObject = (NewObject) constructor.newInstance(); // 获取无参构造方法实例
newObject.print(); // 调用测试方法

场景二:带Object参数的构造方法

Class<?> cla = Class.forName("com.oysept.instance.NewObject"); // 包名+类名
			
// 场景二: 带Object参数的构造方法
Constructor<?> constructor = cla.getConstructor(Object.class);
NewObject newObject = (NewObject) constructor.newInstance("Object");
newObject.print(); // 调用测试方法

场景三: 带String和Integer参数的构造方法

Class<?> cla = Class.forName("com.oysept.instance.NewObject"); // 包名+类名
			
// 场景三: 带String和Integer参数的构造方法
Constructor<?> constructor = cla.getConstructor(String.class, Integer.class);
NewObject newObject = (NewObject) constructor.newInstance("String", 0);
newObject.print(); // 调用测试方法
4.序列化

声明一个对象,必须继承java.io.Serializable接口,才能序列化

import java.io.Serializable;

public class NewObject implements Serializable {
	

/**

 * */
   private static final long serialVersionUID = 1L;

/** 测试方法 */
public void print() {
    System.out.println("NewObject print-------");
}

}

序列化方法

/** 序列化 */
public static void serializable(Object obj, String file) {
    ObjectOutputStream objectOutputStream = null;
    try {
        objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File(file)));
        objectOutputStream.writeObject(new NewObject());
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (objectOutputStream != null) {
                objectOutputStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

反序列化方法

/** 反序列化 */
public static Object unSerializable(String file) {
    Object obj = null;
    ObjectInputStream objectInputStream = null;
    try {
        objectInputStream = new ObjectInputStream(new FileInputStream(new File(file)));
        obj = objectInputStream.readObject();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } finally {
        try {
            if (objectInputStream != null) {
                objectInputStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return obj;
}

序列化实例测试

public static void main(String[] args) {
    try {
        String file = "D:\\object.object"; // 对象存放地址
        // 先序列化
        serializable(new NewObject(), file);
			

​    // 再反序列化
​    NewObject new4 = (NewObject) unSerializable(file);
​    new4.print(); // 调用测试方法
} catch (Exception e) {
​    e.printStackTrace();
}

}

6.对象的使用

对象被创建之后,就可以使用该对象。通过运算符“.”,对象可以实现对自己变量的访问和方法的调用。

   对象对自己变量访问的语法格式如下:

                    对象名.变量名;

                    对象对自己方法调用的语法格式如下:

                    对象名.方法名([参数值列表]);

【例1】对象的创建与使用

package graph;
public class Application1 {
	public static void main(String[] args) {
		Rectangle rectangle1;  //对象声明
		rectangle1=new Rectangle(4.5,2.0);//对象实例化
		double length=rectangle1.length;  //访问对象的变量length
		double width=rectangle1.width;    //访问对象的变量width
		double area=rectangle1.getArea(); //调用对象的方法getArea
		System.out.println("length="+length+",width="+width+",area="+area);
	}
}

​ 在Java中,null表示应用没有指向任何对象,运行过程中系统如果发现使用了这样一个引用时,会产生程序运行异常。例如,下面程序在运行时由于的rectangle1值为null而引发一NullPointerException异常。

package graph;

public class Application1 {

static Rectangle rectangle1; 

public static void main(String[] args) {

​     System.out.println(rectangle1.length);

}

}

7.对象的销毁

对象使用完之后需要对其进行清除。对象的清除是指释放对象占用的内存。在创建对象时,用户必须使用 new 操作符为对象分配内存。不过,在清除对象时,由系统自动进行内存回收,不需要用户额外处理。

Java 语言的内存自动回收称为垃圾回收(Garbage Collection)机制,简称 GC。垃圾回收机制是指 JVM 用于释放那些不再使用的对象所占用的内存。

Java 语言并不要求 JVM 有 GC,也没有规定 GC 如何工作。不过常用的 JVM 都有 GC,而且大多数 GC 都使用类似的算法管理内存和执行回收操作。

一个对象被当作垃圾回收的情况主要如下两种。
1)对象的引用超过其作用范围。

{
Object o = new Object(); // 对象o的作用范围,超过这个范围对象将被视为垃圾
}
1
2
3
2)对象被赋值为 null。

{
Object o = new Object();
o = null; // 对象被赋值为null将被视为垃圾
}
1
2
3
4
在 Java 的 Object 类中还提供了一个 protected 类型的 finalize() 方法,因此任何 Java 类都可以覆盖这个方法,在这个方法中进行释放对象所占有的相关资源的操作。

在 Java 虚拟机的堆区,每个对象都可能处于以下三种状态之一。

1 . 可触及状态:当一个对象被创建后,只要程序中还有引用变量引用它,那么它就始终处于可触及状态。

2 . 可复活状态:当程序不再有任何引用变量引用该对象时,该对象就进入可复活状态。在这个状态下,垃圾回收器会准备释放它所占用的内存,在释放之前,会调用它及其他处于可复活状态的对象的 finalize() 方法,这些 finalize() 方法有可能使该对象重新转到可触及状态。

3 . 不可触及状态:当 Java 虚拟机执行完所有可复活对象的 finalize() 方法后,如果这些方法都没有使该对象转到可触及状态,垃圾回收器才会真正回收它占用的内存。

8.匿名对象

匿名对象:没有名字的对象。
格式如下:

new Person().showMessage();
1

当然,你也可以通过Person创建一个实例对象后,再去调用Person类中的方法,具体如下:

Person p = new Person(); //创建对象p.
 
//给对象的各个属性赋值。
p.name = "蛋蛋";
p.age = 6;
p.height = 1.1;
 
//调用类中的方法
p.showMessage();
123456789

匿名对象的使用场景:

(1)类中的方法仅被对象调用一次。

new Person().showMessage();	 //showMessage方法被对象调用一次的时候.
1

(2)匿名对象做实参传递。

Person.show(new Person());      //匿名对象做实际参数。
1

匿名对象与非匿名对象对属性赋值的区别:

首先,看下面的代码,你感觉两者之间的区别是什么?

//非匿名对象
Person p = new Person();
p.name = "蛋蛋";
p.age = 6;
p.height = 1.1;
		
 
//匿名对象
new Perosn.name = "花花";
new Perosn.age = 21;
new Perosn.height = 1.2;
1234567891011

两者的最大区别:非匿名对象只是给对象p的三个属性赋值;匿名对象在给三个匿名对象的不同属性(单个属性)赋值。

标签:name,对象,Person,NewObject,new,public
From: https://www.cnblogs.com/zpjd/p/18336208

相关文章

  • C++对象析构顺序问题——由QObject::desroyed展开的思考
    C++对象析构顺序问题——由QObject::desroyed展开的思考C++析构函数执行的顺序是最先执行继承链最末端的子类的,最后执行顶层的基类的。而QObject::destroyed(QObject*obj=nullptr)信号在Qt文档中说是“在obj被完全析构时之前立即触发,并且不会被阻塞”。这里的“完全析......
  • 面向对象与面向过程
    面向对象概念:面向对象编程(Object-OrientedProgramming,简称OOP)是一种编程范式,它使用“对象”来设计软件。对象可以包含数据(通常称为属性或字段)和代码(通常称为方法或函数)。类(class):类是对象的蓝图或模板,它定义了对象的结构和行为。类可以包含属性(数据)和方法(函数)。publicclass......
  • 类和对象的概念
    什么是类类(class):定义:类是现实世界中某些具有共同属性和行为的事物的抽象。它定义了一组特定的属性(数据)和方法(操作这些数据的函数)。蓝图:类可以看作是创建对象的蓝图或模板。它规定了对象的结构和行为。封装:类通过将数据和操作这些数据的方法组合在一起,提供了封......
  • 对象的使用
    对象的使用对象的使用在编程中是一个广泛且基础的概念,特别是在面向对象编程(OOP)语言中,如Java、C++、JavaScript等。对象的使用主要涉及对象的声明、属性的访问和修改、方法的调用、对象的创建与销毁,以及对象之间的交互等。以下是对对象使用的一个详细概述:一、对象的声明在大多数......
  • 类与对象的概念
    类与对象的概念一.类(class)类(Class)是面向对象编程(OOP,Object-OrientedProgramming)中的一个核心概念。它是一种将数据(称为属性或字段)和操作这些数据的方法(称为函数或方法)封装在一起的逻辑单元。类是创建对象的蓝图或模板,它定义了对象可以拥有的属性和方法。在面向对象编程中,类......
  • Java中类和对象
    类和对象1.面向对象与面向过程面向对象(ObjectOrientedProgramming,OOP)与面向过程(ProcedureOrientedProgramming,POP)是两种不同的编程范式,它们在编程思想、特点、优势及应用场景等方面存在显著差异。一、编程思想面向过程:以过程为中心,关注于“做什么”,即解决问题的步......
  • 面向对象与面向过程
    面向对象与面向过程面向对象(Object-OrientedProgramming,OOP)与面向过程(Procedure-OrientedProgramming,POP)是两种主要的编程范式,它们在编程思想、特点、优势及应用场景等方面存在显著差异。一、编程思想面向对象:以对象作为基本程序结构单位,程序的设计围绕对象进行。对象具......
  • 如何计算任意可迭代对象(例如生成器)中的项目数量?
    假设我有一个任意的可迭代对象-例如,一个迭代文件行和yield匹配正则表达式的生成器。我如何计算该可迭代对象中的项目数,假设我不这样做不关心元素本身?可以使用sum()函数来计算可迭代对象中的元素数量,而无需存储它们。以下是如何操作:defcount_item......
  • 如何从python读取matlab持续时间对象
    我创建一个matlab持续时间对象并将其保存到.mat文件:timeend=seconds(123);save('time.mat',timeend,'-v7.3');然后我从python读取它:withh5py.File('time.mat','r')asf:var=f['timeend'][:]print(list(var))......
  • 使用 python 将 JSON 数据空值导入数据库。收到此错误 - 数据需要字符串或类似字节的
    我正在尝试使用python将JSON数据集导入到我的PostgreSQL数据库,但在尝试导入null值时会抛出错误。表的名称是Loan_info。我在python中尝试过此操作:-forfieldinloan_info:ifloan_info[field]in['Null','null',None]:......