华为Java企业级规范

一、"JAVA基础语句"编程规范

1. 建议:switch 语句要有default分支,除非其条件变量是枚举类型。

说明:
如果没有默认分支,当条件变量没有和任一case语句后的值匹配时,程序将不会有任何输出。

2. 使用break跳出swich语句。

说明:
switch语句的工作流程是,当条件变量的值和case语句后面的值相等时,switch语句从该位置开始向下执行,直到遇到break 或者 switch语句结束。

3. if-else if语句,最后应以else分支作为结尾。

说明:
else用以处理以上分支没有处理到的情况。

4. 不能用浮动数作为循环变量

说明:
浮动数不是一类精确的数据

5. 明确地进行数据类型转换

意外的浮动数截取转换将使得误差放大

二, "类的使用"编程规范

6. 使用类名调用静态方法,不要使用实例。

说明:
使用实例名调用静态方法时,调用的静态方法是声明类型的静态方法,
和实例的实际类型无关。
package BlueBridge;

public class Dog {
	public static void main(String [] args) {
		Dog dog = new Dog();
		Dog basenjiDog = new Basenji();
		dog.run();
		basenjiDog.run();
		dog.eat();
		basenjiDog.eat();
	}
	public static void eat() {
		System.out.println("Animal eat");
	}
	public void run() {
		System.out.println("Animal running");
	}
}

class Basenji extends Dog{
	public static void eat() {
		System.out.println("Basenji eat");
	}
	public void run() {
		System.out.println("Basenji running");
	}
}
Animal running
Basenji running
Animal eat
Animal eat

分析:
basenjiDog.eat(); 此处使用实例名调用静态,结果为Animal eat
总结:
父类和子类有同名非静态方法时,子类方法将重写父类方法;
【当子类的创建方式为 父类声明 子类实现时】
父类和子类有同名 静态方法时,父类方法将隐藏字类方法。

7. 避免无关的变量或概念重名,导致的隐藏(hiden),遮蔽(shadow),和遮掩(obscure)。

obscure: v.使模糊;使隐晦;使费解

说明:
override 存在于子类和父类之间。
	子类中的【实例方法】可以覆写 override 其在超类中能够访问(非私有)的同签名的实例方法(非静态方法)。
	
overload存在于某个类之间。
	某个类中的【某个方法】可以重载 overload 同类中的另一个具有相同命名和不同签名的方法。

hide 存在于子类和父类之间。	
	子类中的 【属性】,【静态方法】或者【内部类】可以被隐藏在 其超类中可以访问的同名(同签名)的属性,静态方法或内部类。
	子类中被隐藏的成员将不能被继承。

shadow 存在于某个类之间
	某个类中的 【属性】,【方法】和【内部类】可以分别 遮蔽 shadow 同类中的零个同名的属性,方法和内部类,使其无法使用简单名被引用。

override实例

public class Animal {
    private String name;
    private int id;

    public Animal(String name, int id) {
        this.name = name;
        this.id = id;
    }

    public void eat() {
        System.out.println("吃东西");
    }

    public void sleep() {
        System.out.println("睡觉");
    }
}
public class Horse extends Animal{
    public Horse(String name, int id) {
        super(name, id);
    }

    @Override
    public void eat() {
        System.out.println("吃草");
    }

    @Override
    public void sleep() {
        System.out.println("站着睡觉");
    }

}

hide实例

import java.awt.*;

class Swan {
    int weight = 1;

    public static void fly() {
        System.out.println("swan can fly");
    }

    public void gender(){
        System.out.println("雄");
    }

    public class  Blood{
        public int bp = 1;

        public void circulate() {
            System.out.println("swan`s blood circulate");
        }
    }
}

class UglyDuck extends Swan {
    int weight = 2;

    public static void fly() {
        System.out.println("ugly duck can`t fly ...");
    }

    public void gender() {
        System.out.println("雌");
    }

    public class Blood {
        public int bp = 2;

        public void circulate() {
            System.out.println("UglyDuck`s blood circulate");
        }
    }

}
public class Tester {
    public static void main(String[] args) {
        System.out.println("-----隐藏父类信息显示子类信息-----");
        UglyDuck 丑小鸭  = new UglyDuck(); // 从子类访问
        丑小鸭.fly(); // 隐藏父类静态方法
        丑小鸭.gender(); // 子类的实例方法
        System.out.println("丑小鸭的重量是 "+丑小鸭.weight); // 隐藏父类属性
        UglyDuck.Blood childInner = 丑小鸭.new Blood(); // 隐藏父类内部类
        childInner.circulate(); // 隐藏父类内部类的方法
        System.out.println("ugly Duck`s bp is "+childInner.bp);  // 隐藏父类内部类的属性

        System.out.println("-----显示父类信息-----");
        Swan father = new UglyDuck(); // 从父类访问
        father.fly(); // 父类的静态方法
        father.gender(); // 父类的实例方法
        System.out.println("天鹅的重量是 "+father.weight); // 显示父类属性
        Swan.Blood fatherInner = father.new Blood(); // 父类的内部类
        fatherInner.circulate(); // 父类内部类的方法
        System.out.println("Swan`s bp is "+fatherInner.bp); // 父类内部类的属性



    }
}
-----隐藏父类信息显示子类信息-----
ugly duck can`t fly ...
雌
丑小鸭的重量是 2
UglyDuck`s blood circulate
ugly Duck`s bp is 2
-----显示父类信息-----
swan can fly
雌
天鹅的重量是 1
swan`s blood circulate
Swan`s bp is 1

Process finished with exit code 0

8. 子类覆写父类方法时,应加上@Override注释

tip
覆写要求子类实例方法和父类实例方法的签名相同,即一下都相同:

  • 返回值
  • 方法名
  • 参数列表

9. 将对象存入HashSet或者作为Key存入HashMap时,必须确保对象的哈希值HashCode不变,避免因为哈希值的变化,导致对象不能从集合中删除。

实例9

import java.util.Objects;

public class Email {
    private String address;
    private String name;

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Email(String address, String name) {
        this.address = address;
        this.name = name;
    }

    @Override
    public int hashCode() {
        return Objects.hash(address, name);
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Email) {
            Email that = (Email) obj;
            return Objects.equals(this.address, that.address) &&
                    Objects.equals(this.name, that.name);
        }
        return false;
    }
}
import java.util.HashSet;
import java.util.Set;

public class TestEmail {
    public static void main(String[] args) {
        HashSet<Email> emailSet = new HashSet<>( ) ;
        Email email = new Email ( "fly.com", "Jim" ) ;
        emailSet .add(email ) ;
        email.setAddress( "run.com" ) ;
//        System.out.println(Set.contains(email ) ) ;
        emailSet.remove(email);
        for (Email setEmail : emailSet) {
            System.out.println(setEmail.getAddress());
            System.out.println(setEmail.getName());
        }
    }
}
run.com
Jim

分析:
emailset集合中只放入了一个对象email,最后却能将对象的信息打印,说明
emailSet.remove(email);删除语句没有成功。
原因就是对象的哈希值确定方式如下:

@Override
public int haseCode(){
		return Object.hash(address,name);
}

email.setAddress( "run.com" ) ;该语句将对象的Address改变导致对象的哈希值改变,使得对象不能被正确删除。

  1. 向下类型转换前使用instanceof进行判断

向下类型转换是指从大类型向小类型的转换

例如:

老虎类
动物类
山羊类
        Tiger tiger = new Tiger () ;
        Animal animal = tiger: // 向上类型转婪自动类型转换
        animal. eat O :
        Tiger tigerl = (Tiger) animal; // 向下类型转痪强制类型转换
        tiger1. eat() ;
        Goat goat= (Goat) animal; // 向下类型转换强制类型转痪
        goat. eat();

分析:
可能会因为类型不匹配导致运行期异常

        Tiger tiger = new Tiger () ;
        Animal animal = tiger;
        animal. eat () ;
        if ( animal instanceof Tiger) {
        Tiger tiger1 =  (Tiger) animal;
        tiger1.eat () ;
        } else {
        System.out.println("动物对象不能转换成老虎对象!");
        if (animal instanceof Goat) {
        Goat goat = (Goat) animal;
        goat. eat ();
        } else {
        System.out.println(" 动物对象不能转换成山羊对象!");
        }

三,"异常处理"编程规范

  • 0
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论

打赏作者

poorjackman

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值