freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

JAVA代码审计之类和对象(4)
FreeBuf_389378 2022-05-12 18:11:01 98363

面向对象的思想

结构化开发(面向过程)

面向功能分软件结构;;

自顶而下;

最小的子系统是方法。

面向对象开发

把软件系统开成各种对象的集合;

系统结构相对稳定;

子系统相对独立;

面向对象的思想就是不断创建对象、使用对象、指挥对象做事情。

例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用不同的方法来实现。

面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定 可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了多个步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。

类和对象的概述

成员变量 :事物的属性(事物描述的信息)

成员方法 : 事物的行为 (行为:事物能做什么)

类:一组相关属性和行为的集合

对象:类的一种具体体现

定义类就是定义类的成员(成员变量和成员方法)

对象的创建

类名 对象名 = new 类名();

类名 对象名  :这个的解释是创建名称为“对象名”的“类名”类引用变量

new    : 这个的解释是实例化对象

类名()      :这个的解释是无参数构造方法;

new 类名()    :就是说以无参数构造方法实例化对象;

类名 对象名=new 类名()  :用指针的解释就是:以无参数构造方法实例化对象并将这个对象的内存引用赋给“类名”类的“对象名”引用变量

引用类属性 : 对象名.属性

引用类方法 : 对象名.方法名()

package com.anq.core;

public class StudenTest {
    public static void main(String[] args) {
    Student stu = new Student();   //创建对象
		//使用对象
    stu.name = "张三";
    stu.stuStudy();
    stu.stuEat();

    }
}

class Student{
    //定义属性
    String name;
    int age;

    //定义方法
    public void stuStudy() {
        System.out.println(name + "正在学习");
    }

    public void stuEat(){
        System.out.println(name + "正在吃饭");
    }
}

1652349492_627cda340198e4644096d.png!small?1652349492213

方法的定义

没有返回值情况。

public void 方法名(){
	//方法体
}

如果方法没有返回值,返回值的类型为void,

有返回值情况。

public 返回类型 方法名(){
		//方法体
}

如果方法有返回值,方法中必须有return关键字,返回值类型为该值的类型。

package com.anq.core;

public class CalcTest {
    public static void main(String[] args) {
        CalcTest ct = new CalcTest();
        ct.add();
        System.out.println(ct.add1());
    }
    //无返回值
    public  void  add(){
        int num1 = 100;
        int num2 = 200;
        System.out.println(num1+num2);
        save();   //类间的方法可以相互调用,不需要定义
    }
    //有返回值
    public  int  add1(){
        int num1 = 100;
        int num2 = 200;
        return  num1 + num2;
    }
    public  void  save(){
        System.out.println("调用save方法");
    }
}

1652349537_627cda615e9b571a1b9e6.png!small?1652349537621

有参构造

基本数据类型传参

当参数是基本类型时,传递参数的值,比如传递i = 10,真实传参时,把10赋值给了形参。

package com.anq.core;

/**
 * 增加学生信息,保存在数组中
 * 指定查找区间,来查找学生姓名
 */
public class SearchUser {
    String[] names = new String[5];
    //添加学生姓名
    public void add(){
        names[0] = "张三";
        names[1] = "李四";
        names[2] = "王五";
        names[3] = "燕六";
        names[4] = "谢七";

    }

    /**
     * 查询指定区间
     * @param start 起始区间
     * @param end   结束区间
     */
    public void search(int start, int end){
        for (int i =start-1 ; i < end ; i++){
            String name = names[i];
            System.out.println(name);
        }
    }

}
package com.anq.core;

public class SeachTest {
    public static void main(String[] args) {
        SearchUser user = new SearchUser();

        user.add();
        System.out.println(user.names.length);

        //查询2~4位学生的信息
        user.search(2,4);

    }
}

1652351365_627ce18509d4f01aa0099.png!small?1652351365303

引用数据类型传参数

当参数是对象时,传递的是对象的值,也就是对象的首地址。就是把对象的地址赋值给了形参。

package com.anq.core;

public class StudenTest {
    public static void main(String[] args) {
    Student stu = new Student();   //地址值
    stu.name = "李三";
    System.out.println("stu:" +stu);

    Student stu1 = new Student();  //地址值
    System.out.println("stu1:"+ stu1);
    stu1.name = "张四";
    stu1.stuSleep(stu);
    stu1.stuSleep(stu1);
    }
}

class Student{
    //定义属性
    String name;

    public void stuSleep(Student s){   //对象的地址赋值给了形参,对象的值
        System.out.println(s + "正在睡觉");
        System.out.println(s.name + "正在睡觉");
        s.name = "黄五";
        System.out.println(s + "正在睡觉");
        System.out.println(s.name + "正在睡觉");

    }
}


1652351432_627ce1c867ac4d160a35e.png!small?1652351432953

匿名对象的概述及应用

匿名对象只合适对方法的一次调用,调用多次就会产生多个对象,

匿名函数可以调用属性,调用后会变成垃圾回收,没有意义。

package com.anq.core;

public class CarTest {
    public static void main(String[] args) {
        //正常情况下
        Car c1 = new Car();

        c1.run();

        //匿名
        new Car().run();
        new Car().run();
        new Car().run();
    }
}
class Car{

    public void run(){

        System.out.println(a + "车正在运行");
    }
}

1652349942_627cdbf697575fab9cf40.png!small?1652349942948

# web安全 # Java代码审计
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 FreeBuf_389378 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
Java代码审计
FreeBuf_389378 LV.3
这家伙太懒了,还未填写个人描述!
  • 7 文章数
  • 34 关注者
JAVA代码审计之数据类型与运算符(2)
2022-05-12
JAVA代码审计之数组的基本操作(3)
2022-05-11
常见webshell工具及特征分析
2022-03-13
文章目录