java面向对象的超度,高级语言的灵魂

简介: 1.面向对象基本使用Java作为一种面向对象语言。支持以下基本概念:多态继承封装抽象类对象实例方法重载Java 中的类:类可以看成是创建 Java 对象的模板


1.面向对象基本使用


Java作为一种面向对象语言。支持以下基本概念:

多态

继承

封装

抽象

对象

实例

方法

重载

Java 中的类:类可以看成是创建 Java 对象的模板



通过上图创建一个简单的类来理解下 Java 中类的定义:


/**
 * Dog类
 */
public class Dog {
    // 类的属性
    String breed;
    int size;
    String colour;
    int age;
    // 类的方法
    void eat() {
    System.out.println("我要吃饭!");
    }
    void run() {
    }
    void sleep() {
    }
    void name() {
    }
}


一个类可以包含以下类型变量:


局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。


成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。


类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型。


JAVA中,属性可以是基本类型,也可以是引用类型🤠


接下来,我们测试以下Dog类:


/**
 * Dog类的测试类
 */
public class DogText {
    public static void main(String[] args) {
      // dog只是对象名(对象引用)
      // new Dog();创建的对象空间(数据)才是真正的对象🤡
        Dog dog = new Dog(); // 实例化类对象
        dog.breed = "斗牛犬";
        dog.size = 3;
        dog.age = 5;
        dog.colour = "浅灰色";
        // 访问对象的属性
        System.out.println(dog.breed);
        // 访问对象的方法
        dog.eat();
        // 斗牛犬
        // 我要吃饭!
    }
}


2.对象内存布局


分析以下的代码内存布局:



图示分析:

在方法区首先要做的事情是加载类的信息,包括类的属性和方法🎈



字符串常量池设计思想:

字符串的分配,和其他的对象分配一样,耗费高昂的时间与空间代价,作为最基础的数据类型,大量频繁的创建字符串,极大程度地影响程序的性能

JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化

为字符串开辟一个字符串常量池,类似于缓存区

创建字符串常量时,首先查看字符串常量池是否存在该字符串

存在该字符串,返回引用实例,不存在,实例化该字符串并放入池中


在JDK6.0及之前版本,字符串常量池存放在方法区中,在JDK7.0版本以后,字符串常量池被移到了堆中了。至于为什么移到堆内,大概是由于方法区的内存空间太小了。在HotSpot VM里实现的string pool功能的是一个StringTable类,它是一个Hash表,默认值大小长度是1009;这个StringTable在每个HotSpot VM的实例只有一份,被所有的类共享。字符串常量由一个一个字符组成,放在了StringTable上🌕


3.对象分配机制


对象赋值:

// 类赋值,假设之前的p1类已经创建
Person p2 = p1; // 把p1赋值给p2,本质上是内存的指向


内存分析图示:



4.Java创建对象流程


java内存结构



流程分析


我们以下面的示例代码进行分析:



  1. 加载Person类信息(属性和方法信息,只会加载一次)
  2. 在堆中分配空间,进行默认初始化
  3. 把地址赋值给p,p就指向对象
  4. 进行指定初始化(给对象的属性赋值)


5.成员方法


普通方法


此方法只是输出一句话


public void speak(){
    System.out.println("我是一个人");
}


可以接收参数的方法


方法可以接受一个或若干个的形参列表,同时在调用的时候需要提供相应的值


// 计算 1 -- n 的和
public void cal(int n){
    int res = 0;
    for (int i = 1; i <= n; i++) {
        res += i;
    }
    System.out.println(res);
}


测试类测试方法:


person.cal(100); // 调用一个方法,并传给该方法一个值
// 5050


可以返回值的方法


方法同时还支持返回值的操作


// 计算 a + b
public int add(int a, int b) {
    return a + b;
}


测试类测试方法:


int addRes = person.add(10, 20);
System.out.println(addRes);  // 30


方法的调用机制


现在我们来分析以下如下代码块的内存调用机制



内存分析图:



  • 当程序执行到方法时,就会开辟一个独立的空间(栈空间)
  • 当方法执行完毕时,或者执行return语句时,就会返回到调用方法的地方。返回后继续执行方法后面的代码
  • 方法调用结束后,栈中创建的空间会被自动回收
目录
相关文章
|
5月前
|
JSON Java API
【干货满满】分享京东API接口到手价,用Java语言实现
本示例使用 Java 调用京东开放平台商品价格及优惠信息 API,通过商品详情和促销接口获取到手价(含优惠券、满减等),包含签名生成、HTTP 请求及响应解析逻辑,适用于比价工具、电商系统集成等场景。
|
3月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
288 18
|
3月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
135 4
|
4月前
|
Java
Java基础语法与面向对象
重载(Overload)指同一类中方法名相同、参数列表不同,与返回值无关;重写(Override)指子类重新实现父类方法,方法名和参数列表必须相同,返回类型兼容。重载发生在同类,重写发生在继承关系中。
176 1
|
9月前
|
人工智能 安全 Java
智慧工地源码,Java语言开发,微服务架构,支持分布式和集群部署,多端覆盖
智慧工地是“互联网+建筑工地”的创新模式,基于物联网、移动互联网、BIM、大数据、人工智能等技术,实现对施工现场人员、设备、材料、安全等环节的智能化管理。其解决方案涵盖数据大屏、移动APP和PC管理端,采用高性能Java微服务架构,支持分布式与集群部署,结合Redis、消息队列等技术确保系统稳定高效。通过大数据驱动决策、物联网实时监测预警及AI智能视频监控,消除数据孤岛,提升项目可控性与安全性。智慧工地提供专家级远程管理服务,助力施工质量和安全管理升级,同时依托可扩展平台、多端应用和丰富设备接口,满足多样化需求,推动建筑行业数字化转型。
322 5
|
4月前
|
存储 Java Apache
Java语言操作INI配置文件策略
以上步骤展示了基本策略,在实际项目中可能需要根据具体需求进行调整优化。例如,在多线程环境中操作同一份配置时需要考虑线程安全问题;大型项目可能还需考虑性能问题等等。
203 15
|
4月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
178 0
|
6月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
295 14
|
5月前
|
安全 Java 编译器
Java面向对象
本文深入讲解了Java面向对象编程(OOP)的四大特性:封装、继承、多态与抽象,以及方法的设计与使用。通过示例展示了如何用类和对象组织代码,提升程序的可维护性与扩展性。
|
5月前
|
算法 Java
Java语言实现链表反转的方法
这种反转方法不需要使用额外的存储空间,因此空间复杂度为,它只需要遍历一次链表,所以时间复杂度为,其中为链表的长度。这使得这种反转链表的方法既高效又实用。
463 0