So, let's try this. I would put all of this functionality in a method, give me
a minute to arrange that and then I'll show you. As promised, here is my method.
This method keeps reading an integer until it finds
one that is within the desired range and then it
returns it. The exact code isn't really important right
now. You can have a look at it in the
code distribution, if you want to. And, out here,
I'm calling it. But, there's a problem. When I compile
it, I get an error message. And, that error
message, right now, must truly appear like gibberish to you.
It talks about non-static methods and static methods.
So let me explain what's happening and why the
compiler is unhappy. Normally, we call a method on
an object and I didn't do that here because
I figured, well I'm in elevator demo. So I
should be able to call any elevator demo method
as well. But the trouble is I'm calling from
main. So there are no elevator demo objects and
the compiler complains. So going back here, that is
the crux of the problem. ReadBetween is not called
on an object And there really isn't a great
object to call it on. it would have been nice
to call it on the scanner, but like I
already said, we can't do that. Whenever you're in this
kind of situation where you have a method that
can't really be called in an object, then you make
a static method. The static method is a method that's not called in any
object. So, one remedy is, simply, to go back into elevator
demo. And, declare the helper method static. Like this. Now, all
will be well. And the syntax error is gone. So to answer our original question,
it is perfectly legitimate to put read between
intra ElevatorDemo as a static method but maybe
it's not optimal. Because what if I want
to use that perfectly nifty method in another
class? So really, read between is a method that seems it would be useful in any
situation that you want to read a value from
some range. So we, we might really want to put
this somewhere else, and the class that I'm going
to put it on I'll call IO Helper. I've
prepared that class for you, let me show you.
Here is the IO Helper class. Here is the
read between method. And again, that is a static
method because I'm not going to actually make any
objects off the IO Helper class. I just want
it to be the home for this method. That means
when I call the method, I have to specify
the name of the class like this. Here you
see the name of the class, IOHelper, the name
of the method. Static methods are not incredibly common because,
like I said,most of the time, an actual object
is responsible for carrying out a method, but they do
happen. In fact, you've seen a few of them. In
lesson four, you saw a good number of static methods
in the math class. Again, the syntax is the name
of the class, a period, and then the name of
the method. And once again there is no object of
the math class. We simply call the square root method
directly on the class. Now, you may wonder, why
did we have to use a static method? Why
couldn't we just call the method on the number
2? Well, that's what it's like in Java. In
Java, numbers are not objects so you can never
call a method on an object. A call such
as 2. square root might be more logical, but
it's an error. So to summarize the static method.
Belongs to a class. It's not called on an object and they're not actually all
that common. Why do you call them
static methods? There's no good reason actually. That's
a holdover from another much more ancient
programming language. There's nothing particularly static about them.
In addition to static methods, there are static
variables. Let's have a look at them next.
Intentemos esto. Yo pondría toda esta funcionalidad en un método, dame
un minuto para arreglar eso y después te lo mostraré. Tal como lo prometí, aquí está el método.
Este método sigue leyendo un número entero hasta que encuentra
uno que está dentro del rango deseado y después lo
devuelve. El código exacto no es realmente importante en
este momento. Puedes verlo en la
distribución de código si quieres. Y, aquí,
estoy llamándolo. Pero hay un problema. Cuando lo compilo
me sale un mensaje de error. Y, ese mensaje de
error, ahora mismo, en verdad debe aparecer como incomprensible para ti.
Habla de métodos no estáticos y métodos estáticos.
Así que déjame explicarte qué está pasando y por qué el
compilador no está contento. Normalmente, llamamos a un método en un
objeto y no hice eso aquí porque
pensé, bueno, estoy en ElevatorDemo, así que
debo ser capaz de llamar cualquier método de demo de elevador
también. Pero el problema es que estoy llamando desde
principal. Así que no hay objetos de demo de elevador y
el compilador se queja. Así que regresando aquí, esto es
el quid del problema, readBetween no se llama
en un objeto. Y en realidad no hay un gran
objeto en donde llamarlo. Hubiera sido lindo
llamarlo en el escáner, pero como ya te
dije, no podemos hacer eso. Cuando estés en este
tipo de situación en donde tienes un método que
en realidad no puede ser llamado en un objeto, entonces haces
un método estático. El método estático es un método que no se llama en cualquier
objeto. Así que, un remedio es, simplemente regresar al demo de
elevador. Y declarar el método estático auxiliar. De esta manera. Ahora todo
estará bien. Y el error de sintaxis ha desaparecido. Así que para responder a nuestra pregunta original,
es perfectamente legítimo poner readBetween dentro de
ElevatorDemo como un método estático, pero tal vez
no es óptimo. ¿Qué sucede si quiero
utilizar ese método perfectamente ingenioso en otra
clase? Así que en realidad, readBetween es un método que parece que sería útil en cualquier
situación que quieras leer un valor de
cierto rango. Así que realmente querríamos poner
esto en otro lugar, y la clase en la que lo voy a poner
la llamaré IO Helper. He
preparado esa clase para ti, déjame enseñarte.
Aquí está la clase IO Helper. Aquí está el método
readBetween. Y una vez más, eso es un método
estático ya que en realidad no voy a hacer
algún objeto de la clase IO Helper. Sólo quiero
que sea el hogar para este método. Esto significa
que cuando llame el método, tendré que especificar
el nombre de la clase así. Aquí
ves el nombre de la clase, IO Helper, el nombre
del método. Los métodos estáticos no son muy comunes ya que,
como he dicho, la mayoría de las veces, un objeto real
es responsable de llevar a cabo un método, pero sí
se usan. De hecho, has visto algunos de ellos. En
la lección cuatro, viste una buena cantidad de métodos estáticos
en la clase Matemáticas. De nuevo, la sintaxis es el nombre
de la clase, un período, y después el nombre
del método. Y una vez más, no hay ningún objeto de
la clase Matemáticas. Simplemente llamamos el método de raíz cuadrada
directamente en la clase. Ahora, quizás te preguntes ¿Porqué
tenemos que utilizar el método estático? ¿Por qué
simplemente no podemos llamar el método en el número
2? Bueno, así es Java. En
Java, los números no son objetos así que nunca puedes llamar
a un método en un objeto. Una llamada
como 2 raíz cuadrada podría ser más lógico, pero
es un error. Así que, para resumir el método estático.
Pertenece a una clase. No se llama en un objeto y en realidad no son del todo
común. ¿Por qué se les llama
métodos estáticos? En realidad, no hay una buena razón. Eso es
un remanente de otro lenguaje de programación
mucho más viejo. No hay nada específicamente estático sobre ellos.
Además de los métodos estáticos, hay variables
estáticas. Veámoslas a continuación.
Alors, essayons ceci.
Je mettrais toute cette fonctionnalité
dans une méthode,
donnez-moi une minute pour
arranger ça et je vous montrerai.
Comme promis, voici ma méthode.
Cette méthode continue à
lire un nombre entier
jusqu'à ce qu'elle trouve celui qui est
dans la gamme désirée et elle le renvoie.
Le code exact n'importe
peu pour l'instant.
Vous pouvez y jeter un coup d’œil
dans la distribution du code
si vous le souhaitez.
Et, ici, je l'appelle.
Mais, il y a un problème.
Quand je compile, je reçois
un message d'erreur
et, ce message d'erreur, pour le moment,
doit vous paraître comme du charabia.
Il parle de méthodes
non statiques et statiques.
Je vais vous expliquer ce qui se passe
et pourquoi le compilateur est mécontent.
D'habitude, nous appelons
une méthode sur un objet
et je ne l'ai pas fait ici
car je me suis dit,
je suis en démonstration d'ascenseur
et devrais être capable d'appeler
une méthode de démonstration d'ascenseur.
Mais le problème est
que j'appelle depuis main.
Il n'y a donc pas d'objets
de démonstration d'ascenseur
et le compilateur s'en plaint.
Donc, en revenant ici,
c'est le nœud du problème.
ReadBetween n'est pas appelé sur un objet
et il n'y a pas de grand
objet pour l'appeler.
Ça aurait été bien de
l'appeler sur le scanner,
mais comme je l'ai déjà dit,
on ne peut pas faire ça.
Lorsque vous êtes
dans ce genre de situation
où vous avez une méthode qui ne peut
pas vraiment être appelée dans un objet,
alors vous faites une méthode statique.
La méthode statique est une méthode
qui n'est appelée dans aucun objet.
Une solution est, simplement, de revenir
dans la démonstration d'ascenseur
et de déclarer la méthode
auxiliaire statique,
comme ça.
Maintenant, tout ira bien
et l'erreur de syntaxe est partie.
Donc pour répondre à
notre question initiale,
il est parfaitement légitime de mettre
readBetween dans ElevatorDemo
comme une méthode statique mais
peut-être que ce n'est pas optimal.
Parce que si je veux utiliser
cette méthode
parfaitement astucieuse dans
une autre classe?
Donc, readBetween est
une méthode qui semble utile
dans toutes les situations où
vous voulez lire une valeur
à partir d'une certaine distance.
Alors nous, nous pourrions vraiment
vouloir mettre cela ailleurs,
et la classe sur laquelle je la mettrai,
j'appelerai IO Helper.
J'ai préparé ce cours pour vous,
je vais vous montrer.
Voici la classe IO Helper.
Voici la méthode readBetween.
Et de nouveau, c'est une méthode statique,
car je ne vais pas réellement faire
des objets de la classe IO Helper.
Je veux juste que ce soit
la foyer pour cette méthode.
Cela signifie que lorsque
j'appelle la méthode,
je dois spécifier le nom
de la classe comme ceci.
Ici vous voyez le nom de la classe,
IOHelper, le nom de la méthode.
Les méthodes statiques ne
sont pas vraiment courantes
parce que, comme je l'ai dit,
la plupart du temps,
un objet réel est responsable
de l'exécution d'une méthode,
mais cela arrive.
En fait, vous en avez
vu quelques-uns.
Dans la leçon 4, vous avez vu
un nombre de méthodes statiques
dans la classe maths.
Là encore, la syntaxe se compose
du nom de la classe,
un point, puis le nom de la méthode.
Et encore une fois il n'y a aucun
objet de la classe maths.
Nous appelons simplement la méthode
racine carrée directement sur la classe.
Vous cherchez sans doute la raison
de l'utilisation d'une méthode statique?
Pourquoi ne pas simplement appeler
la méthode sur le numéro 2?
C'est comme ça dans Java,
dans Java, les nombres
ne sont pas des objets,
donc vous ne pouvez jamais
appeler une méthode sur un objet.
Un appel tel que
2. la racine carrée peut être plus
logique, mais c'est une erreur.
Donc pour résumer, la méthode statique
appartient à une classe.
Elle n'est pas appelée sur un objet et
elles ne sont pas vraiment courantes.
Pourquoi les appelle-t-on
des méthodes statiques?
Il n'y a pas de raison
valide en fait.
C'est un vestige d'un autre langage
de programmation beaucoup plus ancien.
Il n'y a rien de particulièrement
statique à leur sujet.
En plus des méthodes statiques,
il existe des variables statiques.
Jetons un coup d’œil à eux.
やってみましょう すべての機能を
メソッドに入れていきます
準備するので少しお待ちください
これが私のメソッドです
このメソッドは望ましい範囲内の整数値を探し続け
見つけたらその整数値を返します
厳密なコードは今は重要ではありませんが
もし見たければコード分配で見ることができます
そしてここでコードを呼び出します
しかし問題があります
コンパイルするとエラーメッセージが出ました
皆さんにはわけが分からないと思います
静的メソッドと非静的メソッドを見ながら
なぜコンパイルがうまくいかないのか
説明しましょう
通常はオブジェクトにメソッドを呼び出しますが
それを行いませんでした
その理由はElevatorDemoにいるので
どのElevatorDemoのメソッドも
呼び出せると思ったからです
しかしmainから呼び出しているので
ElevatorDemoのオブジェクトも
コンパイラのエラーもありません
先ほどのこの部分がこの問題の重要なポイントです
それはreadBetweenはオブジェクトに
呼び出されていないことと
呼び出すのに最適なオブジェクトがないことです
Scannerに呼び出せたらいいのですが
それはできません
オブジェクトに呼び出せないメソッドがあるという
状況に陥ったら
静的メソッドを作ります
静的メソッドはオブジェクトに
呼び出されないメソッドです
改善策は単純にElevatorDemoに戻り
ヘルパーメソッドの静的メソッドを宣言します
このようにすればうまくいきます
シンタックスエラーがなくなりました
元の問題の答えとして適切なのは
readBetweenを
ElevatorDemoに静的メソッドとして
置くことです
しかしこの場合は違います
もしこのすばらしいメソッドを
他のクラスに使いたいとしたらどうでしょう
readBetweenメソッドはある範囲から
値を読み取りたい状況で非常に役に立つようです
そこでこれを他の場所に置きたいと思います
そしてそれを置くクラスをIOHelperと呼びます
準備したクラスをお見せしましょう
これがIOHelperクラスで
これがreadBetweenメソッドです
これは静的メソッドです
IOHelperクラスで
オブジェクトを作るつもりはないからです
IOHelperクラスを
このメソッドが属する場所にしたいのです
つまりこのメソッドを呼び出す時は
クラスの名前を明示しなければなりません
IOHelperはクラスの名前
こちらはメソッドの名前です
静的メソッドはそれほど一般的ではありません
大抵の場合実際のオブジェクトには
メソッドを実行する責任があるからです
静的メソッドを使うこともあります
レッスン4のMathクラスで
静的メソッドを見ました
構文はクラスの名前、ピリオド、
メソッドの名前です
またMathクラスにはオブジェクトがありません
クラスに平方根メソッドを直接呼び出します
なぜ静的メソッドを使う必要があるのか
疑問に思うかもしれません
なぜ数字2にメソッドを呼び出せないのかとね
Javaではそうなるのです
Javaでは数字はオブジェクトではないので
オブジェクトにメソッドは呼べません
平方根は論理的かもしれませんが
これはエラーです
では静的メソッドを要約すると
クラスに属しオブジェクトに呼び出されず
一般的ではありません
静的メソッドと呼ぶことに実は理由はありません
他の大昔のプログラミング言語の遺物です
静的メソッドが特に静的というわけでもありません
静的メソッドに加え静的変数というものもあります
次で見ていきます