Programmazione ad oggetti (OOP) in Android

La programmazione orientata agli oggetti aiuta a semplificare i problemi complessi del mondo reale in oggetti più piccoli, per progettare applicazioni completamente riutilizzabili con meno codice e tempi di sviluppo più brevi. È più semplice scrivere piccoli pezzi di codice che lavorano assieme, anziché scrivere una gran parte di codice che fa tutto quanto in una volta. A differenza dei generi di dati primitivi come boolean, int e float che possono conservare solo un valore, un oggetto ne può immagazzinare diversi. Prima di poter creare un oggetto bisogna definire una classe. Le classi forniscono progetti da cui è possibile costruire oggetti. Un oggetto è un istanza di una classe e ogni istanza ha il proprio gruppo di campi e metodi:

<?xml version=”1.0″ encoding=”utf-8″?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221;
    xmlns:app=”http://schemas.android.com/apk/res-auto&#8221;
    xmlns:tools=”http://schemas.android.com/tools&#8221;
    android:layout_width=”match_parent”
    android:layout_height=”match_parent”
    tools:context=”.MainActivity”>

    <TextView
        android:layout_width=”wrap_content”
        android:layout_height=”wrap_content”
        android:id=”@+id/textView”
        app:layout_constraintBottom_toBottomOf=”parent”
        app:layout_constraintLeft_toLeftOf=”parent”
        app:layout_constraintRight_toRightOf=”parent”
        app:layout_constraintTop_toTopOf=”parent” />

</androidx.constraintlayout.widget.ConstraintLayout>

package com.example.object;

public class Person {

public String name;
public  int age;

public Person(String name,int age){
this.name=name;
this.age=age;
}
    public String toString(){

return  name+”,”+age+”years old”+”\n”;
}

}

public class MainActivity extends AppCompatActivity {
      
   TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

textView=findViewById(R.id.textView);

Person person1=new Person(“Chiara”,30);
Person person2=new Person(“Stefania”,50);

textView.append(person1.toString());
textView.append(person1.toString());

    }
}

I quattro princìpi della programmazione orientata agli oggetti sono l’Incapsulamento, l’Ereditarietà, il Poliformismo e l’Astrazione.

Incapsulamento
Consente di nascondere i dettagli interni dichiarando privati gli attributi di una classe e, tramite il modificatore di accesso private, di esporre solo ciò che è necessario attraverso i metodi pubblici “get” e”set”.
Questo permette di garantire la robustezza, l’indipendenza e la riusabilità degli oggetti creati:
<?xml version=”1.0″ encoding=”utf-8″?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221;
    xmlns:app=”http://schemas.android.com/apk/res-auto&#8221;
    xmlns:tools=”http://schemas.android.com/tools&#8221;
    android:layout_width=”match_parent”
    android:layout_height=”match_parent”
    tools:context=”.MainActivity”>

    <TextView
        android:layout_width=”wrap_content”
        android:layout_height=”wrap_content”
        android:id=”@+id/textView”
        app:layout_constraintBottom_toBottomOf=”parent”
        app:layout_constraintLeft_toLeftOf=”parent”
        app:layout_constraintRight_toRightOf=”parent”
        app:layout_constraintTop_toTopOf=”parent” />

</androidx.constraintlayout.widget.ConstraintLayout>

package com.example.encapsulation;

public class UserDetails {
private String name;
private String email;

public UserDetails(String name,String email){

this.name=name;
this.email=email;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void SetEmail(String Email){
this.email=email;
}
public String getEmail(){
return email;
}

}

package com.example.encapsulation;

import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

textView=findViewById(R.id.textView);

UserDetails user=new UserDetails(“Matteo Rossi”,”matteo.rossi@example.com”);

String userName=user.getName();
String userEmail=user.getEmail();
textView.append(userName+”\n”+userEmail);
    }
    }

Ereditarietà
Permette la creazione di nuove classi (sottoclassi) a partire da altre già esistenti (superclassi), ereditando tutti i metodi e gli attributi, tramite la parola chiave extends:

<?xml version=”1.0″ encoding=”utf-8″?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221;
    xmlns:app=”http://schemas.android.com/apk/res-auto&#8221;
    xmlns:tools=”http://schemas.android.com/tools&#8221;
    android:layout_width=”match_parent”
    android:layout_height=”match_parent”
    tools:context=”.MainActivity”>

    <TextView
        android:layout_width=”wrap_content”
        android:layout_height=”wrap_content”
        android:id=”@+id/textView”
        app:layout_constraintBottom_toBottomOf=”parent”
        app:layout_constraintLeft_toLeftOf=”parent”
        app:layout_constraintRight_toRightOf=”parent”
        app:layout_constraintTop_toTopOf=”parent” />

</androidx.constraintlayout.widget.ConstraintLayout>

package com.example.inheritance;

public class Person {
String name;
String surname;

public Person(String name,String surname){
this.name=name;
this.surname=surname;
}
public String user(){
return name+surname;
}

}

package com.example.inheritance;

public class Student extends Person {
String studentID;

public Student(String name,String surname,String studentID){
super(name,surname);
this.studentID=studentID;
}
@Override
public String user(){

return “Name:”+name+surname+”\n”;
}

public String iD(){
return “ID:”+studentID;
}

}

package com.example.inheritance;

import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

textView=findViewById(R.id.textView);

Student student=new Student(“Matteo”,”Rossi”,”13455A”);
textView.append(student.user());
textView.append(student.iD());
    }
}

Polimorfismo
Consente di definire classi diverse che hanno metodi con lo stesso nome ma si comportano in modo diverso a seconda del contesto.Il polimorfismo può essere ottenuto attraverso l’overriding e l’overloading dei metodi.Nell’overriding un metodo ereditato viene ridefinito in una sottoclasse, mentre l’overloading permette a più metodi con lo stesso nome di coesistere, con parametri diversi, all’interno di una classe o di una sottoclasse:

<?xml version=”1.0″ encoding=”utf-8″?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221;
    xmlns:app=”http://schemas.android.com/apk/res-auto&#8221;
    xmlns:tools=”http://schemas.android.com/tools&#8221;
    android:layout_width=”match_parent”
    android:layout_height=”match_parent”
    tools:context=”.MainActivity”>

    <TextView
        android:layout_width=”wrap_content”
        android:layout_height=”wrap_content”
        android:id=”@+id/textView”
        app:layout_constraintBottom_toBottomOf=”parent”
        app:layout_constraintLeft_toLeftOf=”parent”
        app:layout_constraintRight_toRightOf=”parent”
        app:layout_constraintTop_toTopOf=”parent” />

</androidx.constraintlayout.widget.ConstraintLayout>

package com.example.polymorphism;

public class Person {
String name;
String surname;

public Person(String name,String surname){
this.name=name;
this.surname=surname;
}
public String user(){
return name+surname;
}

}

package com.example.polymorphism;

public class Student extends Person {
String studentID;

public Student(String name,String surname,String studentID){
super(name,surname);
this.studentID=studentID;
}
@Override
public String user(){

return “Name:”+name+surname+”\n”;
}

public String iD(){
return “ID:”+studentID+”\n”;
}
public String user(int year){

return “Year:”+year;
}

}

package com.example.polymorphism;

import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
textView=findViewById(R.id.textView);

Student student=new Student(“Matteo”,”Rossi”,”13455A”);
textView.append(student.user());
textView.append(student.iD());
textView.append(student.user(2001));
    }
   
}

Astrazione
Mediante l’astrazione vengono definiti gli aspetti essenziali di un oggetto, nascondendo i dettagli comlpessi.Una classe astratta viene dichiarata con la parola chiave abstract e non può essere istanziata direttamente.Viene utilizzata come classe base per le sottoclassi:

<?xml version=”1.0″ encoding=”utf-8″?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221;
    xmlns:app=”http://schemas.android.com/apk/res-auto&#8221;
    xmlns:tools=”http://schemas.android.com/tools&#8221;
    android:layout_width=”match_parent”
    android:layout_height=”match_parent”
    tools:context=”.MainActivity”>

    <TextView
        android:layout_width=”wrap_content”
        android:layout_height=”wrap_content”
        android:id=”@+id/textView”
        app:layout_constraintBottom_toBottomOf=”parent”
        app:layout_constraintLeft_toLeftOf=”parent”
        app:layout_constraintRight_toRightOf=”parent”
        app:layout_constraintTop_toTopOf=”parent” />

</androidx.constraintlayout.widget.ConstraintLayout>

package com.example.abstraction;

public abstract class Person {
String name;
String surname;

public Person(String name,String surname){
this.name=name;
this.surname=surname;

}
public String details(){
return name+surname;

}
public abstract String getDetails();

}

package com.example.abstraction;

public class Student extends Person{

String studentId;

public Student(String name,String surnane,String studentId){
super(name,surnane);
this.studentId=studentId;
}
@Override
public String getDetails(){
return “Name:”+name+”,Surname:”+surname+”,Student ID:”+studentId+”\n”;
}

}

package com.example.abstraction;

public class Employee extends Person {

String employeeId;

public Employee(String name, String surname,String employeeId){
super(name,surname);
this.employeeId=employeeId;

}
@Override
public String getDetails(){
return “Name:”+name+”,Surname:”+surname+”,Employee ID”+employeeId;
}

}

package com.example.abstraction;

import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
textView=findViewById(R.id.textView);

Student student=new Student(“Matteo”,”Rossi”,”13455A”);

Employee employee=new Employee(“Maria”,”Rossi”,”A1345B”);
textView.append(student.getDetails());
textView.append(employee.getDetails());
    }
}