7.复用类

来源:互联网 发布:阿里云数据盘如何使用 编辑:程序博客网 时间:2024/04/30 01:22
1.复用类:组合 继承 代理
组合:在类A中存在类B的对象引用。外部类可通过类A中类B的对象引用操作类B的所有方法。
继承:类A继承自类B,拥有类A除Private之外的修饰符修饰的域或方法
代理:类A中存在private修饰的类B对象引用。在类A中把类B可对外公开访问的方法重新写一遍,内部直接使用类B对象引用调用类B的方法。

2.初始化流程
基类静态成员
子类静态成员

基类非静态成员
基类构造函数

子类非静态成员
子类构造函数

3.finally关键字:
必要时应将清理动作置于finally中,预防异常的发生。
private static int getNum(){
  try{return 10;}
  finally {return 20;}
}
//执行结果:  20
private static int getNum(){
  try{
  if(true){throw new Exception("Exception");}
  return 10;
  }
  catch (Exception ex){
  System.out.println(ex.getMessage());
  }
  finally {return 20;}
}
//执行结果: Exception  20

4.@override注解:告知系统此处是重写父类的方法而不是重载父类的方法。

5.组合和继承的抉择:
组合:强调的是has-a(有一个) 的关系,例如汽车有一个车门,则车门类可以作为汽车类中的一个子对象存在,这种情况可以使用组合。
继承:强调的是is-a(是一个)的关系,例如轿车是一个汽车,则汽车所有的方法或属性轿车都有,这种情况可以使用继承。
继承应该谨慎使用,如果确定在某些场景下存在向上转型的必要则使用继承。
6、protected:在当前类、当前类的父类、当前类的同包类、当前类的子类中可以访问。

7.向上转型:将子类对象转为父类对象。
向下转型:将父类对象转为子类对象。
向下转型实现:每个对象会有标识用于标识该类的实际类型,如果该类的实际类型是类A的子类类B,尽管该类引用是类A类型,但是可以向下转型为类B类型,不可以向下转型为类A的其他子类如类C的类型。

8.final关键字:适用于数据、方法、类
final 数据:
static fina l数据:
final 基本类型: 数值一旦在初始化之后便不能更改
final 对象:对象引用初始化后不能更改,不能指向其他对象。对象时可以被更改的。

final类:只能使用,不能继承。 final类中的成员变量可以根据需要设为final,但final类中的所有成员方法都会被隐式地指定为final方法
final方法:子类不能重写。private内部隐藏使用final

编译时常量:是基本类型或String类型,使用final修饰符修饰,定义时进行了赋值。
特点:编译时执行计算,编译器会将该常量的值带入任何使用它的计算式中。
如果编译时不能确定其值,只能在运行时确定,则编译时不会将值带入计算,此时效果等同于普通变量。

代码一:
String a = "hello2";
final String b = "hello";
String d = "hello";
String c = b + 2;//编译时已经计算出b + 2为hell2,将hello2的地址赋值给引用c
String e = d + 2;//将数字2隐式转换为String,执行String的拼接得到一个新的对象引用。
System.out.println((a == c));//true
System.out.println((a == e));//false

代码二:
private static void func2(){
  String a = "hello2";
  final String b = getHello();
  String c = b + 2;
  System.out.println((a == c));
}
public static String getHello() {
  return "hello";
}

9.final 和static
static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变
MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();
System.out.println(myClass1.i);
System.out.println(myClass1.j);
System.out.println(myClass2.i);
System.out.println(myClass2.j);
class MyClass {
  public final double i = Math.random();
  public static double j = Math.random();
}
//执行结果:
0.8363479306680985
0.3220826068059397
0.6715746957553885
0.3220826068059397


10.final 参数:对象类型只是限制对象的引用不能变化,不能指向其他对象,并没有限制当前对象不能变化。
MyClass myClass = new MyClass();
StringBuffer buffer = new StringBuffer("hello");
myClass.changeValue(buffer);
System.out.println(buffer.toString());

class MyClass {
  void changeValue(final StringBuffer buffer) {
  buffer.append("world");
  }
}
//执行结果:
helloworld

10.类的加载
当类第一次被使用的时候会进行类的加载>>加载完成进行类的初始化>>然后生成类的对象等使用需要的操作。
定义为static的东西只会被加载一次,后期不允许进行再次加载。

11.构造器
构造器是静态,默认隐式声明为static
private 方法内部是final的。


0 0
原创粉丝点击