Ideias

O que diferencia uma linguagem de programação da outra.?

Tem poucas diferenças se você for analisar a fundo, basicamente o que muda é o proposito da sua aplicação (e algumas das suas funções, é claro) e a sintaxe entre elas.
Por exemplo para Web você pode usar java, python, ruby, PHP no back end (até misturar uma linguagem com a outra).
Para desenvolver apps mobile para android pode usar o Kotlin ou para IOS pode usar o Swift.
Depende muito do “o que eu quero fazer”, claro que uma linguagem pode substituir a outra em uma determinada aplicação (tipo o back end que falei ali em cima, onde você tem mais de uma linguagem para fazer basicamente a mesma coisa), nesse caso você precisa focar na área que vai atuar e pesquisar quais são as tecnologias mias utilizadas naquela nela.

Agora entendo.

Qual é a diferenca entre programa e Instrução.?

Fora sintaxe, elas trabalham de forma diferente para propósitos diferentes. por exemplo Java e JavaScript. JavaScript é multi-paradigma(utiliza tanto a Orientação a Objetos como outros paradigmas), é utilizado no desenvolvimento front-end de sites, os comandos e a forma que é compilado facilitam no desenvolvimento de funcionalidades na web. Por exemplo: com um simples comando você cria um botão e adiciona uma ação para ele digitando apenas onclick ou :hover ). Diferente do Java que pode ser totalmente voltado a objetos( quase tudo nele é uma classe ou objeto, como uma matrioska, e permite a substituição dos tipos primitivos por objetos) e não da suporte para fazer essa alterações com essa facilidade,
para fazer isso ele precisaria criar classes e métodos para fazer isso, e utilizar a biblioteca swing para a criação de interfaces gráfica, oq não seria muito viável. Por isso o Java é mais utilizado para o backend, pq o fato dele ser totalmente voltado a objetos ajuda no desenvolvimento e em manutenções posteriores.Foi mais ou menos isso que entendi na minha experiencia com os dois (não que eu seja muito), mas pra entender melhor, só tentado criar alguns programas em diferentes línguas(mesmo que programas básicos) e comparar as dificuldades e facilidades.

Java não é totalmente orientado à objetos, ele também possui tipos primitivos:

  • byte e boolean: 1 byte
  • short e char: 2 bytes
  • int e float: 4 bytes
  • long e double: 8 bytes

Isso é verdade,mas o uso de tipos primitivos apesar de muito utilizado, pode ser substituído por suas classes Wrapers(Integer, Short, Byte, etc…), que é muito mais eficiente por permitir um toString(), que é um método herdado de Objects(que atribuido a todos os objetos). Concluindo, eu errei ao me expressar de fato, Java da suporte para que seja usado de forma totalmente voltada a Objeto.

Está equivocado colega, os objetos das wrapper classes nunca serão mais eficientes do que um tipo primitivo.

Objetos são alocados na heap e contém uma série de informações pertinentes à sua classe.

Já os tipos primitivos são alocados na stack e são simples valores com um tamanho fixo de bytes.

Você só deveria utilizar uma variável do tipo wrapper class quando você precisa realmente de um objeto, senão é preferível utilizar sempre os tipos primitivos.

2 curtidas

É so um debate colegas, nao precisamos pegar pesado com um ao outros, toda ideia é válida.
Vamos debater com calma.

kkk relaxa, ninguem ta pegando pesado não, alias aprendi algo novo até rsrs

1 curtida

Interessante seu ponto, mas java precisa ser o mais genérico possível não?. Por ex: em alguma update da minha aplicação eu precisar das classes, eu teria que sair trocando a mão?
Se eu utilizar só objetos na minha aplicação, não precisaria de tanto esforço para uma manutenção assim.

Como eu disse, você só deveria utilizar uma variável do tipo wrapper class quando você realmente precisa de um objeto.
Se em algum lugar seu código estava utilizando tipo primitivo e por alguma razão agora você precisa de um objeto do tipo wrapper class, não haverá problema por causa do auto-boxing.
O problema seria se você tivesse variável do tipo wrapper class e agora precisa de tipo primitivo, pois no auto-unboxing existe o risco de acontecer NullPointerException.

em que situação eu iria precisar de um tipo primitivo no lugar de um wrapper? (tô aprendendo aqui rsrs)

Essa eu também gostaria de saber.

Acredito que não tenha uma situação que te obrigue a usar tipos primitivos e eu compartilho da opinião do @staroski quando ele diz:

Aí fica a dúvida: Tá, mas e quando eu “realmente preciso de um objeto?”

E a resposta é: Quando vc lida com Generics. Em Java não é possivel criar um tipo genérico com um Type Argument de tipo primitivo. Logo:

List<int> primitiveNumbers = new ArrayList<>(); // Isso causa erro de compilação
List<Integer> wrappedNumbers = new ArrayList<>(); // Isso está correto

Quando podes ter, por exemplo, um valor null. Os primitivos não permitem null e são inicializados com valores default (boolean a false, numeros a 0);

class Test{
    private boolean primitivo;
    private Boolean objecto;

    public static void main (String[] args) {
        Test t = new Test();
        System.out.println(primitivo);
        System.out.println(objecto);
    }
}

Resultado:
false
null
1 curtida

Em classes serializáveis por exemplo.
A serialização de um valor do tipo int, consome somente 4 bytes (32 bits).
A serialização de um objeto do tipo Integer consome 81 bytes (648 bits).

Ou seja, um Integer tem 20 vezes mais bytes que um int.

Pode parecer bobeira, mas em aplicações online, como um jogo por exemplo, transmitir 20 vezes menos dados pode fazer toda a diferença, desde o lag até o consumo do pacote de dados.
:wink:

Vou tomar como exemplo o post do colega @pmlm por exemplo.
No caso um primitivo boolean vai consumir 1 byte numa serialização.
Já um wrapper do tipo Boolean vai consumir 47 bytes ao ser serializado.
Ou seja, o Boolean é 47 vezes maior que o boolean.

Acho que só quem trabalhou com J2ME 18 anos atrás é que está ciente desses detalhes.
Já tive que “escovar muito bit” pra diminuir o tráfego de dados em uma época onde os dispositivos tinham pouca memória e o custo para transmitir dados era caríssimo.
:rofl:

Exemplo de serialização com boolean e Boolean:

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Test {

	public static void main(String[] args) throws IOException {
		boolean primitivo = true;
		Boolean wrapper = Boolean.TRUE;
		System.out.println("Primitivo " + serializarPrimitivo(primitivo));
		System.out.println("Wrapper   " + serializarWrapper(wrapper));
	}

	static int serializarPrimitivo(boolean parametro) throws IOException {
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		DataOutputStream dos = new DataOutputStream(bos);
		dos.writeBoolean(parametro);
		dos.flush();
		byte[] bytes = bos.toByteArray();
		return bytes.length;
	}

	static int serializarWrapper(Boolean parametro) throws IOException {
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(bos);
		oos.writeObject(parametro);
		oos.flush();
		byte[] bytes = bos.toByteArray();
		return bytes.length;
	}
}
3 curtidas