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”
xmlns:app=”http://schemas.android.com/apk/res-auto”
xmlns:tools=”http://schemas.android.com/tools”
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”
xmlns:app=”http://schemas.android.com/apk/res-auto”
xmlns:tools=”http://schemas.android.com/tools”
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”
xmlns:app=”http://schemas.android.com/apk/res-auto”
xmlns:tools=”http://schemas.android.com/tools”
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”
xmlns:app=”http://schemas.android.com/apk/res-auto”
xmlns:tools=”http://schemas.android.com/tools”
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”
xmlns:app=”http://schemas.android.com/apk/res-auto”
xmlns:tools=”http://schemas.android.com/tools”
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());
}
}