免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
内容参考于:图灵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;// 构造方法1public 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;// 构造方法1public Person() {// 通过入参不同,实现相同名字,入参就是括号里的东西this.name = "xialuo";this.age = 99999;}// 构造方法2public Person(String name, Integer age) {// 通过入参不同,实现相同名字,入参就是括号里的东西this.name = name;this.age = age;this.email = "xxx@live.com";}// 构造方法3public 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;// 构造方法1public 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(); // 222Base v2 = new Base(); v2.show(); // 111Base 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); // 222Base obj2 = new Base("xialuo@live.com");handler(obj2); // 111Base 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方法,抽象类还必须要有一个抽象方法,没有抽象方法会报错需要改成普通类