Shape.java接口代碼
成都網(wǎng)站設計、成都做網(wǎng)站,成都做網(wǎng)站公司-創(chuàng)新互聯(lián)公司已向成百上千企業(yè)提供了,網(wǎng)站設計,網(wǎng)站制作,網(wǎng)絡營銷等服務!設計與技術結(jié)合,多年網(wǎng)站推廣經(jīng)驗,合理的價格為您打造企業(yè)品質(zhì)網(wǎng)站。
public interface Shape {
public static final double PI = 3.14d;
public double area();
}
Circle.java圓類代碼
public class Circle implements Shape {
private double radius;
public Circle(double radius) {
? this.radius = radius;
}
@Override
public double area() {
? return PI * this.radius * this.radius;
}
public double perimeter() {
? return 2 * PI * this.radius;
}
}
Cylinder.java圓柱體類代碼
public class Cylinder extends Circle {
private double height;
public Cylinder(double radius, double height) {
? super(radius);
? this.height = height;
}
public double area() {
? return 2 * super.area() + super.perimeter() * this.height;
}
public double volume() {
? return super.area() * this.height;
}
}
X5_3_6.java主類代碼
public class X5_3_6 {
public static void main(String[] args) {
? Circle cir1 = new Circle(5);
? System.out.println("圓的面積為:" + cir1.area());
? System.out.println("圓的周長為:" + cir1.perimeter());
? Cylinder cy1 = new Cylinder(10, 15);
? System.out.println("圓柱體的表面積為:" + cy1.area());
? System.out.println("圓柱體的體積為:" + cy1.volume());
}
}
上面是我寫的代碼,下圖是執(zhí)行結(jié)果,麻煩看一下,是否可以。
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號
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;//預計的天數(shù)
int y=0,m=1,d=1;//0年1月1號
int[] date=new int[3];
boolean suc=true;
int temp=0;
if(days0){
System.out.println("請輸入合法天數(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號");
return new int[]{0,0,0};//代表無效日期
}
}else{
System.out.println("處理日期不能小于0年1月1號");
return new int[]{0,0,0};//年,月,日
}
}
//得到兩個日期相距天數(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;
}
}
}
我寫了你提出的功能,你還可以擴展其它功能。
如何編寫高質(zhì)量代碼,從而提升系統(tǒng)性能。想必是很多程序員都非常注意的地方,最近總結(jié)了一些要點,特此記錄在案。 所謂代碼高可讀性和高可維護性,其實就是應該有著規(guī)范的Java程序設計風格,在開發(fā)程序過程中,從近期目標看是應該著眼于功能實現(xiàn),但是只能解一時之渴,而不思長遠之計,確不可取,一個雜亂無序的代碼讓人看后有一種不解其意,心緒煩亂的感覺。所以,作為一名合格的程序員,一定要確定一個觀點就是你編寫出來的代碼不只是給你一個人看的,還是給別人看的,所以在開發(fā)過程中文件注釋頭,java源文件編排格式,方法體的具體業(yè)務含義的注釋都是必須的。 如程序注釋就分為塊注釋與行注釋 。例如塊注釋為
/**
* @param
@return
*/
行注釋
/** **/或者 //
再者就是方法的命名也需要多加斟酌,一個業(yè)務方法,如果取最能體現(xiàn)體現(xiàn)該業(yè)務的名字,這樣讀者幾乎不需要看代碼便可以知道該方法具體用途。 高質(zhì)量的代碼其實很多時候都在一些小細節(jié)中體現(xiàn),對于每個程序員來說一個for循環(huán)都會寫,可是卻有很多人沒有能在代碼中體現(xiàn)出高效性來,在這里我用簡單的一個例子來說明:一個ArrayList需要遍歷。 一般人會寫成for(int i=0;ilist.size();i++) 這有問題嗎?沒有問題,能夠完成程序員的意圖的功能。
可是它高效嗎?你有注意到這點嗎?其實問題就出現(xiàn)在list.size()方法,這個方法是計算一個list的大小,本身它不會存在任何問題,可是將它放在了一個for()循環(huán)中的話,就很有問題了,因為如果一個N次的for循環(huán),這個方法就需要被執(zhí)行N次,這樣的代碼就造成計算機花很多的時間去做沒有意義的事情,而本來這個list.size()方法只需要計算一次的就可以了,所以我們把計算list大小的方法放在for循環(huán)外面去定義的話,效率就可以得到提高
如: int size = list.size();
for(int i=0;isize;i++)
關于For循環(huán)還有一個要注意的地方,就是在for循環(huán)里面去New一個新對象。如:
for(int i=0;i10;i++){
A a = new A();
}
是不是怎么看都不會有問題,是的在語法上。或者是執(zhí)行業(yè)務處理邏輯的時候,它都是沒有任何問題的,可是這是從語言級別去看待問題,沒有深入到它的實現(xiàn)機制上去看待問題。
在介紹這個問題的之前我想先簡單說下關于java內(nèi)存的機制:java是如何在內(nèi)存中保存對象,我們回到A a=new A()在內(nèi)存中是怎么分配這個問題來,
首先在棧中開辟一段空間存放引用a,然后在堆中開辟一段空間存放新建的A對象,同時引用a指向堆中新建得A對象,a所指代的對象地址為A在堆中地址。根據(jù)javaGC機制,只有對象已經(jīng)沒有引用指向它的時候,才有可能被GC給回收,所以基于這種機制的話,上述的一個For循環(huán)就會存在很大的效率問題了,如果循環(huán)有1000次,在內(nèi)存中棧會有1000個引用,而堆中也會有1000個新生成的對象,同時1000個引用會相應指向1000個新生成的對象,即使這個for循環(huán)結(jié)束,也不會有任何改變。但是實際上1000個引用的生成完全是沒有必要的,如果有著編寫高性能代碼的想法的話:像這樣的for循環(huán)完全可以這樣寫:
A a = null;
for(int i=0;i1000;i++){
a = new A();
...
}
這樣的代碼在內(nèi)存中便只會在棧中生成一個指向,每當一個for循環(huán)結(jié)束后,這個指向會指向下一個新生成的對象,前面生成的對象就會失去指向,這樣GC就有可能更加快速的回收這些已經(jīng)失去功能的對象。 在java中其實new 一個對象是非常耗費時間的,特別是重量級對象,所以每次在new 對象的時候一定需要考慮清楚是不是非的生成一個對象才能完成我的業(yè)務需求呢?總之能夠根據(jù)實際情況,然后舉一反三的話,我相信大家編寫出來的代碼就會更加高效了。
其次是針對同步的慎重考慮,因為我們一旦用了synchronized這個關鍵字后,就很可能喪失了并行的功效,所以在開發(fā)的過程中需要注意到線程是不是會對共有的資源進行處理,然后在慎重選擇Synchronized 關鍵字,其實大家可以考慮用ThreadLocal這個類,它的優(yōu)點是既保證同步的情況下仍然能保證并行,缺點是會占用更多的空間去換取換取時間。
最后,便是在j2ee開發(fā)過程中對數(shù)據(jù)庫操作的優(yōu)化,在這里我只針對代碼級別的優(yōu)化,關于數(shù)據(jù)庫級別的我不涉及。大家編寫SQL的時候會不會注意到一些原則,在這里我將羅列一些需要注意的要點。(總結(jié)肯定不會很全,我希望如果有大蝦能給予更多的經(jīng)驗指導,在下將會感激萬分。)
(1)在搜索子句的列名邊要避免函數(shù)、算術操作符和其它的表達式,除非建立基于函數(shù)的索引
(2)使用復合索引的第一個列名
(3)SELECT子句中避免使用 ‘*’
(4)如果可能盡量多用"Commit"
(5)避免在索引列上使用IS null和Is not null
(6)用Union -all替換Union(如果可能的話)
(7)Oracel 采用自下而上的順序解析WHERE子句,可以過濾掉最大數(shù)量記錄的條件寫在WHERE子句的末尾
(8)between謂詞可以轉(zhuǎn)化為=and=子句,比如:price between 10 and 20
可以轉(zhuǎn)化為 price= 10 and =20
(9)like子句中匹配值的第一個字符是常量,也可以進行轉(zhuǎn)換, 例如:
like “sm%”可以轉(zhuǎn)換成 =“sm” and “sn”
(10)在子查詢,exists和in要比not exists和not in執(zhí)行得快,因為對于exists和in,優(yōu)化器只要找到一條記錄就可以返回TRUE,而對于not exists和not in則必須檢查所有的值。
以上10條總結(jié)如果在編寫sql的時候能注意到的話,將會在一定程度上提高java跟數(shù)據(jù)交互的性能。
那么除了在SQL上下功夫來提高性能之外,編寫合適的事務處理也將帶來一些性能提高。我們都知道事務具有:原子性,隔離性,一致性,持久性,所以在使用事務的時候肯定是犧牲并發(fā)性能為代價的。特別是一個涉及update的事務處理的時候,數(shù)據(jù)庫會在表上加上排他鎖,而一個數(shù)據(jù)資源只要被一個事務放置了排他鎖,其他事務將不能放上排他鎖,一定要一直等到事務結(jié)束后才釋放。所以在這種情況下的,并發(fā)性就會被抹殺掉了。我們不能改變這種加鎖的機制,但是我們可以用另外一種方式來達到一定程度的性能提升,那就是根據(jù)實際情況將一個大事務分解成小事務來處理。簡而言之就是減低事務放置排他鎖和釋放排他鎖的時間間隔,這樣可以讓其他的事務能更快的訪問到數(shù)據(jù)資源。而關于大事務分解一定要小心使用,如果使用不恰當?shù)脑捄芸赡軙a(chǎn)生意想不到的數(shù)據(jù)不一致錯誤。
做到這些規(guī)則的目的很簡單,就是寫出“優(yōu)美”的Java代碼來。
1、Java注釋盡可能全面
對于方法的注釋應該包含詳細的入?yún)⒑徒Y(jié)果說明,有異常拋出的情況也要詳細敘述:類的注釋應該包含類的功能說明、作者和修改者。
2、多次使用的相同變量最好歸納成常量 多處使用的相同值的變量應該盡量歸納為一個常量,方便日后的維護。
3、盡量少的在循環(huán)中執(zhí)行方法調(diào)用 盡量在循環(huán)中少做一些可避免的方法調(diào)用,這樣可以節(jié)省方法棧的創(chuàng)建。例如:
for(int i=0;ilist.size();i++){
System.out.println(i);}可以修改為:
for(int i=0,size=list.size();isize;i++){
System.out.println(i);}4、常量的定義可以放到接口中 在Java培訓中,接口里只允許存在常量,因此把常量放到接口中聲明就可以省去public static final這幾個關鍵詞。
5、ArrayList和LinkedList的選擇 這個問題比較常見。通常程序員最好能夠?qū)ist的使用場景做出評估,然后根據(jù)特性作出選擇。ArrayList底層是使用數(shù)組實現(xiàn)的,因此隨機讀取數(shù)據(jù) 會比LinkedList快很多,而LinkedList是使用鏈表實現(xiàn)的,新增和刪除數(shù)據(jù)的速度比ArrayList快不少。
6、String,StringBuffer和StringBuilder 這個問題也比較常見。在進行字符串拼接處理的時候,String通常會產(chǎn)生多個對象,而且將多個值緩存到常量池中。例如:
String a=“a”;
String b=“b”;a=a+b;這種情況下jvm會產(chǎn)生“a”,“b”,“ab”三個對象。而且字符串拼接的性能也很低。因此通常需要做字符串處理的時候盡量采用StringBuffer和StringBuilder來。
7、包裝類和基本類型的選擇 在代碼中,如果可以使用基本數(shù)據(jù)類型來做局部變量類型的話盡量使用基本數(shù)據(jù)類型,因為基本類型的變量是存放在棧中的,包裝類的變量是在堆中,棧的操作速度比堆快很多。
8、盡早的將不再使用的變量引用賦給null 這樣做可以幫助jvm更快的進行內(nèi)存回收。當然很多人其實對這種做法并不感冒。
import?java.util.Scanner;
import?java.util.Calendar;
public?class?Yugi?{
public?static?void?main(String[]?args)?{
Scanner?scanner?=?new?Scanner(System.in);
System.out.println("輸入一個時間:?");
String[]?strs?=?scanner.nextLine().trim().split("[^\\d]+");
scanner.close();
Calendar?calendar?=?Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,?Integer.parseInt(strs[0]));
calendar.set(Calendar.MINUTE,?Integer.parseInt(strs[1]));
calendar.set(Calendar.SECOND,?Integer.parseInt(strs[2]));
calendar.add(Calendar.SECOND,?1);
System.out.format("下一秒是:%1$tH點%1$tM分%1$tS秒",?calendar);
}
}
本文題目:java高級代碼寫法 java優(yōu)雅代碼
文章來源:http://muchs.cn/article34/doccppe.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、移動網(wǎng)站建設、標簽優(yōu)化、網(wǎng)站導航、、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)