Java: Criação de objetos e processo de inicialização
1. Tipos de dados em java
Existem 3 tipos de dados em Java: tipos de dados básicos (em Java, Boolean, Byte, Short, Int, Long, Char, Float e Double são tipos básicos de dados), tipo de referência e tipo nulo. Entre eles, o tipo de referência inclui tipo de classe (incluindo matriz) e tipo de interface.
A declaração a seguir declara algumas variáveis:
int k; a a; // a é o nome da variável de objeto do tipo de dados. B B1, B2,…, B10000; // Suponha que B é uma classe ou interface abstrata. Strings s;
NOTA: Do ponto de vista dos tipos e variáveis de dados, as variáveis básicas do tipo de dados k, as variáveis do tipo de classe A e S, a classe abstrata ou a variável do tipo de interface B (10.000), são todas variáveis (identificadores).
2. Sobre a alça
Para distinguir entre identificadores variáveis dos tipos de referência e identificadores variáveis do tipo de dados básicos, usamos especificamente o identificador para nomear identificadores variáveis de tipos de referência. No exemplo acima, B1 a B10000, A e S são todos o identificador. Manusear intuitivamente o cabo e a alça. Utilizamos a tradução chinesa comumente usada de "Handle" no mundo dos computadores.
2.1 [Na programação do Windows] O significado de um identificador é um número inteiro exclusivo usado por se pergunta para identificar objetos criados ou usados por um aplicativo. O Windows usa várias alças para identificar, como instâncias de aplicativo, Windows, controles, bitmaps, objetos GDI etc. O identificador do Windows é um pouco como um identificador de arquivo na linguagem C.
A partir da definição acima, podemos ver que o identificador é um identificador usado para identificar um objeto ou projeto. É como o nosso nome. Todos terão um. Pessoas diferentes têm nomes diferentes, mas também pode haver alguém com o mesmo nome que você. Do tipo de dados, é apenas um número inteiro não assinado de 16 bits. Um aplicativo quase sempre obtém um identificador chamando uma função do Windows, que pode ser usada por outras funções do Windows para fazer referência ao objeto correspondente.
Se você quiser saber mais bem, posso dizer que as alças são dicas para os ponteiros. Sabemos que o chamado ponteiro é um endereço de memória. Após o início do aplicativo, os objetos que compõem o programa residem na memória. Se simplesmente o entendemos, parece que, desde que soubéssemos o primeiro endereço dessa memória, podemos usar esse endereço para acessar o objeto a qualquer momento. Mas se você realmente pensa assim, você está muito errado. Sabemos que o Windows é um sistema operacional baseado em memória virtual. Nesse ambiente do sistema, o Windows Memory Manager geralmente move os objetos para frente e para trás na memória para atender às necessidades de memória de vários aplicativos. Um objeto é movido significa que seu endereço mudou. Se o endereço sempre mudar como este, onde devemos encontrar o objeto?
Para resolver esse problema, o sistema operacional Windows libera alguns endereços de armazenamento interno para cada aplicativo para registrar especificamente as alterações de endereço de cada objeto de aplicativo na memória, e esse endereço (o local da unidade de armazenamento) permanece inalterado. Depois de mover a localização do objeto na memória, o Windows Memory Manager informa o novo endereço do objeto para salvá -lo. Dessa forma, precisamos apenas lembrar esse endereço de manipulação para saber indiretamente onde o objeto está na memória. Este endereço é atribuído pelo sistema quando o objeto é carregado (carregamento) e é liberado no sistema quando o sistema é descarregado.
Endereço do manuseio (estábulo) → Registre o endereço do objeto na Memory──── fare o endereço do objeto na memória (instável) → Objeto real
2.2 O significado das alças em Java tem uma compreensão profunda do significado das alças [na programação do Windows]. Podemos dizer que o identificador é um termo que precisamos muito ao aprender Java. Seu significado é distinguir "objeto em si" das variáveis de objeto (ou rigor: identificadores variáveis do tipo de dados ao qual o objeto pertence).
2.3 Retornar à Declaração Variável em 1:
Agora, você deve ter uma visão clara dos comentários abaixo.
int k, j; // k armazena um número inteiro. A a; // O endereço é armazenado em a. B B1, B2,…, B10000; // B1,…, B10000 armazena o endereço dentro. Strings s; // s armazena o endereço.
3. Sobre a referência
O que é uma "citação"? “O identificador que você manipula é na verdade uma 'referência' a um objeto". (Pensando em Java 2e)
A tradução é: o identificador que você manipula é na verdade uma "referência" a um objeto. Ou para ser mais preciso, traduzido em: o identificador que você opera é na verdade uma "referência" a um objeto. Obviamente, a referência no texto original é algo com um senso de direção.
Volte para Java e consulte o número de identificação do objeto, o ID do objeto ou o número de telefone celular do objeto. Obviamente, mais o ditado é que a referência é o número da sala em que o objeto vive na memória. Intuitivamente falando, a referência a um objeto é o valor de retorno ao criar um objeto! Uma referência é o valor de retorno de uma nova expressão.
novo a (); Aqui está um objeto, mas não usamos uma alça para segurar (manter, manter, salvar) a referência. De uma perspectiva microscópica, a nova expressão completa a tarefa de inicialização do objeto (três etapas, análise detalhada abaixo) e, no geral, retorna uma referência.
Volte para a declaração variável em 1 novamente e dê uma olhada nos comentários abaixo.
A a; // Declare o identificador A, mas não é inicializado, portanto o valor interno é nulo. B B1, B2,…, B10000; // Declare as alças B1,…, B10000, mas não são inicializadas; portanto, o valor interno é nulo. Strings s; // Declare o identificador S, mas não é inicializado; portanto, o valor interno é nulo.
4. A relação entre identificador e referência
A a; // Declare o identificador A, o valor é nulla = novo a (); // inicialização do identificador (identificador = referência; ou seja, atribua a referência ao identificador)
Citação: o valor de novo a (). As referências podem ser simplesmente consideradas como o endereço em que o objeto ocupa o espaço de memória; Por meio de referências a objetos, eles podem ser convenientemente distinguidos de outros objetos, e as referências são a identidade única do objeto.
Depois que a alça é inicializada, você pode usar o identificador para controlar remotamente o objeto.
Obviamente, isso é apenas para explicar a criação e a inicialização de objetos de um aspecto. Depois de entender a relação entre alças e referências, todo o processo de inicialização do objeto é analisado abaixo. Vamos fazer os seguintes preparativos primeiro, falar sobre Stack e Stack.
5. Stack and Heap em Java
Em Java, a memória é dividida em dois tipos: "Stack" e "Heap" (pilha e heap). O tipo de dados básico é armazenado na "pilha" e o tipo de referência de objeto é realmente armazenado no "heap", e o valor do endereço da memória de referência é retido apenas na pilha.
A propósito, vamos falar sobre os métodos "==" e "Equals () para ajudar a entender o conceito de ambos (pilha e heap).
Ao comparar variáveis com "==" em Java, o sistema usa o valor armazenado na variável na pilha como base para comparação. O valor armazenado no tipo de dados básico na pilha é o seu valor de contenção, e o valor armazenado no tipo de referência na pilha é o valor do endereço do próprio objeto aponta. A classe de objeto no pacote java.lang possui o método público booleano igual (object obj). Ele compara se dois objetos são iguais. O método iguals () do objeto retorna verdadeiro somente se as duas referências comparadas ao mesmo objeto (as alças forem iguais). (Quanto ao método Equals () da classe String, ele substitui o método iguals () e não é discutido neste artigo.)
6. Processo de criação e inicialização de objetos
No objeto Java é uma instância da classe. Em geral, quando uma instanciação de uma classe, todos os membros dessa classe, incluindo variáveis e métodos, são copiados em uma nova instância desse tipo de dados. Analise os dois códigos a seguir.
6.1 veículo veh1 = novo veículo ();
A declaração acima faz o seguinte:
①O "novo veículo" à direita usa a classe de veículo como modelo para criar um objeto de classe de veículo (também chamado de objeto de veículo) no espaço da pilha.
②O final de () significa que, após a criação do objeto, o construtor da classe de veículos é chamado imediatamente para inicializar o objeto recém -gerado. Deve haver um construtor. Se não for criado, o Java adicionará um construtor padrão.
③O "veículo veículo" à esquerda cria uma variável de referência de classe de veículo.
④ O operador "=" faz com que a referência do objeto aponte para o objeto do veículo que acabou de ser criado. (Recall alça e referências)
Divida a declaração acima em duas etapas:
Veículo veh1; veh1 = novo veículo ();
É mais claro escrever dessa maneira. Existem duas entidades: uma é a variável de referência do objeto e a outra é o próprio objeto. As entidades criadas no espaço da pilha são diferentes das criadas no espaço da pilha. Embora sejam entidades que existem, parece difícil "captá -lo" com precisão. Vamos estudar com cuidado a segunda frase e descobrir qual o nome do objeto que você acabou de criar? Algumas pessoas dizem que é chamado de "veículo". Não, "veículo" é o nome da classe (o modelo de criação para o objeto). Uma aula de veículo pode criar inúmeros objetos com base nisso, e esses objetos não podem ser chamados de "veículo". O objeto nem sequer tem um nome, por isso não pode ser acessado diretamente. Só podemos acessar objetos indiretamente através de referências de objetos.
6.2 veículo veh2;
veh2 = veh1;
Como o veh1 e o veh2 são apenas referências a objetos, o que a segunda linha faz é apenas atribuir a referência (endereço) de veh1 ao veh2, de modo que o veh1 e o veh2 apontam para o objeto de veículo exclusivo ao mesmo tempo.
6.3 veh2 = novo veículo ();
A variável de referência veh2 aponta para o segundo objeto.
Deduzido da declaração acima, podemos tirar a seguinte conclusão: ① Uma referência de objeto pode apontar para 0 ou 1 objeto; ② Um objeto pode ter n referências para apontar para ele.
Java: conversão de tipo de dados
1. Tipos simples de Java e suas classes de encapsulador
1.1 Tipos simples e classes de encapsulamento Java Sabemos que a linguagem Java é uma linguagem de programação orientada a objetos típica, mas considerando as vantagens de alguns tipos básicos de dados como simples em estrutura, memória pequena e velocidade de acesso rápido, o Java ainda fornece suporte a esses tipos de dados simples não orientados a objetos. Obviamente, quando o Java fornece um grande número de outras classes, também fornece classes encapsuladas correspondentes a tipos de dados simples. Portanto, o Java possui diferentes tipos de dados, como INT e Integer (flutuação e flutuação, dupla e dupla ...).
Existem duas categorias principais de tipos de dados no idioma Java: um é um tipo simples, também conhecido como tipo principal (primitivo), e o outro é um tipo de referência (referência). Uma variável de tipo simples armazena um valor específico, enquanto uma variável de tipo de referência armazena uma referência a um objeto.
Java determina o tamanho de cada tipo simples. Esses tamanhos não mudam com as alterações na estrutura da máquina. Esse tamanho é invariável, que é uma das razões pelas quais os programas Java têm forte portabilidade.
A tabela a seguir lista os tipos simples, ocupação de bits binários e classes de encapsulador correspondentes definidas em Java.
Tipos simples na tabela java
1.2 Por que usar classes de encapsulamento. Tome int e inteiro como exemplo. Embora eles representem essencialmente um número inteiro de 32 bits, eles são diferentes tipos de dados. De fato, os números inteiros usados diretamente em Java são int (no que diz respeito ao INT e Integer). Somente quando os dados devem aparecer como a identidade de um objeto, o valor inteiro deve ser encapsulado em um objeto com a integração do encapsulador, o Int correspondente.
Por exemplo: para adicionar um número inteiro ao vetor no pacote java.util, o valor inteiro deve ser encapsulado em uma instância inteira da seguinte maneira:
Vetor v = new vetor (); int k = 121; v.adDelemt (novo número inteiro (k));
Além disso, o número inteiro, como a classe Encapsulator correspondente ao INT, fornece muitos métodos, como métodos de construção inteira, métodos de conversão inteira para outros tipos numéricos, etc., que não estão disponíveis nos dados do tipo int.
2 Constantes em Java
Precisamos prestar atenção aos seguintes tipos de constantes.
2.1 Quando as constantes inteiras hexadecimais são expressas em hexadecimal, elas devem começar com 0x ou 0x, como 0xff, 0x9a.
2.2 Octal constante octal deve começar com 0, como 0123, 034.
2,3 do tipo longo longo deve terminar com L, como 9L, 342L.
2.4 Constantes de flutuação Como o tipo padrão da constante decimal é o tipo duplo, f (f) deve ser adicionado após o tipo de flutuação. Variáveis com decimais também são do tipo duplo por padrão.
flutuar f;
f = 1,3f; // f deve ser declarado.
2.5 Constantes de caracteres As constantes de caracteres precisam ser fechadas em duas citações únicas (observe que as constantes de sequência estão fechadas em duas citações duplas). Os personagens do Java são responsáveis por dois bytes.
Alguns personagens de fuga comumente usados.
①/R significa aceitar a entrada do teclado, o que é equivalente a pressionar a tecla Enter;
②/n significa uma nova linha;
③/t representa um caractere de guia, que é equivalente à chave da tabela;
④/b representa a chave do backspace, que é equivalente à chave do espaço de trás;
⑤/'significa citações únicas;
⑥/'' significa citações duplas;
⑦ // significa uma barra/.
3. Conversão entre tipos de dados simples
Existem duas maneiras de converter entre tipos simples de dados: conversão automática e conversão de fundição, o que geralmente ocorre quando os parâmetros da expressão ou método são passados.
3.1 Conversão automática especificamente, quando um dados "pequenos" é calculado juntamente com dados "grandes", o sistema converte automaticamente os dados "pequenos" em dados "grandes" e depois executam o cálculo. Ao chamar o método, os parâmetros reais são "pequenos" e os dados formais do parâmetro do método chamado são "grandes" (se houver uma correspondência, é claro, o método de correspondência será chamado diretamente), o sistema converterá automaticamente os dados "pequenos" em dados "grandes" e depois chamará o método. Naturalmente, para vários métodos sobrecarregados com o mesmo nome, ele será convertido em dados "Close" "Big" e chamado.
Esses tipos de "pequeno" a "grande" são (byte, curto, char)-int-long-float-duplo. O que estamos falando aqui não se refere ao número de bytes ocupados, mas ao tamanho do intervalo que representa o valor.
Por favor, veja o seguinte exemplo:
①As declarações a seguir podem ser aprovadas diretamente em Java:
byte b; int i = b; long l = b; float f = b; duplo d = b;
② Se o tipo de nível de baixo nível for um tipo de char, será convertido para o valor do código ASCII correspondente ao se converter para um tipo de alto nível (tipo integral), por exemplo
char c = 'c'; int i = c; System.out.println ("saída:"+i);
Saída:
saída: 99;
③ Para os três tipos de byte, curto e char, eles são horizontais, para que não possam se converter automaticamente. A seguinte conversão do tipo de elenco pode ser usada.
curto i = 99; char c = (char) i; System.out.println ("saída:"+c);Saída:
saída: c;
④ Se houver um método no polimorfismo de objetos:
f (byte x) {…}; f (curto x) {…}; f (int x) {…}; f (longo x) {…}; f (float x) {…}; f (duplo x) {…}; f (duplo x) {};}; Há também: char y = 'a'; Então, qual método a declaração f (y) vai ligar? A resposta é: f (int x) {...} método, porque seu parâmetro de referência formal é "grande" e é o "mais próximo".
E para o método:
f (float x) {…}; f (duplo x) {…}; Há também: longo y = 123L; Então, o método chamado pela declaração f (y) é f (float x) {…}.
3.2 FOLTAGEM Ao converter dados "grandes" em dados "pequenos", você pode usar a fundição. Isto é, você deve usar o seguinte formato de declaração:
int n = (int) 3.14159/2;
Como você pode imaginar, essa conversão certamente pode levar ao transbordamento ou uma diminuição da precisão.
3.3 Aprimorando automaticamente o tipo de expressão de dados. Em relação ao aprimoramento automático do tipo, preste atenção às seguintes regras.
① Todos os valores dos tipos de byte, curto e char serão promovidos para o tipo int;
② Se houver um operando que seja longo, o resultado do cálculo é longo;
③Se houver um operando que seja o tipo de flutuação, o resultado do cálculo é o tipo de flutuação;
④Se houver um operando que seja o tipo duplo, o resultado do cálculo é o tipo duplo;
exemplo,
byte b; b = 3; b = (byte) (b*3); // byte deve ser declarado.
3.4 Conversão do tipo de transição para aula de embalagem em geral, declaramos primeiro uma variável e, em seguida, geramos uma classe de embalagem correspondente, e podemos usar vários métodos da classe de embalagem para executar a conversão do tipo. Por exemplo:
① Quando você deseja converter o Float para o tipo duplo:
flutuar F1 = 100,00f; Flutuar F1 = novo float (F1); duplo d1 = f1.doubleValue (); // f1.doubleValue () é o método de retornar o tipo de valor duplo da classe float
② Quando você deseja converter o tipo duplo em um tipo int:
duplo d1 = 100,00; duplo d1 = novo duplo (d1); int i1 = d1.intValue ();
Converter variáveis de tipos simples para a classe Wrapper correspondente e o construtor da classe Wrapper pode ser usado. Isto é: booleano (valor booleano), caractere (valor de char), número inteiro (valor int), longo (valor longo), float (valor float), duplo (valor duplo)
Em cada classe de embalagem, sempre existe um método de × × valor () para obter seus dados de tipo simples correspondentes. Usando esse método, a conversão entre diferentes variáveis numéricas também pode ser realizada. Por exemplo, para uma classe real de precisão dupla, o IntValue () pode obter sua variável inteira correspondente e o DoubleValue () pode obter sua variável de tipo real de precisão dupla correspondente.
4. Conversão entre cordas e outros tipos
4.1 Conversão de outros tipos em strings ① Chame o método de conversão de string da classe: x.toString ();
② Conversão automática: x+";
③ Métodos usando string: string.volueof (x);
4.2 Converta a string em outros tipos como valores ① primeiro converte -a na instância do wrapper correspondente e, em seguida, chama o método correspondente para convertê -lo em outros tipos. Por exemplo, o formato de conversão do valor duplo do "32.1" no caractere é: novo float ("32.1"). DoubleValue (). Você também pode usar: Double.valueof ("32.1"). DoubleValue ()
② Método parsexxx estático
String s = "1"; byte b = byte.parsebyte (s); thort t = curto.parSeshort (s); int i = integer.parseint (s); long l = long.parselong (s); float f = float.parsefloat (s); duplo d = duplo.parseDouble (s);
③ O método GetNumericValue (CHE CH) do personagem pode ser encontrado na API.
5. Conversão da classe de data e outros tipos de dados
Não há correspondência direta entre inteiros e classes de data, mas você pode usar o tipo int para representar ano, mês, dia, hora, minuto e segundos, respectivamente, para que uma correspondência seja estabelecida entre os dois. Ao fazer essa conversão, você pode usar três formas do construtor da classe de data:
①Date(int year, int month, int date): Int type represents year, month, and day ②Date(int year, int month, int date, int hrs, int min): Int type represents year, month, day, hour, and minute ③Date(int year, int month, int date, int hrs, int min, int sec): Int type represents year, month, day, hour, minute, and second There is an interesting correspondence between long integer e as classes de data, ou seja, um horário é expresso como o número de milissegundos a partir das 0:00:00, GMT em 1º de janeiro de 1970. Para essa correspondência, a classe de data também possui seu construtor correspondente: data (data longa).
Obtenha o ano, mês, dia, hora, minuto, segunda e semana na aula de data. Você pode usar o getyear (), getMonth (), getDate (), gethours (), getminutes (), getSeconds (), getday () e também pode entendê -lo como convertendo a classe de data em um int.
O método getTime () da classe de data pode obter o número inteiro longo correspondente ao tempo que mencionamos anteriormente. Como a classe Wrapper, a classe Date também possui um método ToString () que pode convertê -lo na classe String.
Às vezes, queremos obter um formato específico de data, por exemplo, 20020324, podemos usar o seguinte método, primeiro introduzindo -o no início do arquivo,
importar java.text.simpledEformat; importar java.util.*; java.util.date data = new java.util.date (); // se você deseja obter o formato de yyyymmdd simpledateFormat sy1 = new SimpleDateFormat ("yyyymmdd"); string dateFormat = sy1.format (date); // Se você deseja obter ano, mês, dia, simpledEformatat sy = new SimpleDateFormat ("yyyyyy"); SimpledateFormat sm = new SimpleDateFormat ("mm"); SimpledateFormat sd = new SimpleDateFormat ("dd"); string syear = sy.format (date); string smon = sm.format (data); string sday = sd.format (data);