类与类的关系
成都创新互联公司是一家专业提供盖州企业网站建设,专注与成都做网站、成都网站建设、H5建站、小程序制作等业务。10年已为盖州众多企业、政府机构等服务。创新互联专业网络公司优惠进行中。
1、依赖关系
依赖关系表示一个类依赖于另一个类的定义。通俗来讲即是类A中使用了另外的一个类B,且类B并非类A中作为属性存在,即表示类A依赖于类B。对象之间最弱的一种关联方式,是临时性的关联。代码中一般指由局部变量、函数参数、返回值建立的对于其他对象的调用关系。
class A{
public B method(C c){
B b = new B();
return b;
}
}
登录后复制
2、关联关系
关联关系是类与类之间的联接,它使一个类知道另一个类的属性和方法。通俗来讲即类A中有一个属性b,该属性的数据类型为类B,类A可以通过属性b调用类B的属性与方法。也即一般来说的has-a的关系。
class A{
public B b;
}
登录后复制
3、聚合关系
聚合关系是特殊的关联关系,其与关联关系在代码上并无实际上的区别,二者的区别主要体现在语义上,关联关系即代表可有可无,而聚合关系则代表必须拥有(注:被聚合或关联的事务也代表一个单独的事务,其也有独立的意义。)举例说明就像笔记本电脑,其与外接鼠标就是关联关系,外接鼠标只是附件,而想cpu,内存条等是组成一个笔记本电脑所必须的,而他们的关系就是聚合关系。
class computer{
public Cpu cpu1;
}
登录后复制
4、组合关系
组合关系也是特殊的关联关系,其类似于聚合关系,但比聚合关系更加的强,即对象 A 包含对象 B,对象 B 离开对象 A 没有实际意义。举例来讲就是作为一个人,你可以没有钱,但你不能没有脑子(物理),你与钱就是关联关系,钱乃身外之物,而你与大脑则是组合关系,大脑每人就一个,没了它,你便无法存在,而单独一个脑子离开了人也就失去了它应有的作用。
class person{
public Head head;
}
登录后复制
5、继承关系
类与类的继承关系,类与接口的实现关系。继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。
class A extends B{
public A(){
super();
}
}
登录后复制
类与类之间的继承只能是单继承,但可以多层继承。
单继承即表示一个类只可以继承一个父类。
多层继承即是类A继承类B,而类B又继承了类C,所以类A间接继承了类C
类与接口之间的关系
注:Java8新增了默认方法和静态方法;
public interface A{
//抽象方法
public void a1();
//默认方法
default void a2() {
System.out.println("a2");
}
//静态方法
static void a4() {
System.out.println("a4");
}
}
登录后复制

其中,静态方法只供接口直接使用
类可以继承一个类且实现多个接口
注意:
1.如果多个接口中有同名的抽象方法,那么实现类只需要实现一次即可
2.如果多个接口中有同名的默认方法,那么实现类必须重写一次,并且要去掉default关键字
接口可以继承多个接口
注意:
1.如果多个父接口中有同名的抽象方法,那么子接口只需要实现一次即可
2.如果多个父接口中有同名的默认方法,那么子接口必须重写默认方法,必须要加default关键字
依赖注入是Spring的思想,在使用Spring进行开发时,可以将对象交给spring进行管理,在初始化时spring创建一批对象,当你需要用的时候只要从spring的容器中获取对象,而不用自己去new,当然在对象创建的时候可以注入另一个对象。比如A,B两个对象都由spring管理,A中持有对B的引用,那么spring在生成A对象的时候就已经吧B对象的一个实例给到A了,当你在A中用到B的时候直接使用就可以了。
这个你就要看源代码了!int和Integer不是一个类型,在jdk1.5以后有了原生数据类型自动封装和拆装功能这个程序才可以实现!Jdk1.4需要强制类型钻换才可以实现!当你Integer i1=127;Integer j1=127;的时候,127属于byte类型的范围,当在这个范围封装时候他会自动指向同一个Integer,所以相等,而当超过byte的范围他就会重新生成一个Interger对象,就不等了,当然你要具体了解要自己看源代码才可以!在Eclipse里要看源代码,你按着ctrl用鼠标点击你程序中的类名就可以直接跳到源代码处!
依赖关系是指一个类对别一个类的依赖,比如说Employee类中有一个方法叫做TakeMoney(Bank bank)这个方法,在这个方法的参数中用到了Bank这个类,那么这个时候可以说Employee类依赖了Bank这个类,如果Bank这个类发生了变化那么会对Employee这个类造成影响。
class Person {
public String name; //定义一个name属性
public String location; //定义一个location属性
Person(String name){ //定义一个构造方法,用于初始化name属性
this.name = name;
location = "beijing"; //初始化location属性
}
Person(String name,String location) { //重载一个构造方法,用于初始化name属性和location属性
this.name = name;
this.location = location;
}
public String info() { //定义一个方法,返回实例的属性信息
return "name:"+ name +"location:"+location;
}
}
class Teacher extends Person { //定义一个Teacher类,从Person继承
private String capital;
Teacher (String name,String capital) { //定义一个构造方法,用于初始化name和capital属性
this(name,"beijing",capital); //调用本类中定义的构造方法
}
Teacher (String n,String l,String capital){ //定义一个构造方法,用于初始Teacher类中的capital,name和location属性
super (n,l); //调用父类中的构造方法初始化name,location属性
this.capital = capital; //初始化Teacher类中的capital属性
}
public String info() { //重写父类中的info()方法,并且附加capital属性的信息
return super.info() + "capital" + capital; //返回Teacher的各个属性信息
}
}
class Student extends Person { // 定义一个Student类,从Person继承
private String school; //定义chool字段
Student(String name,String school) { //定义一个构造方法,用于初始化name和school属性
this(name,"beijing",school); //调用本类中定义的构造方法
}
Student(String n,String l,String school) { //定义一个构造方法,用于初始Student类中的school,name和location属性
super(n,l); //调用父类中的构造方法初始化name,location属性
this.school = school; //初始化Student类中的school字段
}
public String info() { /重写父类中的info()方法
return super.info() + "school:" + school; //返回Student类中各个字段或属性信息
}
}
public class Test { //定义Test主类,用于测试定义各个类
public static void main (String[] args) {
Person p1 = new Person("A"); //实例化Person类,调用构造器初始化name属性
Person p2 = new Person("B","shanghai"); //实例化Person类,调用构造器初始化name,location属性
Student s1 = new Student("C","s1"); //实例化Student类,调用构造器初始化name,school属性
Student s2 = new Student("C","shanghai","s2"); //实例化Student类,调用构造器初始化name,location,school属性
Teacher t1 = new Teacher("D","perfessor"); //实例化Teacher类,调用构造器初始化name,capital属性
System.out.println(p1.info()); //输出实例p1的属性信息
System.out.println(p2.info()); //输出实例p2的属性信息
System.out.println(s1.info()); //输出实例s1的属性信息
System.out.println(s2.info()); //输出实例s2的属性信息
System.out.println(t1.info()); //输出实例t1的属性信息
}
}
1)尽量指定类、方法的final修饰符。带有final修饰符的类是不可派生的,Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大,此举能够使性能平均提高50%。
2)尽量重用对象。由于Java虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理,因此生成过多的对象将会给程序的性能带来很大的影响。
3)尽可能使用局部变量。调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中速度较快,其他变量,如静态变量、实例变量等,都在堆中创建速度较慢。
4)慎用异常。异常对性能不利,只要有异常被抛出,Java虚拟机就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。异常只能用于错误处理,不应该用来控制程序流程。
5)乘法和除法使用移位操作。用移位操作可以极大地提高性能,因为在计算机底层,对位的操作是最方便、最快的,但是移位操作虽然快,可能会使代码不太好理解,因此最好加上相应的注释。
6)尽量使用HashMap、ArrayList、StringBuilder,除非线程安全需要,否则不推荐使用 Hashtable、Vector、StringBuffer,后三者由于使用同步机制而导致了性能开销。
尽量在合适的场合使用单例。使用单例可以减轻加载的负担、缩短加载的时间、提高加载的效率,但并不是所有地方都适用于单例。