5.安卓逆向-java面向对象

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

内容参考于:图灵Python学院

上一个内容:4.安卓逆向-常用数据结构java语言中的集合

之前的内容写了java语言常用的数据结构(数据类型),也就是List、Set、Map这三个数据结构(数据类型),本次和前面的内容混个眼熟就行,主线是逆向,逆向对编程语言(java语言)要求不高认识就行,本次是java中最后一个核心面向对象

面向对象的意思和作用就不写了(写多了也看不下去),这些概念性的不写点代码根本想象不出来描述的是什么东西,脑子里完全就没有画面,所以会把一些很抽象的概念省略,通过看代码的方式来掌握(如果感觉会写代码或看得懂代码,但不知道什么概念不知道什么专业名字这是正常的,就没打算达到这个效果,主线是逆向,概念是正向要搞的对于逆向不重要)

不用担心下方代码看不懂导致玩不会逆向,下方和之前的内容只要过一遍(随便看)就行,逆向的过程会写的超级细,全程超傻瓜模式

下方代码需要复制,挨个运行一遍,看看结果

声明一个类,java中类就是一个面向对象的具象化,如下图的代码,类这个字也很抽象,直接看具象化(下方的代码)从main方法开始看

// class声明类的单词,ClallDemo类的名字,类是面向对象的具象化
// 类是用来描述某一个东西的
public class ClallDemo {
    //变量
    String name; // 类里面的变量
    int age;
    // 方法
    // 类里面的方法,方法的意思就是一块代码,方法避免了重复写相同逻辑的代码,也就是给相同逻辑的代码起了一个名字
    // 等看到方法的使用就能明白了
    public void call() { 
        System.out.println(name + "正在打电话");
    }
    public void message() {
        System.out.println(name + "今年" + age + "岁了");
    }
	
    public static void main(String[] args) {
        // new ClallDemo()意思是创建一个ClallDemo类(类型),或者说创建一个ClallDemo类型的对象
        // ClallDemo t = new ClallDemo();就是面向对象的具象化
        // 后面只要写面向对象,指的就是类
        // 然后这个t是用来接收(这里的接收可以理解为面向)对象的,然后通过t这个名字就可以使用ClallDemo类型来处理数据
        ClallDemo t = new ClallDemo(); 
        // 调用变量
        t.name = "小明";
        t.age = 18;
        // 调用方法
        t.call(); // 使用方法
        t.message();
        // 若不需要对象名,也可以直接使用对象
        new ClallDemo().message();
    }
}

然后还有一个构造方法的东西,构成方法可以理解为创建某个类型时执行的代码

class Person {
    // 实例变量
    public String name;
    public Integer age;

    // 构造方法1
    public Person() {
        this.name = "Eric";// 执行 new Person() 这个代码就会跳到这里来到这里执行
        this.age = 99999;
    }
}

Person obj = new Person();

然后还有相同名字,执行不同代码的方式,这个被称为重载,从main方法开始看

class Person {

    // 实例变量
    public String name;
    public Integer age;
    public String email;
    // 私有成员变量只能在类的内部进行直接赋值,而不能在类的外部或子类中直接访问
	private String count;
    
    // 构造方法1
    public Person() {// 通过入参不同,实现相同名字,入参就是括号里的东西
        this.name = "xialuo";
        this.age = 99999;
    }

    // 构造方法2
    public Person(String name, Integer age) {// 通过入参不同,实现相同名字,入参就是括号里的东西
        this.name = name;
        this.age = age;
        this.email = "xxx@live.com";
    }

    // 构造方法3
    public Person(String name, String email) {// 通过入参不同,实现相同名字,入参就是括号里的东西
        this.name = name;
        this.age = 83;
        this.email = email;
    }
	
    // 定义方法(重载)
    public void doSomething() {// 通过入参不同,实现相同名字,入参就是括号里的东西
        System.out.println(this.name);
    }

	// 定义方法(重载)
    public void doSomething(String prev) {// 通过入参不同,实现相同名字,入参就是括号里的东西
        String text = String.format("%s-%s", prev, this.name);
        System.out.println(text);
    }
    
}

public class Hello {

    public static void main(String[] args) {
		
        // 创建对象
        Person p1 = new Person();
        Person p2 = new Person("xialuo", 73);
        Person p3 = new Person("tony", "xialuo@xxx.com");
		
        p1.doSomething();
        p1.doSomething("你好呀,");

        p2.doSomething();
        p2.doSomething("你好呀,");
        
        p3.doSomething();
        p3.doSomething("你好呀,");
    }
}

静态变量静态方法,静态变量有点特殊,从main方法开始看

class Persons1 {

    // 静态变量
    public static String city = "北京";
    // 当一个变量被final修饰时,表示该变量的值不能被修改
    public final String color = "red";

    // 实例变量
    public String name;
    public Integer age;

    // 构造方法1
    public Persons1() {
        this.name = "xialuo";
        this.age = 99999;
    }

    // 绑定方法
    public void showInfo(){
        System.out.println("哈哈哈哈");
    }

    // 静态方法
    public static void showData(){
        System.out.println("哈哈哈哈");
    }
    // 实例方法
    public String showInfos(){
        return  "实例方法";
    }
    // 静态方法
    public static String showInfos1(){
        return  "hello world";
    }
}

public class Person {

    public static void main(String[] args) {
        System.out.println(Persons1.city);
        Persons1.showData();
        Persons1 obj = new Persons1();
        System.out.println(obj.name);
        System.out.println(obj.age);
        obj.showInfo();
        obj.showInfos();

        Persons1.city = "aaaaa";
        System.out.println(obj.city);


    }
}

运行结果:可以发现静态变量是所有类型共用的,并且不需要创建对象就可以使用静态变量(静态方法也能使用)

然后继承,继承是为了解决避免重复写多个类型共有的变量(包含静态和非静态)和方法(包含静态和非静态)

// 父类
class Bases {
    public String email;
	public static String sssss;
    public Bases(String email) {
        this.email = email;
    }

    public void getSubInfo() {
        System.out.println("111");
    }

}

// 子类,Bases类
class Persons extends Bases {
    public String name;
	public int age;
    
    public Persons(String name, Integer age, String email) {
        super(email);// 执行父类的构造方法
        this.name = name;
        this.age = age;
    }

    public void getSubInfos() {
        System.out.println("222");
    }
}

// 子类,Bases类
class CCCC extends Bases {
    public String bbbb;
	public int aaaa;
    
    public Persons(String name, Integer age, String email) {
        super(email);// 执行父类的构造方法
        this.bbbb = name;
        this.aaaa = age;
    }

    public void getSubInfos() {
        System.out.println("222");
    }
}

public class Main {
    public static void main(String[] args) {
        Persons persons = new Persons("hello",20,"www.xialuo.com");
        CCCC cc = new CCCC("hhhh",70,"www.x33333uo.com");
        System.out.println(cc.city);
        persons.getSubInfo();  // 继承自Bases类的方法
        persons.getSubInfos(); // 子类中定义的方法
    }
}

实例2:

class Base {
    public void show() {
		System.out.println("111");
    }
}

class Person extends Base {
	public void show() {
		System.out.println("222");
    }
}

Person v1 = new Person();
v1.show(); // 222

Base v2 = new Base();
v2.show(); // 111

Base v3 = new Person();
v3.show();  // 222

实例3:从main方法开始看

class Base {
    public String email;

    public Base(String email) {
        this.email = email;
    }

    public void getSubInfo() {
		System.out.println("111");
    }
}

// Person类继承Base类
class Person extends Base {

    public String name;

    public Person(String name, Integer age, String email) {
        super(email);// 执行父类的构造方法
        this.name = name;
    }
	
     public void getSubInfo() {
		System.out.println("222");
    }
}

public class Hello {
	
    public static void handler(Base v1){
        v1.getSubInfo();
    }
    
    // 主函数
    public static void main(String[] args) {
        Person obj1 = new Person("xialuo",19,"xxx@live.com");
		handler(obj1); // 222

        Base obj2 = new Base("xialuo@live.com");
        handler(obj2); // 111

        Base obj3 = new Person("xialuo",19,"xxx@live.com");
        handler(obj3); // 222
    }
    
}

接口:从main方法开始看

interface IMessage { // 使用 interface单词定义一个接口,interface IMessage意思是创建一个叫IMessage的接口
    public void send();
}

// Wechat类"实现"了Imessage接口
class Wechat implements IMessage {
    public void send() {
        System.out.println("发送微信");
    }
}

class DingDing implements IMessage {
    public void send() {
        System.out.println("发送钉钉");
    }
}

class Sms implements IMessage {
    public void send() {
        System.out.println("发送短信");
    }
}

IMessage v1 = new Wechat();
public class Hello {
	public static void handler(IMessage v1){
        v1.send();
    }
    
    // 主函数
    public static void main(String[] args) {
       DingDing v1 = new DingDing();
       handler(v1);
    }
}
interface IPerson {
    public void f1();

    public void f1(int age);

    public void f2(String info);
}

interface IUser {
    public String f3(int num);
}

class Base {
    public String name;
    public Integer age;
    public String email;

    public Base(String name, Integer age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }

    public String getSubInfo() {
        return String.format("%s", this.email);
    }
}

class Person extends Base implements IUser, IPerson {// 可以实现(implements)多个接口,但只能继承(extends)一个类

    public Person(String name, Integer age, String email) {
        super(name, age, email);
    }

    public String getInfo() {
        return String.format("%s-%d-%s", this.name, this.age, this.email);
    }


    public void f1() {
        System.out.println("F1,无参数");
    }

    public void f1(int age) {
        System.out.println("F1,age参数");
    }

    public void f2(String info) {
        System.out.println("F2");
    }

    public String f3(int num) {
        return "哈哈哈";
    }
}

public class Hello {

    public static void main(String[] args) {
        Person p = new Person("日天", 83, "ritian@live.com");
        p.f1();
    }
}

抽象:它和类一样,它和类的区别是它不能使用new创建对象

// 抽象类
abstract class Base {// abstract让类变成抽象类

    // 抽象方法(约束子类中必须有这个方法)
    public abstract void play(String name);

    // 普通方法
    public void stop() {
        System.out.println("Stop");
    }
}

class Son extends Base{
    public void play(String name){ // 实现Base类中的play方法
        // ...
    }
}

Son obj = new Son();
obj.stop();
obj.play();

Base obj1 = new Son();

效果:如果对抽象类使用new就会报错,它会说没有实现play方法,抽象类还必须要有一个抽象方法,没有抽象方法会报错需要改成普通类


img

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

海外云服务器安装 Redis 6.2.x (Ubuntu 18.04 记录篇三)

本文已首发于 秋码记录 通过前两篇的实践,我们已然在海外云服务器/VPS安装了JDK和MariaDB数据库,一个能够运行Java项目的海外云服务器/VPS算是告一段落了。 然而,在这请求量与日俱增的情况下,MariaDB数据库显然是在超负债的工作…

Linux shell编程学习笔记80:gzip命令——让文件瘦身

0 引言 在 Linux shell编程学习笔记76:tar命令——快照 & 备份(上)-CSDN博客 Linux shell编程学习笔记77:tar命令——快照 & 备份(下)_linux 系统快照-CSDN博客 Linux shell编程学习笔记78&am…

10万人服务器配置如何选择?10w并发量配置架构

10万并发量的应用如何选择阿里云服务器配置?首先要选择云服务器ECS实例规格,因为是10万并发量需要配置负载均衡,而且还要使用缓存技术,阿里云服务器网aliyunfuwuqi.com从阿里云官网整理的关于阿里云10万并发量服务器配置和案例分享…

哈工大“计算机设计与实践”(cpu)处理器实验设计报告

哈工大“计算机设计与实践”(cpu)处理器实验设计报告 【哈工大“计算机设计与实践”(cpu)处理器实验设计报告】 在计算机科学领域,CPU(中央处理器)是计算机系统的核心部件,负责执行指…

【我的 PWN 学习手札】Fastbin Double Free

前言 Fastbin的Double Free实际上还是利用其特性产生UAF的效果,使得可以进行Fastbin Attack 一、Double Free double free,顾名思义,free两次。对于fastbin这种单链表的组织结构,会形成这样一个效果: 如果我们mallo…

如何下载各个版本的tomcat-比如tomcat9

1,找到tomcat官网https://tomcat.apache.org/ Apache Tomcat - Welcome! 找到tomcat9,或者archives 1.1,找到对应版本 1.2,找到小版本 1.3,找到bin 2,Index of /dist/tomcat/tomcat-9/v9.0.39/bin 2.1&a…

【知识图谱】3.Protege下载安装

一、Protege 1.相关介绍 Protg软件是斯坦福大学医学院生物信息研究中心基于Java语言开发的本体编辑和知识获取软件,或者说是本体开发工具,也是基于知识的编辑器,属于开放源代码软件。 这个软件主要用于语义网中本体的构建,是语义…

烂番茄96%高分恐怖片来袭,吓到连呼吸都小心

今年的恐怖片市场中,出人意料地杀出了一匹黑马,一部名叫《咒物寻凶》的爱尔兰小成本电影在大牌影片扑街的背景下异军突起,成为不少恐怖片爱好者口中的惊喜之作。这部由达米安麦卡锡执导的电影虽然制作成本有限,却凭借独特的民俗恐…

9天也能养成ins账号!超详细操作指南

Instagram,作为全球最受欢迎的社交媒体平台之一,为跨境电商卖家们提供了一个展示产品、吸引潜在客户的绝佳舞台。然而,受限于ins的规则,要想在这个平台上进行产品的宣传并非易事。 这就是为什么我们需要精心培养一个ins账号&#…

F1C100S/F1C200S的资料来源说明

文章目录 常用板子开源创客荔枝派榴莲派 我想说是的官网啥资料都没有。但是它的资料又很多,从淘宝或者其他地方能都搜到很多。 http://wiki.lcmaker.com/index.php?titleLC-PI-200S https://github.com/peng-zhihui/Planck-Pi?tabreadme-ov-file#head4 http://do…

[苍穹外卖]-10WebSocket入门与实战

WebSocket WebSocket是基于TCP的一种新的网络协议, 实现了浏览器与服务器的全双工通信, 即一次握手,建立持久连接,双向数据传输 区别 HTTP是短连接, WebSocket是长连接HTTP单向通信, 基于请求响应模型WebSocket支持双向通信 相同 HTTP和WebSocket底层都是TCP连接 应用场景…

基于Java+SpringBoot+Vue+MySQL的西安旅游管理系统网站

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于SpringBootVue的西安旅游管理系统网站【附源码文档】、…

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下&a…

视频监控基础学习

IPC:网络摄像机 NVR:网络硬盘录像机产品,搭配IPC使用。集成存储、解码显示、拼接控制、智能分析等多种功能于一体。一机多用,部署简单,功能齐全。安全可靠,适用于各类场景。 ONVIF协议:网络摄像…

Docker:对已有的容器,对当前容器映射的端口实时 (增删改查)

首先我的docker已经起了一个容器,我突然想把他的80->80映射的端口改成80->8080 但是我不想去新启动容器,想在现有容器基础上去修改,或者我想删除某个端口映射(只是大概思路) 如何寻找容器配置文件位置 首先我这…

代码随想录27期|Python|Day54|​单调栈|​42. 接雨水|84. 柱状图中最大的矩形

42. 接雨水 根据常识可以归纳出,对于每一列所能够存住的水的高度 Height min(LeftMax, RightMax) - height 也就是,当前列的存水高度 左侧和右侧柱子的最大高度的较小值,减去当前列的柱子高度,所得到的差值。 可以验证第4列&…

如何通过OceanBase的多级弹性扩缩容能力应对业务洪峰

每周四晚上的10点,都有近百万的年轻用户进入泡泡玛特的抽盒机小程序,共同参与到抢抽盲盒新品的活动中。瞬间的并发流量激增对抽盒机小程序的系统构成了巨大的挑战,同时也对其数据库的扩容能力也提出了更高的要求。 但泡泡玛特的工程师们一点…

【系统架构师】-论文-2024-2009年系统架构师历年论文题目

2024年5月 大数据Lambda架构的应用与分析 云原生云上DevOps运维应用与分析 模型驱动软件开发方法与应用 论单元测试在软件回归测试中的应用和分析 2023年 论面向对象设计的应用与实现 论多数据源集成的应用与实现 论软件可靠性模型的设计与实现 论边缘计算技术的设计与实现 …

【Linux】3.切换操作系统

文章目录 1. 为什么要切换操作系统2. 如何备份操作系统文件3.如何切换操作系统4. 在Ubuntu操作系统中恢复文件 1. 为什么要切换操作系统 由于CentoS官方宣布不再维护了,为了避免服务器安全和各类环境问题,我将云服务器改为Ubuntu操作系统。 Ubuntu 不仅…

HarmonyOS开发实战( Beta5.0)自动生成动态路由实践

鸿蒙HarmonyOS开发往期必看: HarmonyOS NEXT应用开发性能实践总结 最新版!“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通) 介绍 本示例将介绍如何使用装饰器和插件,自动生成动…