免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
内容参考于:图灵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方法,抽象类还必须要有一个抽象方法,没有抽象方法会报错需要改成普通类