您好:
環(huán)縣網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),環(huán)縣網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為環(huán)縣上千多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的環(huán)縣做網(wǎng)站的公司定做!
代碼及運(yùn)行結(jié)果如下,供參考:
代碼示意圖
運(yùn)行結(jié)果示意圖
因輸出的內(nèi)容中包含特殊字符,所以在輸出的時(shí)候,需要做轉(zhuǎn)義,以上代碼供參考。
public?static?void?main(String[]?args){
String?新郎="新郎名字";
String?新娘="新娘名字";
System.out.println("祝新郎"+新郎+"和新娘"+新娘+"新婚幸福");
}
Java編譯原理:
Java 虛擬機(jī)(JVM)是可運(yùn)行Java 代碼的假想計(jì)算機(jī)。只要根據(jù)JVM規(guī)格描述將解釋器移植到特定的計(jì)算機(jī)上,就能保證經(jīng)過(guò)編譯的任何Java代碼能夠在該系統(tǒng)上運(yùn)行。
一.Java源文件的編譯、下載 、解釋和執(zhí)行
Java應(yīng)用程序的開發(fā)周期包括編譯、下載 、解釋和執(zhí)行幾個(gè)部分。Java編譯程序?qū)ava源程序翻譯為JVM可執(zhí)行代碼?字節(jié)碼。這一編譯過(guò)程同C/C++ 的編譯有些不同。當(dāng)C編譯器編譯生成一個(gè)對(duì)象的代碼時(shí),該代碼是為在某一特定硬件平臺(tái)運(yùn)行而產(chǎn)生的。因此,在編譯過(guò)程中,編譯程序通過(guò)查表將所有對(duì)符號(hào)的引用轉(zhuǎn)換為特定的內(nèi)存偏移量,以保證程序運(yùn)行。Java編譯器卻不將對(duì)變量和方法的引用編譯為數(shù)值引用,也不確定程序執(zhí)行過(guò)程中的內(nèi)存布局,而是將這些符號(hào)引用信息保留在字節(jié)碼中,由解釋器在運(yùn)行過(guò)程中創(chuàng)立內(nèi)存布局,然后再通過(guò)查表來(lái)確定一個(gè)方法所在的地址。這樣就有效的保證了Java的可移植性和安全 性。
運(yùn)行JVM字節(jié)碼的工作是由解釋器來(lái)完成的。解釋執(zhí)行過(guò)程分三部進(jìn)行:代碼的裝入、代碼的校驗(yàn)和代碼的執(zhí)行。裝入代碼的工作由"類裝載器"(class loader)完成。類裝載器負(fù)責(zé)裝入運(yùn)行一個(gè)程序需要的所有代碼,這也包括程序代碼中的類所繼承的類和被其調(diào)用的類。當(dāng)類裝載器裝入一個(gè)類時(shí),該類被放在自己的名字空間中。除了通過(guò)符號(hào)引用自己名字空間以外的類,類之間沒有其他辦法可以影響其他類。在本臺(tái)計(jì)算機(jī)上的所有類都在同一地址空間內(nèi),而所有從外部引進(jìn)的類,都有一個(gè)自己獨(dú)立的名字空間。這使得本地類通過(guò)共享相同的名字空間獲得較高的運(yùn)行效率,同時(shí)又保證它們與從外部引進(jìn)的類不會(huì)相互影響。當(dāng)裝入了運(yùn)行程序需要的所有類后,解釋器便可確定整個(gè)可執(zhí)行程序的內(nèi)存布局。解釋器為符號(hào)引用同特定的地址空間建立對(duì)應(yīng)關(guān)系及查詢表。通過(guò)在這一階段確定代碼的內(nèi)存布局,Java很好地解決了由超類改變而使子類崩潰的問題,同時(shí)也防止了代碼對(duì)地址的非法訪問。
隨后,被裝入的代碼由字節(jié)碼校驗(yàn)器進(jìn)行檢查。校驗(yàn)器可發(fā)現(xiàn)操作數(shù)棧溢出,非法數(shù)據(jù)類型轉(zhuǎn)化等多種錯(cuò)誤。通過(guò)校驗(yàn)后,代碼便開始執(zhí)行了。
Java字節(jié)碼的執(zhí)行有兩種方式:
1.即時(shí)編譯方式:解釋器先將字節(jié)碼編譯成機(jī)器碼,然后再執(zhí)行該機(jī)器碼。
2.解釋執(zhí)行方式:解釋器通過(guò)每次解釋并執(zhí)行一小段代碼來(lái)完成Java字節(jié)碼程 序的所有操作。
通常采用的是第二種方法。由于JVM規(guī)格描述具有足夠的靈活性,這使得將字節(jié)碼翻譯為機(jī)器代碼的工作
具有較高的效率。對(duì)于那些對(duì)運(yùn)行速度要求較高的應(yīng)用程序,解釋器可將Java字節(jié)碼即時(shí)編譯為機(jī)器碼,從而很好地保證了Java代碼的可移植性和高性能。
NewPhone類
package?com.baidu.question;
public?class?NewPhone?extends?Phone?{
private?boolean?mute?=?true;
@Override
public?void?call()?{
if(mute){
super.call();
}else{
System.out.println("語(yǔ)音已關(guān)閉");
}
}
//這里是直接設(shè)置
public?void?setMute(boolean?mute){
this.mute=mute;
}
//擔(dān)心你的題目是要求兩種方法,寫的第二種,下面兩個(gè)方法負(fù)責(zé)開關(guān)
public?void?openMute(){
this.mute=true;
/*
*?也可以這樣寫
*?setMute(true);
*?下邊的方法一樣
*?*/
}
public?void?closeMute(){
this.mute?=?false;
}
}
Phone類
package?com.baidu.question;
public?class?Phone?{
public?void?call(){
System.out.println("打電話");
}
}
測(cè)試類
package?com.baidu.question;
public?class?PhoneTest?{
public?static?void?main(String[]?args)?{
Phone?phone?=?new?Phone();
phone.call();
NewPhone?newPhone?=?new?NewPhone();
newPhone.call();
newPhone.setMute(false);
newPhone.call();
newPhone.openMute();
newPhone.call();
newPhone.closeMute();
newPhone.call();
}
}
測(cè)試結(jié)果
打電話
打電話
語(yǔ)音已關(guān)閉
打電話
語(yǔ)音已關(guān)閉
Java代碼之于java程序員而言就是左膀右臂,java代碼寫的好的java程序員明顯更是企業(yè)的歡迎,一個(gè)優(yōu)秀的java程序員的考核標(biāo)準(zhǔn)之一也是看他的編程水平。
其實(shí)有的java程序員java代碼會(huì)受到大家的追捧,是因?yàn)樗趯懘a時(shí)注意的細(xì)節(jié)往往多于那些不怎么關(guān)注java代碼編程細(xì)節(jié)的程序員,俗話說(shuō):“細(xì)節(jié)決定成敗”,那么如何寫出好的java代碼呢?IT培訓(xùn)介紹一起來(lái)討論下:
1.重視注釋
有的java程序員在寫代碼時(shí),從來(lái)沒有想過(guò)要在java代碼后加上相關(guān)的注釋,甚至是上萬(wàn)行的代碼也沒有想過(guò)加上注釋,這就存在很大的問題,不說(shuō)你的代碼會(huì)跟其他人分享討論,就你自己回顧你是怎么寫好這篇代碼的,你也是半天無(wú)法理出頭緒,這就為維護(hù)和修改等等工作添加了很大的麻煩。所以,要想寫出好的java代碼,一定從簡(jiǎn)短的java代碼編寫開始注重在java代碼后面加上相應(yīng)的注釋,養(yǎng)成良好的習(xí)慣。
2.重視排版整潔
看很多java程序員的排版總覺得在欣賞一幅藝術(shù)品,但是看到一些java程序員的排版卻總覺得無(wú)力吐槽。同樣是編寫代碼,但是給人的視覺體驗(yàn)是相當(dāng)?shù)牟煌?,?dāng)然好的java代碼給人的享受也是美的,所以要想寫出好的代碼,一定要重視排版整潔。
3.注重命名規(guī)則
現(xiàn)在在一個(gè)團(tuán)隊(duì)開發(fā)中,都會(huì)提前定制一個(gè)統(tǒng)一的命名規(guī)則,這樣利于提高工作效益。但是很多java程序員是缺乏這個(gè)意識(shí)的,每次敲代碼,更喜歡按照自己慣常的方式老命名模塊、函數(shù),這樣是方便了自己,但是忽視團(tuán)隊(duì)協(xié)作,所以在日常工作中,特別是團(tuán)隊(duì)工作中一定要重視命名規(guī)則。
4.養(yǎng)成備份習(xí)慣
備份的重要性不用小編強(qiáng)調(diào),相必你也知道。但是有的java程序員就是沒有養(yǎng)成這樣的好習(xí)慣,每次敲完代碼就不記得隨手保存,每次等到除了事故,比如電腦出了故障,辛辛苦苦敲打的java代碼沒保存找不回來(lái)的情況下就開始懊惱,與其這樣還不如在一開始就養(yǎng)成良好的備份習(xí)慣,這樣也方便自己日后查找利用。
package com.date;
public class DateDome {
private int year=0;//年
private int month=0;//月
private int day=0;//日
public DateDome(int year,int month,int day){
this.year=year;
this.month=month;
this.day=day;
}
public DateDome(){
}
//年大于等于0
public boolean isYear(){
boolean suc=false;
if(year0)return suc;
else if(year=0)suc=true;
return suc;
}
//判斷月數(shù)1-12月
public boolean isMonth(){
boolean suc=false;
if(month0||month12)return false;
else suc=true;
return suc;
}
//判斷天數(shù)1-31號(hào)
public boolean isDay(){
boolean suc=false;
if(day=0||day31)return suc;
else suc=true;
return suc;
}
//是否為閏年
public boolean isRunNian(int year){
boolean suc=false;
if(year=0){
if(year%400==0||(year%4==0year%100!=0)){
suc=true;
}
}
return suc;
}
//判斷合法年月日
public boolean isInvaildate(int year,int month, int day){
boolean suc=false;
if(isYear()isMonth()isDay()){
switch(month){
case 1:
suc=true;
break;
case 2:
if(isRunNian(year)day=29){
suc=true;
}else if(day=28){
suc=true;
}
break;
case 3:
suc=true;
break;
case 4:
if(day=30)suc=true;
break;
case 5:
suc=true;
break;
case 6:
if(day=30)suc=true;
break;
case 7:
suc=true;
break;
case 8:
suc=true;
break;
case 9:
if(day=30)suc=true;
break;
case 10:
suc=true;
break;
case 11:
if(day=30)suc=true;
break;
case 12:
suc=true;
break;
}
}
return suc;
}
//根據(jù)日期得到天數(shù)
public int getDaysByDate(int year,int month,int day){
int days=0;
if(isInvaildate(year,month,day)){
for(int i=0;iyear;i++){
if(isRunNian(i)){
days+=366;
}else{
days+=365;
}
}
for(int i=1;imonth;i++){
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12){
days+=31;
}else if(i==4||i==6||i==9||i==11){
days+=30;
}else if(i==2){
if(isRunNian(year)){
days+=29;
}else{
days+=28;
}
}
}
days+=day-1;
return days;
}else{
System.out.println("處理有非法日期!??!");
return -1;
}
}
//根據(jù)天數(shù)得到日期數(shù)int[]由,年、月、日組成的數(shù)組
public int[] getDateByDays(int days){
int das=0;//預(yù)計(jì)的天數(shù)
int y=0,m=1,d=1;//0年1月1號(hào)
int[] date=new int[3];
boolean suc=true;
int temp=0;
if(days0){
System.out.println("請(qǐng)輸入合法天數(shù)!??!");
return new int[]{0,0,0};
}
while(suc){
if(isRunNian(y)){
temp=366;
}else{
temp=365;
}
das+=temp;
if(dasdays){
y++;
}else{
das-=temp;
break;
}
}
while(suc){
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12){
temp=31;
}else if(m==4||m==6||m==9||m==11){
temp=30;
}else if(m==2){
if(isRunNian(y)){
temp=29;
}else{
temp=28;
}
}
das+=temp;
if(dasdays){
m++;
}else{
das-=temp;
break;
}
}
d=days-das+1;
date[0]=y;
date[1]=m;
date[2]=d;
return date;
}
//得到多少天前或后合法日期
public int[] addORsubDay(int dd){
int days=getDaysByDate(year,month,day);
if(days=0){
days+=dd;
if(days0){
return getDateByDays(days);
}else{
System.out.println("處理日期不能小于0年1月1號(hào)");
return new int[]{0,0,0};//代表無(wú)效日期
}
}else{
System.out.println("處理日期不能小于0年1月1號(hào)");
return new int[]{0,0,0};//年,月,日
}
}
//得到兩個(gè)日期相距天數(shù)
public int TwoDate(int[] date1,int[] date2){
int d=-1;
if(isInvaildate(date1[0],date1[1],date1[2])isInvaildate(date2[0],date2[1],date2[2])){
int days1=getDaysByDate(date1[0],date1[1],date1[2]);
int days2=getDaysByDate(date2[0],date2[1],date2[2]);
d=days1-days2;
return d=0?d:-d;
}else
{
System.out.println("處理有非法日期?。?!");
return d;
}
}
}
我寫了你提出的功能,你還可以擴(kuò)展其它功能。