2013-06-15 18 views
10

Uzun bir süredir Java ile çalıştım ve System.out.print() işlevinin nasıl çalıştığını merak ediyordum.System.out.print() nasıl çalışır?

İşte benim şüphe:

bir işlev olmak, bir yere io pakette bir deklarasyon vardır. Ancak, Java geliştiricileri bunu nasıl yaptılar, çünkü bu işlev, nasıl düzenlenmiş olursa olsun, herhangi bir argüman ve argüman türüne girebilir? örneğin:

System.out.print("Hello World"); 
System.out.print("My name is" + foo); 
System.out.print("Sum of " + a + "and " + b + "is " + c); 
System.out.print("Total USD is " + usd); 

olursa olsun değişkenler a, b, c, usd, foo ya da nasıl geçtiğini, System.out.print() bir hata atar asla bir veri türü ne.

Benim için hiçbir zaman, ihtiyacın böyle olduğu herhangi bir proje üzerinde çalışmadım. Eğer böyle bir gereklilik varsa, bunu nasıl çözeceğimi gerçekten bilmiyorum.

Herkes bana nasıl yapıldığını açıklayabilir mi?

+7

arasında olmalıdır. – SJuan76

+11

_System.out.print() asla bir hata atmaz. Gerçekten mi? Eh, senin örneğinde, her satırda ama ilk bir hata atar. Virgül, farklı parametreleri ayırmak için kullanılır ve 'System.out.print(), 1 parametresini kabul eder. 'Dizgiler arasında birleştirme' + 'operatörü kullanılarak yapılır. . – BackSlash

+1

, bir yazım hatası mı? + 'yerine – pinkpanther

cevap

11

System.out sadece PrintStream örneğidir. Onun JavaDoc kontrol edebilirsiniz. Onun değişkenliği method overloading (aynı ada sahip, ancak farklı parametreleri ile birden çok yöntem) dayanmaktadır. Bu yazdırma akışı çıktısını standard output'a gönderir. Sorunuza olarak


Eğer variadic functions denilen bir teknik söz (ya varargs). Ne yazık ki bu PrintStream#print tarafından desteklenmiyor, bu yüzden başka bir şeyle karıştırıyor olmalısınız. Ancak bunları Java'da uygulamak çok kolaydır. Java olmayan dize değişkenleri "foo" + 1 + true + myObj bitiştirmek bilir nasıl fikriniz yoksa Just check the documentation.


Ve bu temelde bir Java derleyicisi sorumluluğundadır.

Birleştirme işleminde bir değişken yoksa, derleyici dizeyi basitçe birleştirir. İlgili bir değişken olduğunda, birleştirme StringBuilder#append zincirine çevrilir. Sonuç bayt kodunda birleştirme komutu yoktur; Yani, derleme sırasında + operatörü (dizgi birleştirme hakkında konuşurken) çözümlenir. Java

her türlü dize dönüştürülebilir (Boolean sınıfında yöntemlerle Integer sınıfında, boolean yılında yöntemlerle int, onların kendi #toString aracılığıyla nesneleri, ...). Eğer ilgileniyorsanız, StringBuilder'ın kaynak kodunu kontrol edebilirsiniz.


GÜNCELLEME

: Kendimi meraklı ve benim örnek System.out.println("foo" + 1 + true + myObj) içine derler Ne ( javap kullanarak) kontrol etti. sonucun:

System.out.println(new StringBuilder("foo1true").append(myObj).toString()); 
+0

Tam olmak gerekirse, argüman aşırı yüklenmesine izin verilirken, dönüş değeri aşırı yüklenmesi buna eklenemez. +1. – fge

+0

Neden bu cevabın neden kaldırıldığını anlamıyorum, çünkü yanlış. 'system.out.print' değişken sayıda argüman almaz, sadece tek bir string alır. – Devolus

+2

@Devolus, belki de * bunu desteklemediğini söylüyorum çünkü? Lütfen indirmeden önce okuyun. –

0

Onun tüm yaklaşık Method Overloading.

bir nesne basar ve daha sonra hat sonlandırma: Nesneyi başarılı olursa

println() method

her veri tipi için tek tek yöntem vardır. Bu yöntem, basılı nesnenin dize değerini elde etmek için ilk String.valueOf (x) işlevini çağırır, sonra yazdırmayı (String) ve ardından println() çağırıyormuş gibi davranır. println (String x) yöntemini karşılık gelen

çağırır: Eğer basit tür başarılı olursa

: Eğer dize geçmesi halinde basit bir tür yöntemle karşılık gelen

aramaları

0

Sana printf(String format, Object... args) yöntemiyle karıştı olduğunu düşünüyorum. İlk argüman zorunlu olan biçim dizgesidir, dinlenmek için Object s rasgele bir sayıyı geçebilirsiniz.

Hem print() hem de println() yöntemleri için böyle bir aşırı yükleme yoktur.

2

o System.put.print...() öyle değil bağımsız değişken bir numara almak gibi görünmeye bile. Eğer yakından bakarsanız, dize basitçe birleştirilir ve aynısını herhangi bir dizeyle yapabilirsiniz. Olan tek şey, geçiş yaptığınız nesnelerin, toString() yöntemini çağıran java tarafından bir dizgeye dönüştürülmesidir. Bunu denerseniz

o başarısız olur: Burada örtük dönüştürme yapılmaz çünkü

int i = 0; 
    String s = i; 
    System.out.println(s); 

Sebep vardır.

Eğer

çalıştığını
int i = 0; 
    String s = ""+i; 
    System.out.println(s); 

olarak değiştirin Ancak eğer bu yanı System.put.print...() kullanırken bu olur.

Eğer C printf gibi bir şey mimimc için java bağımsız değişken bir dizi uygulamak istiyorsanız bunu şöyle ilan edebilir:

ile, burada olur Strings bir dizi geçirilen olmasıdır Ne
public void t(String s, String ... args) 
{ 
    String val = args[1]; 
} 

Sağlanan argümanların uzunluğu. Burada Java sizin için kontrol türünü yapabilir. Sonra gerçekten bir printf istiyorsanız

böyle yapmak zorunda:

public void t(String s, Object ... args) 
{ 
    String val = args[1].toString(); 
} 

Sonra döküm veya buna göre argümanları yorumlamak gerekir.

0

Neyin yazdırılacağını seçtiyseniz, istediğiniz her şeyi bir String'e dönüştürebilirsiniz.Objet.toString() varsayılan bir dumb dizesi döndürdüğünden gereksinim oldukça basitti: package.classname + @ + object number.

Baskı yönteminiz bir XML veya JSON serileştirme döndürüyorsa, toString() temel sonucu kabul edilemez. Yöntem başarılı olsa bile.

Aşağıda Java şey [email protected] yazdırır

public class MockTest{ 

String field1; 

String field2; 

public MockTest(String field1,String field2){ 
this.field1=field1; 
this.field2=field2; 
} 

} 

System.out.println(new MockTest("a","b"); 

dilsiz olabileceğini göstermek için basit bir örnektir! Sadece iki dize üyesi var ve bu

[email protected]{"field1":"a","field2":"b"} 

yazdırmak için uygulanabilecek olsa (ya da hemen hemen o Debbuger nasıl görüneceği) O Sistemini nasıl çalıştığını anlamak için çok hassas bir noktadır

0

. out.print. İlk öğe String ise, artı (+) operatörü Strig concate operatörü olarak çalışır. İlk eleman tamsayıysa artı (+) operatörü matematiksel operatör olarak çalışır.

public static void main(String args[]) { 
     System.out.println("String" + 8 + 8); //String88 
     System.out.println(8 + 8+ "String"); //16String 
    } 
0

Derleyici geliştiriciler bazı akıllılık eklediklerini düşünmelerine rağmen, derleyici kafa karıştırıcı bir şekilde yapıldı. Gerçekten eklemeleri gereken gerçek zenginlik, argümanın tamamını incelemek ve + operatörü tutarlı bir şekilde yorumlamaktır. `System.out.print` (` PrintWriter`) kesinlikle 2 4'e repliklerinizi desteklemez, bu böyle bir yöntemi vardır, çünkü Örneğin, System.out.println(1+2+"hello"+3+4);, çıkış 3hello7 yerine 3hello34 bir hata var