重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Shape.java接口代码
成都网站设计、成都做网站,成都做网站公司-创新互联公司已向成百上千企业提供了,网站设计,网站制作,网络营销等服务!设计与技术结合,多年网站推广经验,合理的价格为您打造企业品质网站。
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());
}
}
上面是我写的代码,下图是执行结果,麻烦看一下,是否可以。
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;
}
//判断月数1-12月
public boolean isMonth(){
boolean suc=false;
if(month0||month12)return false;
else suc=true;
return suc;
}
//判断天数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;
}
//根据日期得到天数
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;
}
}
//根据天数得到日期数int[]由,年、月、日组成的数组
public int[] getDateByDays(int days){
int das=0;//预计的天数
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("请输入合法天数!!!");
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};//年,月,日
}
}
//得到两个日期相距天数
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;
}
}
}
我写了你提出的功能,你还可以扩展其它功能。
如何编写高质量代码,从而提升系统性能。想必是很多程序员都非常注意的地方,最近总结了一些要点,特此记录在案。 所谓代码高可读性和高可维护性,其实就是应该有着规范的Java程序设计风格,在开发程序过程中,从近期目标看是应该着眼于功能实现,但是只能解一时之渴,而不思长远之计,确不可取,一个杂乱无序的代码让人看后有一种不解其意,心绪烦乱的感觉。所以,作为一名合格的程序员,一定要确定一个观点就是你编写出来的代码不只是给你一个人看的,还是给别人看的,所以在开发过程中文件注释头,java源文件编排格式,方法体的具体业务含义的注释都是必须的。 如程序注释就分为块注释与行注释 。例如块注释为
/**
* @param
@return
*/
行注释
/** **/或者 //
再者就是方法的命名也需要多加斟酌,一个业务方法,如果取最能体现体现该业务的名字,这样读者几乎不需要看代码便可以知道该方法具体用途。 高质量的代码其实很多时候都在一些小细节中体现,对于每个程序员来说一个for循环都会写,可是却有很多人没有能在代码中体现出高效性来,在这里我用简单的一个例子来说明:一个ArrayList需要遍历。 一般人会写成for(int i=0;ilist.size();i++) 这有问题吗?没有问题,能够完成程序员的意图的功能。
可是它高效吗?你有注意到这点吗?其实问题就出现在list.size()方法,这个方法是计算一个list的大小,本身它不会存在任何问题,可是将它放在了一个for()循环中的话,就很有问题了,因为如果一个N次的for循环,这个方法就需要被执行N次,这样的代码就造成计算机花很多的时间去做没有意义的事情,而本来这个list.size()方法只需要计算一次的就可以了,所以我们把计算list大小的方法放在for循环外面去定义的话,效率就可以得到提高
如: int size = list.size();
for(int i=0;isize;i++)
关于For循环还有一个要注意的地方,就是在for循环里面去New一个新对象。如:
for(int i=0;i10;i++){
A a = new A();
}
是不是怎么看都不会有问题,是的在语法上。或者是执行业务处理逻辑的时候,它都是没有任何问题的,可是这是从语言级别去看待问题,没有深入到它的实现机制上去看待问题。
在介绍这个问题的之前我想先简单说下关于java内存的机制:java是如何在内存中保存对象,我们回到A a=new A()在内存中是怎么分配这个问题来,
首先在栈中开辟一段空间存放引用a,然后在堆中开辟一段空间存放新建的A对象,同时引用a指向堆中新建得A对象,a所指代的对象地址为A在堆中地址。根据javaGC机制,只有对象已经没有引用指向它的时候,才有可能被GC给回收,所以基于这种机制的话,上述的一个For循环就会存在很大的效率问题了,如果循环有1000次,在内存中栈会有1000个引用,而堆中也会有1000个新生成的对象,同时1000个引用会相应指向1000个新生成的对象,即使这个for循环结束,也不会有任何改变。但是实际上1000个引用的生成完全是没有必要的,如果有着编写高性能代码的想法的话:像这样的for循环完全可以这样写:
A a = null;
for(int i=0;i1000;i++){
a = new A();
...
}
这样的代码在内存中便只会在栈中生成一个指向,每当一个for循环结束后,这个指向会指向下一个新生成的对象,前面生成的对象就会失去指向,这样GC就有可能更加快速的回收这些已经失去功能的对象。 在java中其实new 一个对象是非常耗费时间的,特别是重量级对象,所以每次在new 对象的时候一定需要考虑清楚是不是非的生成一个对象才能完成我的业务需求呢?总之能够根据实际情况,然后举一反三的话,我相信大家编写出来的代码就会更加高效了。
其次是针对同步的慎重考虑,因为我们一旦用了synchronized这个关键字后,就很可能丧失了并行的功效,所以在开发的过程中需要注意到线程是不是会对共有的资源进行处理,然后在慎重选择Synchronized 关键字,其实大家可以考虑用ThreadLocal这个类,它的优点是既保证同步的情况下仍然能保证并行,缺点是会占用更多的空间去换取换取时间。
最后,便是在j2ee开发过程中对数据库操作的优化,在这里我只针对代码级别的优化,关于数据库级别的我不涉及。大家编写SQL的时候会不会注意到一些原则,在这里我将罗列一些需要注意的要点。(总结肯定不会很全,我希望如果有大虾能给予更多的经验指导,在下将会感激万分。)
(1)在搜索子句的列名边要避免函数、算术操作符和其它的表达式,除非建立基于函数的索引
(2)使用复合索引的第一个列名
(3)SELECT子句中避免使用 ‘*’
(4)如果可能尽量多用"Commit"
(5)避免在索引列上使用IS null和Is not null
(6)用Union -all替换Union(如果可能的话)
(7)Oracel 采用自下而上的顺序解析WHERE子句,可以过滤掉最大数量记录的条件写在WHERE子句的末尾
(8)between谓词可以转化为=and=子句,比如:price between 10 and 20
可以转化为 price= 10 and =20
(9)like子句中匹配值的第一个字符是常量,也可以进行转换, 例如:
like “sm%”可以转换成 =“sm” and “sn”
(10)在子查询,exists和in要比not exists和not in执行得快,因为对于exists和in,优化器只要找到一条记录就可以返回TRUE,而对于not exists和not in则必须检查所有的值。
以上10条总结如果在编写sql的时候能注意到的话,将会在一定程度上提高java跟数据交互的性能。
那么除了在SQL上下功夫来提高性能之外,编写合适的事务处理也将带来一些性能提高。我们都知道事务具有:原子性,隔离性,一致性,持久性,所以在使用事务的时候肯定是牺牲并发性能为代价的。特别是一个涉及update的事务处理的时候,数据库会在表上加上排他锁,而一个数据资源只要被一个事务放置了排他锁,其他事务将不能放上排他锁,一定要一直等到事务结束后才释放。所以在这种情况下的,并发性就会被抹杀掉了。我们不能改变这种加锁的机制,但是我们可以用另外一种方式来达到一定程度的性能提升,那就是根据实际情况将一个大事务分解成小事务来处理。简而言之就是减低事务放置排他锁和释放排他锁的时间间隔,这样可以让其他的事务能更快的访问到数据资源。而关于大事务分解一定要小心使用,如果使用不恰当的话很可能会产生意想不到的数据不一致错误。
做到这些规则的目的很简单,就是写出“优美”的Java代码来。
1、Java注释尽可能全面
对于方法的注释应该包含详细的入参和结果说明,有异常抛出的情况也要详细叙述:类的注释应该包含类的功能说明、作者和修改者。
2、多次使用的相同变量最好归纳成常量 多处使用的相同值的变量应该尽量归纳为一个常量,方便日后的维护。
3、尽量少的在循环中执行方法调用 尽量在循环中少做一些可避免的方法调用,这样可以节省方法栈的创建。例如:
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的选择 这个问题比较常见。通常程序员最好能够对list的使用场景做出评估,然后根据特性作出选择。ArrayList底层是使用数组实现的,因此随机读取数据 会比LinkedList快很多,而LinkedList是使用链表实现的,新增和删除数据的速度比ArrayList快不少。
6、String,StringBuffer和StringBuilder 这个问题也比较常见。在进行字符串拼接处理的时候,String通常会产生多个对象,而且将多个值缓存到常量池中。例如:
String a=“a”;
String b=“b”;a=a+b;这种情况下jvm会产生“a”,“b”,“ab”三个对象。而且字符串拼接的性能也很低。因此通常需要做字符串处理的时候尽量采用StringBuffer和StringBuilder来。
7、包装类和基本类型的选择 在代码中,如果可以使用基本数据类型来做局部变量类型的话尽量使用基本数据类型,因为基本类型的变量是存放在栈中的,包装类的变量是在堆中,栈的操作速度比堆快很多。
8、尽早的将不再使用的变量引用赋给null 这样做可以帮助jvm更快的进行内存回收。当然很多人其实对这种做法并不感冒。
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);
}
}