Java 类和对象

Java 类和对象

文章目录

类和对象

  1. Java当中一切皆对象
  2. 对象是什么呢?
    比如是一个人,手机等
  3. 怎么描述对象呢?
    可以用类描述对象,可以理解类为一个模版,用这个模版存储对象的属性
  4. Java中只能有一个public类,其他为普通类
  5. 面向对象的核心:
    找对象
    创建对象
    使用对象
  6. 什么是面向对象?
    面向对象是一种解决问题的思想,主要通过对象之间的交互完成一件事情,不用考虑细节问题,只关注对象本身
  7. 什么是面向过程
    面向过程需要考虑细节和中间的每一步
// 语法class 类名 {}// 类名都用大驼峰classAst{// 普通成员变量publicString name;publicint age;// 静态成员变量 属性 字段// 静态成员变量不在对象当中publicstaticint a =-10;// 普通成员方法 行为publicintfunc(){}// 静态成员方法publicstaticintfunc2(){}}publicstaticvoidmain(String[] args){// 用类实例化出一个对象Ast p =newAst();}

每一个类都会产生一个字节码文件


在这里插入图片描述

实例化对象

  1. 什么叫做实例化对象
    用一个类类型创建一个对象的过程就叫类的实例化
在这里插入图片描述


2. 每一个对象都会存对应的变量,而方法存在于方法区,可以用new 关键字实例化出多个对象,实例化出的对象才实际占用物理空间

在这里插入图片描述


3. 通过点访问对象的属性,调用对象的方法

publicclass test666 {publicstaticvoidmain(String[] args){Dog dog =newDog(); dog.name ="小七"; dog.color ="红色"; dog.print(); dog.name ="小八"; dog.color ="黄色"; dog.print();}}classDog{publicString name;publicString color;publicvoidprint(){System.out.println(name +" ");}}

this

  1. this用来确定是哪个对象,才好给对象进行调用赋值

成员方法中有隐藏的this
局部变量会给局部变量自己赋值,局部变量优先,变量名一样的,不知道是给对象赋值的,所以建议都加上this

在这里插入图片描述
classDate{// 形参名和成员变量名相同了publicvoidsetDate(int year,int month,int day){this.year = year;this.month = month;this.day = day;}}
  1. this代表当前对象的引用,this引用的是调用成员方法的对象,this只能在成员方法中使用
classDate{publicint year;publicint month;publicint day;publicvoidsetDate(Datethis,int year,int month,int day){this.year = year;this.month = month;this.day = day;}}classpublicvoidmain(String[] args){Date date1 =newDate(); date1.setDate(1900,10,1);// this对当前对象进行使用Date date2 =newDate(); date2.setDate(2000,10,1);}

构造和初始化

  1. 就地初始化,不显示地给值的话,都使用张三和9
classDate{// 就地初始化int year =1900;int month =10;int day =1;publicvoidprint(){System.out.println("年 "+ year +" 月 "+ month +" 日 "+ day);}}publicclass test {publicstaticvoidmain(String[] args){Date date =newDate(); date.print();}}
在这里插入图片描述


2. 成员变量不初始化的时候给定一个默认值,引用类型为null,boolean类型为false,其他基本类型为0值

在这里插入图片描述
  1. 构造方法进行初始化
    没有返回值
    方法名和类名相同
classStudent{publicString name;publicint age;// 构造方法publicStudent(){this.name ="鼠标";this.age ="10";System.out.println("Student()");}publicStudent(String name,int age){this.name = name;this.age = age;}}publicstaticvoidmain(){Student student =newStudent();}
  1. 显示写了构造方法就不会提供默认构造的方法
  2. 构造方法只有在实例化对象的时候才会被调用,因此生命周期内只调用一次
  3. 构造方法有什么作用呢?
    构造方法对对象中的成员进行初始化,不开辟空间,空间在构造之前就开辟好了
  4. 调用其他构造方法,只能在构造方法当中写,下图中this表示的就是Student,并且这个构造方法只能出现在该构造方法的第一行,还有就是this()这会报错,自己调用自己

构造方法是如何被调用的呢?
在进行new对象的时候就调用构造方法进行初始化对象的属性

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


9.this表示当前对象的引用,在分配完内存之后就产生了这个this,就可以使用这个this了,而不是在初始化对象完之后产生

在这里插入图片描述


10. 调用不能成环

在这里插入图片描述

封装

  1. 什么是封装?
    封装是数据和操作数据的方法的有机结合,隐藏对象的属性和实现的细节,仅对外公开接口和对象进行交互

访问修饰限定符

  1. 封装在语法层面:被private修饰的成员方法和成员变量只能在当前类中使用
classPerson{privateString name;privateint age;publicPerson(){}publicPerson(String name,int age){this.name = name;this.age = age;}// 利用方法隐式地设置对象的属性和或得对象的属性publicStringgetName(){returnthis.name;}publicvoidsetName(String name){this.name = name;}}publicstaticvoidmain(){Person person =newPerson(); person.setName("张三");System.out.println(person.getName());}

包访问权限,也叫default(什么修饰符也不写的,默认的)

在这里插入图片描述

  1. 包:其实是为了更好地组织和管理类的,让类不那么混乱,包可以理解为文件夹
  2. 包是对类和接口封装的体现,是一种对类和接口等很好的组织方式
  3. 为了更好的管理类,把多个类收集在一起成为一组,称为软件
  4. 在同一个工程中允许存在相同名称的类,只要处在 不同的包中即可
在这里插入图片描述


5. 导入包中的类,例如可以导入日期类

publicstaticvoidmain(String[] args){java.util.Date date =newjava.util.Date();System.out.println(date.getTime());}

这样还是太麻烦了,可以用import导入包

importjava.util.Date;publicstaticvoidmain(String[] args){Date date =newDate();System.out.println(date.getTime());}

如果要使用java的其他类可以使用

importjava.util.*;

有时需要显示地写出要使用的类,避免冲突,两个包下有相同名字的类

importjava.util.*;importjava.sql.*;publicclassTest{publicstaticvoidmain(String[] args){// util 和 sql 中都存在一个 Date 这样的类, 此时就会出现歧义, 编译出错Date date =newDate();System.out.println(date.getTime());}}

在这种情况下需要使用完整的类名

import.java.util.*;import.java.sql.*;publicclassTest{publicstaticvoidmain(String[] args){java.util.Date date =newjava.util.Date();System.out.println(date.getTime());}}

可以使用 import static 导入包中静态的方法和字段

importstaticjava.lang.Math.*;publicclassTest{publicstaticvoidmain(String[] args){double x =30;double y =40;// 静态导入的方式写起来更方便一些.//double result = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));double result =sqrt(pow(x,2)+pow(y,2));System.out.println(result);}}

总结:包就是一个文件夹,文件夹下面有很多类,类里面有方法
和C语言的头文件不同,C语言是把所有的头文件导过来生成点i文件,java使用哪个类就导哪个类

自定义包

  1. 包一般是小写,通常会用公司的域名的颠倒形式 (com.baidu.www)
  2. 在包下面新建一个类

新建一个包

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


4. 包名要和代码路径相匹配 . 例如创建 com.baidu.www 的包 , 那么会存在一个对应的路径 com/baidu/www 来存储代码 .
5. 如果一个类没有 package 语句 , 则该类被放到一个默认包中(例如src就是一个默认的包)

static

  1. 静态成员变量不属于我们的对象,静态成员变量为同一份,是所有对象共享的,是类方法
  2. 可以通过对象调用,也可以通过类名 . 静态方法名 (…) 方式调用,更推荐使用后者
  3. 静态成员变量存在方法区当中
  4. 生命周期:类加载就有了,类卸载就销毁
classStudent{publicstaticString classRoom ="333";}publicstaticvoidmain(String[] args){Student student =newStudent();System.out.println(Student.classRoom);}
  1. 静态方法中不包含this,this属于对象的引用,而静态方法不需要对象,能用类名直接访问
  2. 不能在静态方法中直接访问任何非静态成员变量

代码块

  1. 使用 {} 定义的一段代码称为代码块
  2. 普通代码块
    构造块
    静态块
    同步代码块
  3. 静态代码块
classStudent{publicstaticString classRoom;}// 静态代码块进行初始化静态成员// 类加载的时候静态代码块就被调用了static{ classRoom ="333";}// 调用静态成员,即可调用静态代码块publicstaticvoidmain(String[] args){System.out.println(Student.classRoom);}
  1. 实例代码块/构造代码块
publicclassStudent{//实例成员变量privateString name;privateString gender;privateint age;privatedouble score;publicStudent(){System.out.println("I am Student init()!");}//实例代码块,对实例成员进行初始化{this.name ="bit";this.age =12;this.gender ="man";System.out.println("I am instance init()!");}publicvoidshow(){System.out.println("name: "+name+" age: "+age+" sex: "+gender);}}
在这里插入图片描述


5. 普通代码块

publicclassMain{publicstaticvoidmain(String[] args){//普通代码块{int x =10;System.out.println("x1 = "+x);}int x =100;System.out.println("x2 = "+x);}}

Read more

Flutter for OpenHarmony: Flutter 三方库 sanitize_html 彻底杜绝 XSS 注入风险(鸿蒙 Web 内容安全净化)

Flutter for OpenHarmony: Flutter 三方库 sanitize_html 彻底杜绝 XSS 注入风险(鸿蒙 Web 内容安全净化)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在开发 OpenHarmony 应用时,如果我们需要在 UI 中渲染来自后端的 HTML 内容(例如文章正文、用户评论),或者使用 flutter_html 等库,一个致命的安全风险就是 XSS (跨站脚本攻击)。恶意代码可能会通过 <script> 标签或 onerror 属性在你的 App 内执行非法逻辑。 sanitize_html 是一个轻量级且极高效的 HTML 净化库。它采用白名单机制,能瞬间过滤掉所有不安全的标签和属性,确保你在鸿蒙 App 内渲染的每一行 Web 内容都是绝对安全的。 一、核心防御机制解析 sanitize_html 遵循“默认拒绝”

By Ne0inhk
【前端】win11操作系统安装完最新版本的NodeJs运行npm install报错,提示在此系统上禁止运行脚本

【前端】win11操作系统安装完最新版本的NodeJs运行npm install报错,提示在此系统上禁止运行脚本

🌹欢迎来到《小5讲堂》🌹 🌹这是《前端》系列文章,每篇文章将以博主理解的角度展开讲解。🌹 🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!🌹 目录 * 前言 * 解决方案 * 方法1:以管理员身份运行 PowerShell 并更改执行策略 * 方法2:只为当前会话临时允许 * 方法3:使用命令提示符 (CMD) * 方法4:绕过策略执行单个脚本 * 推荐解决方案 * Node.js 详细介绍 * 什么是 Node.js? * 核心特点 * 1. **非阻塞 I/O 和事件驱动** * 2. **单线程但高并发** * 架构组成 * 1. **V8 JavaScript 引擎** * 2. **LibUV 库** * 3. **核心模块** * 安装与使用

By Ne0inhk
排序算法(1)

排序算法(1)

先赞后看,养成习惯!!! ^ _ ^ ❤️ ❤️ ❤️ 码字不易,大家的支持就是我坚持下去的动力,点赞后不要忘记关注我哦 个人主页:伯明翰java 文章专栏:数据结构和算法 如有错误,请您指正批评 ^ _ ^ 什么是排序 排序:所谓排序,就是使⼀串记录,按照其中的某个或某些关键字的⼤⼩,递增或递减的排列起来的 操作 稳定性:如果待排序的一组数据中,有多个相同的数据,经过排序后如果这些相同数据的相对次序不变就是稳定排序,如果相对次序发生变化就是不稳定排序 注:如果这个排序算法是稳定的,它可以变成不稳定排序,如果是不稳定排序,它变不成稳定排序 常见的排序算法 常见排序算法实现 插入排序 直接插⼊排序是⼀种简单的插⼊排序法,其基本思想是:把待排序的记录按其关键码值的⼤⼩逐个插⼊到⼀个已经排好序的有序序列中,直到所有的记录插⼊完为⽌,得到⼀个新的有序序列。 当插⼊第i(i>=1)

By Ne0inhk
【希尔排序算法】详解:原理、实现与优化

【希尔排序算法】详解:原理、实现与优化

【希尔排序算法】详解:原理、实现与优化 * 一、算法概述 * 基本特性 * 二、算法原理详解 * 核心思想 * 增量序列选择 * 三、算法流程图示 * 示例数组:[8, 9, 1, 7, 2, 3, 5, 4, 6, 0] * 初始状态 * 第一轮:gap=5 * 第二轮:gap=2 * 第三轮:gap=1(标准插入排序) * 四、完整Java实现 * 五、算法分析 * 时间复杂度分析 * 空间复杂度 * 稳定性 * 六、实际应用场景 * 七、与其他排序算法的对比 * 八、总结 🌺The Begin�

By Ne0inhk