In programming, a class is a blueprint or template for creating objects that share similar characteristics and behaviors. It defines a set of attributes (properties) and methods (functions) that the objects of that class will have.
Think of a class as a recipe for making a specific type of object, like a cookie cutter for making cookies. The class describes the shape, size, and ingredients of the cookies, as well as the steps needed to bake them. When you use the class to create an object, it's like using the cookie cutter to cut out a cookie from the dough.
Each object created from the same class will have the same properties and methods, but the specific values of those properties may be different for each object.
Example:


.class public MyClass
.super java/lang/Object
# Fields
.field private myField:I
# Constructor
.method public constructor <init>()V
.registers 1
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
# Methods
.method public setMyField(I)V
.registers 2
.param p1, "value" # the value to set myField to
iput p1, p0, LMyClass;->myField:I
return-void
.end method
.method public getMyField()I
.registers 1
iget p0, LMyClass;->myField:I
return p0
.end method
In this example, we define a class called MyClass that extends the java/lang/Object class (which is the base class for all objects in Java/Smali). The class has a single field called myField of type int, a constructor that calls the superclass constructor, and two methods, setMyField and getMyField, that respectively set and retrieve the value of myField.
# Allocate memory for the object
# Getting referance of MyClass and store on v0
new-instance v0, Llab.seczone64/MyClass;
# Invoke the constructor of the class and creating object
invoke-direct {v0}, lab.seczone64/MyClass;->init
# Set the value of the myField field to 42
const/16 v1, 42
iput v1, v0, lab.seczone64/MyClass;->myField:I
In this example, we allocate memory for the object of MyClass and store it in register v0. We then invoke the constructor of MyClass using the invoke-direct instruction, passing v0 as the this parameter. Finally, we set the value of the myField field to 42 using the iput instruction.
Consider this example. We have an Interface named Human and a class with name Person which implement that interface.
package lab.seczone64.classedandobjectsinsmali.models;
import lab.seczone64.classedandobjectsinsmali.interfaces.Human;
public class Person implements Human {
private String name;
private int age;
private String gender;
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public int getAge() {
return age;
}
@Override
public void setAge(int age) {
this.age = age;
}
@Override
public String getGender() {
return gender;
}
@Override
public void setGender(String gender) {
this.gender = gender;
}
@Override
public void eat(String food) {
System.out.println(name + " is eating " + food);
}
@Override
public void sleep(int hours) {
System.out.println(name + " is sleeping for " + hours + " hours");
}
@Override
public void talk(String message) {
System.out.println(name + " says: " + message);
}
}
For create Person object and calling methods:
.method protected onCreate(Landroid/os/Bundle;)V
.locals 4
.param p1, "savedInstanceState" # Landroid/os/Bundle;
.line 14
invoke-super {p0, p1}, Landroidx/appcompat/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V
.line 15
sget v0, Llab/seczone64/classedandobjectsinsmali/R$layout;->activity_main:I
invoke-virtual {p0, v0}, Llab/seczone64/classedandobjectsinsmali/MainActivity;->setContentView(I)V
.line 17
new-instance v0, Llab/seczone64/classedandobjectsinsmali/models/Person;
const/16 v1, 0x1a
const-string v2, "male"
const-string v3, "Mohammad Hossein Ashofte Yazdi"
invoke-direct {v0, v3, v1, v2}, Llab/seczone64/classedandobjectsinsmali/models/Person;-><init>(Ljava/lang/String;ILjava/lang/String;)V
.line 23
.local v0, "mHossein":Llab/seczone64/classedandobjectsinsmali/models/Person;
const-string v1, "Pizza"
invoke-virtual {v0, v1}, Llab/seczone64/classedandobjectsinsmali/models/Person;->eat(Ljava/lang/String;)V
.line 24
const/4 v1, 0x6
invoke-virtual {v0, v1}, Llab/seczone64/classedandobjectsinsmali/models/Person;->sleep(I)V
.line 25
const-string v1, "Hi there."
invoke-virtual {v0, v1}, Llab/seczone64/classedandobjectsinsmali/models/Person;->talk(Ljava/lang/String;)V
.line 26
return-void
.end method
In Java, a static method is a method that belongs to a class rather than an instance of the class. This means you can call the method using the class name, without needing to create an object of the class.
How to define static method in smali: