Java基础知识全面总结

news2024/10/12 2:26:47

 第一章:类与对象

第一课:什么是面向对象编程

1.面向对象编程和面向过程编程的区别

  无论是面向过程编程还是面向对象编程都是用于解决一个实际问题,当面向过程编程在解决一个问题时,更多的情况下是不会做出重用的设计思考的;而面向对象的设计形式为模块化设计,并且可以进行重用配置,在整个面向对象的设计里面更多考虑的是标准。

2.面向对象设计的三个主要特征

封装性:内部的操作对外部来说不可见,当内部的操作都不可以直接使用的时候才是安全的。

继承性:在已有的结构基础上继续对功能进行扩充

多态性:是在继承性的基础上扩充的概念,指的是类型的转换处理。

第二课:类与对象

1.类与对象的概念

类是对某一类事物共性的抽象概念,而对象描述的是一个具体的产物。先有类后有对象。

例:人可以看成是一个类,小学生李明就是一个对象。

2.类的组成

成员属性(Field):可简化为属性

例:一个人的年龄,身高,体重

操作方法(Method):定义对象具有的处理行为

例:一个人可以游泳,唱歌。跳舞

第三课:类与对象的定义与使用

1.类的定义

范例:

//定义一个类
class Person{
    private String name;//类的成员属性姓名
    private int age;//类的成员属性年龄

    /**
     * 类的方法,输出姓名和年龄
     */
    public void Tell(){
        System.out.println(age+"  "+name);
    }
}

在范例中定义了一个类Person,类里面定义了成员属性name(姓名),age(年龄),以及类的操作方法Tell(输出成员属性)。

2.对象的定义

方法一:类的名称 对象名称=new 类的名称();

方法二:类的名称 对象名称=null;

对象名称=new 类的名称();(推荐使用)

范例:

//对象的定义方式一
Person person=new Person();
//对象的定义方式二
Person person1=null;
person1=new Person();

3.类与对象的使用

范例:

//对象的定义方式一
Person person=new Person();
//给对象1赋值
person.name="李明";
person.age=18;
//使用对象1调用类的方法
person.Tell();
//对象的定义方式二
Person person1=null;
person1=new Person();
//给对象2赋值
person1.name="张三";
person1.age=20;
//使用对象2调用类的方法
person1.Tell();

4.完整代码

public class Main {
    public static void main(String[] args) {
        //对象的定义方式一
        Person person=new Person();
        //给对象1赋值
        person.name="李明";
        person.age=18;
        //使用对象1调用类的方法
        person.Tell();
        //对象的定义方式二
        Person person1=null;
        person1=new Person();
        //给对象2赋值
        person1.name="张三";
        person1.age=20;
        //使用对象2调用类的方法
        person1.Tell();
    }
}
//定义一个类
class Person{
    public String name;//类的成员属性姓名
    public int age;//类的成员属性年龄
    /**
     * 类的方法,输出姓名和年龄
     */
    public void Tell(){
        System.out.println(age+"  "+name);
    }
}

输出结果:

第四课:对象内存分析

Java中的类属于引用数据类型,引用数据类型主要保存在堆内存和栈内存中。

堆内存:保存引用数据类型的具体对象信息;堆内存的空间开辟是通过new关键字进行的。

栈内存:保存的是堆内存的地址信息;即通过地址信息找到堆内存,而后找到对象的具体内容。

范例:

1.对象的定义方式一

//对象的定义方式一
Person person=new Person();
//给对象1赋值
person.name="李明";
person.age=18;
//使用对象1调用类的方法
person.Tell();

分析:代码“Person person=new Person();”中new Person()开辟了一个堆内存空间,代码“Person person”把开辟的堆内存的地址信息以person为名称存入在栈内存中(见下图)。

代码“person.name="李明";person.age=18;”是以栈内存中名称为person的对象所代表的地址在堆内存中寻找地址,并给地址内的具体信息赋值。

2.对象的定义方式二

//对象的定义方式二
Person person1=null;
person1=new Person();
//给对象2赋值
person1.name="张三";
person1.age=20;
//使用对象2调用类的方法
person1.Tell();

内存分析:代码“Person person1=null;”是先开辟一个栈内存名称为person1,但这个时候person1并没有指向任何堆内存空间(图一),这个时候对象person1不能给对象信息赋值,否者会报指针异常。只有当代码“person1=new Person();”执行后,person1才能指向具体的堆内存空间(图二)。给对象赋值的内存结构流程基本方法与方式一相同。

第五课:对象引用分析

1.引用传递(方式一)

代码:

 Person person=new Person();
 //给对象person赋值
 person.name="李明";
 person.age=18;
 //引用传递
 Person person1=person;
person1.age=80;
person.Tell();

输出结果:

分析:代码“ Person person=new Person();”表示在堆内存中开辟了一片内存空间,在栈内存中有一个person指向开辟的堆内存。代码“ person.name="李明";person.age=18;”给推内存中的对象信息赋值,代码“ Person person1=person;”表示把对象person所指向的堆内存地址赋值给person1,那么person1和person就指向同一片堆地址空间;代码“person1.age=80;”是利用栈内存对象person1修改对应的堆内存的对象信息。此过程结束后person和person1都会指向同一片地址空间。

2.引用传递(方式二)

代码:

 public static void main(String[] args) {
        Person person=new Person();
        //给对象person赋值
        person.name="李明";
        person.age=18;
        //引用传递
//        Person person1=person;
       tempPerson(person);
       person.Tell();
    }
    public static void tempPerson(Person person1){
  person1.age=80;
    }
}

输出结果:

方式二是通过方法用参数进行引用传递,与方式一不同的是,方法结束后,person1指向堆内存的连线会断开,也就等于person1只有在方法中才会指向堆内存。

完整代码:

public class Main {
    public static void main(String[] args) {
        Person person=new Person();
        //给对象person赋值
        person.name="李明";
        person.age=18;
        //引用传递
//        Person person1=person;
       tempPerson(person);
       person.Tell();
    }
    public static void tempPerson(Person person1){
  person1.age=80;
    }
}
//定义一个类
class Person{
    public String name;//类的成员属性姓名
    public int age;//类的成员属性年龄
    /**
     * 类的方法,输出姓名和年龄
     */
    public void Tell(){
        System.out.println(age+"  "+name);
    }
}

第六课:引用与垃圾产生分析

垃圾的产生:所谓的垃圾空间指的是没有栈内存指向的堆内存空间就是垃圾空间;所有的垃圾空间会被GC(垃圾收集器)不定期回收。

范例:

代码:

 Person person1=new Person();
 //给对象person1赋值
 person1.name="李明";
 person1.age=18;
 Person person2=new Person();
 person2.name="张三";
 person2.age=20;
 person2=person1;
 person2.age=50;
person1.Tell();

分析:这段代码分定义了类Person的两个实例person1和person2,并给两个实例都做了赋值,接着把person1的值赋给person2,赋值后的person2就不再指向原地址,而是和person1指向同一地址,原来的地址空间就变成了垃圾空间。

输出结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2206606.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FreeRTOS-内存管理

FreeRTOS-内存管理 一、内存管理简介二、内存管理实验 一、内存管理简介 在使用FreeRTOS创建任务、队列、信号量等对象时,有动态创建和静态创建(本质上内存分配的问题)FreeRTOS提供了5种动态内存管理算法,分别为heap_1、heap_2、heap_3、heap_4、heap_5…

二叉树的遍历 and 基本操作实现

二叉树的遍历 and 基本操作实现 1.二叉树的遍历前序遍历中序遍历后序遍历层序遍历 2.基本操作实现2.1 获取节点个数2.2 获取叶子节点的个数2.3 获取第K层节点的个数2.4 获取二叉树的高度2.5 检测值为value的元素是否存在 1.二叉树的遍历 二叉树由于其特殊结构,有四…

qt的5.sql和opencv 2024.10.11

1.QSqlQuery的增删改查 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QSqlQueryModel> #include <QTableView> #include <QLineEdit> #include <QSpinBox> #include <QPushButton> #includ…

如何阻止Chrome自动登录到网站

在数字化时代&#xff0c;浏览器的便利性极大地提高了我们的在线体验。然而&#xff0c;这种便利性有时也会带来隐私和安全方面的担忧。例如&#xff0c;Chrome浏览器可能会在某些网站上自动登录&#xff0c;这对于共享设备或公共计算机来说可能是个问题。本文将指导您如何阻止…

【C++】第三节:类与对象(中)

1、类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器…

【网络安全】将两个 Self-XSS 转变为可利用的 XSS

未经许可,不得转载。 文章目录 Self-XSS-1Self-XSS-2Self-XSS-1 目标应用程序为某在线商店,在其注册页面的First Name字段中注入XSS Payload: 注册成功,但当我尝试登录我的帐户时,我得到了403 Forbidden,即无法登录我的帐户。 我很好奇为什么我无法登录我的帐户,所以我…

SpringBoot集成Redis基础知识

Redis是干什么用的 Redis是一个开源的内存数据库&#xff0c;因其高性能、高可用性和丰富的数据结构&#xff0c;被广泛应用于多种场景下的数据存储和处理需求。以下是Redis的主要用途&#xff1a; 缓存&#xff1a;Redis最常用的用途是作为高性能缓存层&#xff0c;以减轻数…

docker部署虚拟机

创建新的容器web02&#xff0c;-v表示目录映射&#xff0c;-p时端口映射&#xff0c;把宿主机目录挂载到容器中 docker run -itd -p 80:80 -v /data/webapps/www/:/usr/share/nginx/html/ --nameweb02 nginx:latest 此时我们在发布网站时只需要放在宿主机的目录里就可以了 解…

Python数据分析-学生表现预测

一、研究背景 随着教育水平的不断提升&#xff0c;学生的学习成绩和综合素质得到了越来越多的关注。除了传统的学术成绩外&#xff0c;课外活动、家长支持等因素也在很大程度上影响着学生的学习表现和未来发展。现代社会中&#xff0c;家长、教师、学校和研究人员都在努力寻找…

Spring Boot课程问答:技术难题轻松解决

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

如何将长链接缩短

在我们平时的网络活动中&#xff0c;经常会遇到需要将长链接缩短的情况。有细心的小伙伴会发现&#xff0c;平时收到的短信里面都会携带一个很短的链接&#xff0c;这就是将长链接缩短之后的效果。长链接不仅不美观&#xff0c;而且在社群、各种网络平台、短信等场景推送时&…

安装SNMP并zabbix监控

windos server 安装SNMP 通过server manage ,add roles and features 选择features-SNMP service,选择next或者install等待安装完成后&#xff0c;server manage-tools-component service进入service管理窗口选择service-SNMP service&#xff0c;并将服务状态改为自动启动和运…

【宽字节注入】

字符编码 url 编码 GBK编码 utf8 编码 宽字节注入 php中的转译函数 宽字节注入介绍 练习 正常输入没有回显&#xff1a; 没有回显 usernameadmin&passwordadmin 闭合单引号&#xff0c;依旧没有回显 usernameadmin and 11%23&passwordadmin利用宽字节尝试闭合,依旧…

嵌入式C语言中链表的插入实现方法

大家好,今天主要给大家分享一下,如何使用链表插入功能。 第一:嵌入式中链表具体实现 链表查找思路:从链表的a0起,判断是否为第i结点,若是则返回该结点的指针,否则查找下一结点,依次类推。 具体代码的链表插入实现: linklist Locate(linklist_t h, data_t x) { …

基于差分进化灰狼混合优化的SVM(DE-GWO-SVM)数据预测算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 DE优化 4.2 GWO优化 5.完整程序 1.程序功能描述 基于差分进化灰狼混合优化的SVM(DE-GWO-SVM)数据预测算法matlab仿真&#xff0c;对比SVM和GWO-SVM。 2.测试软件版本以及运行结果展示…

VMwareWorkstation安装KylinV10sp3(银河麒麟)系统教程

版本说明 VMware版本如下 OS版本如下 创建虚拟机 点击创建新的虚拟机 按图下所示选择&#xff0c;点击下一步 按照图下所示选择&#xff0c;点击下一步 按照图下所示选择&#xff0c;点击下一步 按照图下所示选择&#xff0c;点击下一步 设置虚拟机名称&#xff0c;点击下一步…

【RabbitMQ高级——过期时间TTL+死信队列】

1. 过期时间TTL概述 过期时间TTL表示可以对消息设置预期的时间&#xff0c;在这个时间内都可以被消费者接收获取&#xff1b;过了之后消息将自动被删除。RabbitMQ可以对消息和队列设置TTL。 目前有两种方法可以设置。 第一种方法是通过队列属性设置&#xff0c;队列中所有消…

Ubuntu安装Apache教程

系统版本&#xff1a;Ubuntu版本 23.04 Ubuntu是一款功能强大且用户友好的操作系统&#xff0c;而Apache是一款广泛使用的Web服务器软件。在Ubuntu上安装Apache可以帮助用户搭建自己的网站或者进行Web开发。为大家介绍如何在Ubuntu上安装Apache&#xff0c;并提供详细的教程和操…

青云AI算力创新:直击AI落地痛点 打造企业数智化基石

在当今这个数字化、智能化的时代&#xff0c;企业数字化转型、智能化升级应用实践在加速&#xff0c;AI算力已经成为企业数字化转型和智能化升级的重要基石&#xff0c;而AI算力在推动技术创新和业务增长中起到了关键作用。青云科技近日举办的AI算力发布会&#xff0c;标志着AI…

Numpy模块中的ndarray对象属性、数组的重塑、合并、分割

一、ndarray对象属性介绍 说明&#xff1a;ndim属性返回数组的维度&#xff0c;即数组有多少个轴。例如&#xff0c;一维数组的ndim为1&#xff0c;二维数组的ndim为2&#xff0c;以此类推。 示例1&#xff1a; # coding:utf-8 import numpy as np wnp.array([[1,2,3],[4,5,6…