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

news2024/11/24 9:29:51

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

内容参考于:图灵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

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

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

相关文章

个性化、持续性阅读 学生英语词汇量自然超越标准

2024年秋季新学年,根据2022版《义务教育英语课程标准》全新修订的英语新版教材开始投入使用,标志着我国英语教育迈入了一个以应用为导向、注重综合素养培养的新阶段。 新版教材的变革不仅仅是一次词汇量的简单增加,更是一场从应试到应用的深…

三菱FX5U CPU简单CPU通讯

1、与搭载以太网的模块,以及与通信对象设备之间进行数据通信的功能。 2、可以使用以太网端口与通信对象设备进行连接,并以指定的时机对指定的软元件数据进行发送和接收。3、仅通过GX Works3进行简单的参数设置,即可以构建无程序的通信系统。 …

共模干扰的形成和滤除

1、共模就是共同对地的干扰: 如图,我们可以看到共模的原理图。UPQ就是共模电压,ICM1 ICM2 就是共模电流。 ICM1 ICM2 大小不一定相同,方向相同。 2、共模信号和差模信号的区别: 通常电源线有三根线:火线L、…

supabase链接vecs文档

使用Supabase链接本地数据库 Vecs 如何使用本地数据库工作。确保机器上安装了Supabase CLI。 # Initialize your project supabase init# Start Postgres supabase startSupabase vecs同步数据 vecs官方文档 创建集合 import vecs #下面这一行是本地的postgre数据库连接 #…

通过HTforWeb在ARMxy边缘计算网关上实现工业互联网

随着工业互联网技术的不断进步和发展,企业越来越重视通过数字化手段提高生产效率、降低成本并增强竞争力。ARMxy BL340系列作为一款高性能的工业级ARM嵌入式计算机,为实现这些目标提供了坚实的硬件基础。而HTforWeb作为一款专业的前端开发工具&#xff0…

OCR 通用端到端模型GOT

摘要 在人工智能领域,光学字符识别(OCR)技术已经取得了显著的进展。随着技术的不断进步,我们正迈向OCR 2.0时代。本文将介绍由Vary团队开发的通用端到端模型GOT,这一模型在OCR领域具有革命性的潜力。 论文概览 论文…

【Python 数据分析学习】Pandas的基础和应用(2)

题目 1 数据运算与分析1.1 算数和比较运算1.1.1 算数运算1.1.2 比较运算 1.2 数据排列1.3 统计分析1.3.1 基本的统计分析函数1.3.2 特殊的统计分析函数1.3.3 检查和处理空值 1.4 分组与聚合1.4.1 数据分组1.4.2 数据聚合 1.5 透视交叉表1.5.1 透视表1.5.2 交叉表 2 实战演练2.1…

【nginx】搭配okhttp 配置反向代理

nginx的默认是一个反向代理。 nginx会默认把输入的请求,转向其他的服务器执行。 这些转向的服务器与客户端发起的服务器不是同一个。 客户端只认识nginx,不知道ngiix转向何方。 正向代理修改okhttp的proxy,实际上很多代理都是正向的。 反向代理修改请求路径到nginx。 感觉还…

react-intl——react国际化使用方案

国际化介绍 i18n&#xff1a;internationalization 国家化简称&#xff0c;首字母首尾字母间隔的字母个数尾字母&#xff0c;类似的还有 k8s(Kubernetes) <br /> React-intl是 React 中最受欢迎的库。 使用步骤 安装 # use npm npm install react-intl -D # use yarn项目…

Weblogic部署

要安装weblogic&#xff0c;首先要有java环境&#xff0c;因此需要先安装jdk。 这里需要注意&#xff0c;weblogic版本不同&#xff0c;对应的jdk版本也不同&#xff0c;我在这里就踩了很多坑&#xff0c;我这里下载的是fmw_12.2.1.4.0_wls_lite_generic.jar对应的是jdk-8u333…

Minitab 的直方图结果分析解释

Minitab 的直方图结果分析解释 步骤 1&#xff1a;评估关键特征 检查分布的尖峰和散布。评估样本数量对直方图外观的影响。 标识尖峰&#xff08;即&#xff0c;条的最高聚类&#xff09;&#xff1a; 尖峰表示样本中最常见的值。评估样本的散布以了解数据的变异程度。例如…

1.1 计算机网络基本概述

欢迎大家订阅【计算机网络】学习专栏&#xff0c;开启你的计算机网络学习之旅&#xff01; 文章目录 前言一、网络的基本概念二、集线器、交换机和路由器三、互连网与互联网四、网络的类型五、互连网的组成1. 边缘部分2. 核心部分 六、网络协议 前言 计算机网络是现代信息社会…

时序必读论文08|ITransformer论文解读和我对时序工作未来的展望

论文标题&#xff1a;iTransformer: Inverted Transformers Are Effective for Time Series Forecasting 下载地址&#xff1a;https://arxiv.org/abs/2310.06625 开源代码&#xff1a;https://github.com/thuml/iTransformer 前言 ITransformer这篇文章我很早之前就留意到…

如何用Appium实现移动端UI自动化测试?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学习下Appium如何入门&#xff0c;那么我们就直奔主题。文章结构如下&#xff1a; 为什么要使用App…

java程序员入行科目一之CRUD轻松入门教程(一)

之前在操作MySQL的时候&#xff0c;都是采用Navicat&#xff0c;或者cmd黑窗口。 无论使用什么方式和MySQL交互&#xff0c;大致步骤是这样的 建立连接&#xff0c;需要输入用户名和密码编写SQL语句&#xff0c;和数据库进行交互 这个连接方式不会变&#xff0c;但是现在需要 基…

苹果系统(MacOS)中的Finder如何方便展现根目录

前言 初用Finder的时候&#xff0c;感觉非常的不方便。没有Windows的文件管理器来的简单明了。 本文&#xff0c;就是针对找不到文件根目录和隐藏文件夹的设置&#xff0c;进行了说明&#xff0c;供大家参考。 1、设置前 打开Finder&#xff0c;看不到DISK&#xff0c;也就是…

理解前向传播、反向传播和计算图

1. 什么是前向传播&#xff1f; 前向传播&#xff08;Forward Propagation&#xff09;是神经网络的推理过程。它将输入数据逐层传递&#xff0c;通过每一层的神经元计算&#xff0c;最终生成输出。 前向传播的公式 假设我们有一个简单的三层神经网络&#xff08;输入层、一…

一种简单的过某宝验证码的方式(仅做学习使用)

开篇 今天介绍一种简单的过某宝验证码的方式&#xff0c;用的是自动化&#xff0c;这样对不会js逆向的小白非常友好&#xff0c;只需要用到selenium框架就能轻松过某宝验证码&#xff0c;即模拟人的操作对滑块进行滑动。 但是首先还是需要训练验证码和标题 训练前&#xff1a…

各个大厂软件测试面试题,面试经验分享

前言 一、华为测试岗电话面试 一面 1&#xff09;自我介绍 2&#xff09;项目流程 >讲下H模型 3&#xff09;业务流程 >项目讲解、可从贷款流程讲起 4&#xff09;做过自动化吗&#xff1f; 5&#xff09;做过接口测试吗&#xff1f; 可从postman和jmeter做手工接口测…

数业智能心大陆探索生成式AIGC创新前沿

近日&#xff0c;数业智能心大陆参与了第九届“创客中国”生成式人工智能&#xff08;AIGC&#xff09;中小企业创新创业大赛。在这场汇聚了众多创新力量的研讨过程中&#xff0c;广东数业智能科技有限公司基于多智能体的心理健康技术探索与应用成果&#xff0c;从众多参赛者中…