JAVA_DAY06知识重点整理(面向对象下)

1.当一个变量满足:使用final修饰符,定义变量时就为其赋值,初始值在编译期就确定下来,时,他就可以被看作为一个常量例如final int a = 5,在系统中,啊其实是不存在的,他就是5这个final变量也可以被成为宏变量

2.当final的变量被赋值的表达式只是运算符运算或者字符串拼接,那么它也可以被当作宏变量,因为这在系统编译期是可以确定下来的,例如final int i = 3+7;,但是被复制的表达式如果调用了方法,就不可以被看作宏变量了,因为,调用方法是运行期才可以确定下来该值例如:final String s = "aa"+String.valueOf(99.0);

3.java会用常量池来储存使用过的字符串,例如运行String s = "哈哈",之后"哈哈"就会被保存在常量池,在执行b="哈哈"时,其实就是执行b=a,他们指向的同一个对象

下面演示一段程序来加深对宏变量的理解

public class StringJoin{
    public static void main(String args[]){
        String s1 = "encoreShow";
        String s2 = "encore"+"Show";
        System.out.println(s1 == s2); //输出true
        String str1 = "encore";
        String str2 = "Show";
        String str3 = str1 + str2;
        System.out.println(s1 == str3);//输出false
    }
}

第一段代码输出true是因为s2在编译期就可以确定下来,第二段输出是因为str1和str2只是普通变量,这在这在编译期时是确定不下来的,所以系统无法使用宏替换,要让他们相等很简单,只要把str1和str2变成宏变量就可以了

4.final变量可以先声明,再赋值,但如果想有宏变量的效果,那么只能在声明时赋值

5.如果父类有一个privatre方法,子类也使用了private,并且方法名,参数都保持一直,这个方法也不是重写,只是写了一个新的方法

6.使用final修饰的方法只是不能重写,并不是不能重载

 7.定义一个不可变类只需要用privat和final修饰成员变量,并且在构造器中为其赋值即可

8.当不可变类中的成员变量引用了可变类,那么一定要把这个变量隐藏起来,否则会破坏设计不可变类的初衷(因为final修饰的引用类型只是引用不可变,引用的对象还是可变的)

9.多次的使用相同的不可变类应当考虑把这个类缓存起来,这样会不用频繁创建实例,减少系统开销 

10.java.lang.Integer类就提供了良好的缓存技术,并且也没有对构造器私有化,他通过valueOf方法可以缓存-128~127之间的数,就是Integer.valueOf(6) == Integer.valueOf(6),Integer.valueOF(6) != new Integer(6),Integer.valueOf(128) != Integer.valueOf(128)         以上均输出true

11.有抽象方法的类必须是抽象类,抽象方法不能有方法体,抽象类可以没有抽象方法,抽象类只能被继承不能被实例化,抽象类不包括抽象方法也不能被实例,抽象类的构造器只用于被子类调用,含有抽象方法的类或者继承抽象类但没有全部全部抽血=重写抽象方法的类只能被定义成抽象类

12.abstract不可以与final,private,static同时出现(但abstract,可以和static同时修饰内部类)

13.一个接口可以继承多个父接口,但他只能继承接口,不能继承类,在接口中可以定义常量,抽象方法,内部类,接口,枚举,私有方法,默认方法,类方法(这是java9之后的)

14.在接口中定义成员变量,即使不写修饰符,系统也会加上public static final,因为接口中不能有构造器,所以只能在声明变量时为其赋值

15.接口中的方法要不就省略修饰符(普通方法省略了,系统会加上public abstract),否则只能使用public来修饰,要使用默认方法必须写defaule,类方法要用static修饰

16.接口有以下三种用途,1.被其他类实现,2声明变量,也可以做强转,3.访问常量

17.接口中的普通方法不能有方法体,但是默认方法,类方法,私有方法必须有方法体

 18.对于接口与实现类的区别,接口体现的是一种规范,对于接口实现者而言,接口规定了实现类必须提供哪些服务,对于接口的调用者而言,接口规定了调用者可以调用哪些服务,当在多个程序之间使用接口时,接口就是这些程序的通信规范。。。。。抽象类则不一样,抽象类是被当作模板的,他只是实现一个类的中间过程,这个中间产品已经实现了部分功能,但依旧不能当作最终的商品

19.内部类成员可以直接访问外部类的私有数据,因为内部类被当做是外部类的成员,但是外部类不可以访问内部类的实现细节例如内部类的成员变量(如果想访问必须实例化内部类),内部类比外部类多三个修饰符private,protected,static

20.内部类分为成员内部类和局部内部类,成员内部类又分为静态内部类和非静态内部类

21.使用内部类的变量,系统会在当前局部查找该变量,没有找到就去成员变量找,再没找到就是外部类去找,都没找到就会出现编译报错,区分内部类外部类的同名变量,可以使用this.(内部类的成员变量)以及外部类类名.this.(外部类成员变量)的方式作为区分

22.静态内部类又称为类内部类,可以包括静态成员,也可以包括实例成员,静态内部类不能访问外部类的实例变量,就算是静态内部类的实例方法也不能访问外部类的实例成员

23.接口中也可以定义内部类,但只能定义静态内部类并且是public修饰的 

24.在外部类之外创建非静态内部类的语法格式 Out.In in = new Out().new In()      (因为非静态内部类是寄生在外部类之中的)

25.在外部类之外创建静态内部类的语法格式 Out.In in = new Out.In()   (因为静态内部类与外部类是相关的)

26.内部类的子类不一定要是内部类,但是内部类的子类必须提供一个构造器用于接收他父类的的外部类的实例

class Out{
    class In{

    }
}

class SubClass extents Out.In{
    public SubClass(Out out){
        out.super();
    }
}

27.匿名内部类必须继承一个父类,或者实现一个接口,而且只能实现一个接口,匿名内部类用于只需要使用一次(通常用于命令模式),是代码变得简洁,语法就是new 父类|接口(实参)

28.java8之后推出了lambda表达式,它用于实例只有一个抽象方法的接口(这种接口被称为函数式接口),lambda的语法格式为(实参)->{方法体}   因为lambda只能作用于函数式接口,所以连方法名都可以省略,这大大的简化了匿名内部类的代码

29.lambda表达式不止可以作为接口被传到实参,它还可以对函数式接口直接赋值,只能对函数式接口 

30.枚举类隐式的继承了Enum类,所以他不能显式的继承其他父类,枚举类默认使用final来修饰,所以不能派生子类,枚举类的构造器只可以用private来修饰,枚举类所有实例必须在第一行显式的列出,并且系统会自动用public static final来修饰

31.在一个类的实例数量被确定时(例如季节类只有四个对象),可以考虑使用枚举类

32.堆内存中的对象有三种状态

      1.可达状态:有一个或多个变量引用

      2.可恢复状态:当一个对象没有被变量引用,就会变成可恢复状态,系统会调用这个对象的finalize()方法,如果调用之后这个对象被重新引用,则恢复到可达状态,否则变成不可达状态

      3.不可达状态:等着被回收

33.调用System.gc()方法可以通知系统进行垃圾回收,也仅仅是通知,java中不能操作一个内存被回收 

34.java中的引用分为四种:

     1.强引用:最常使用,用一个变量引用

     2.软引用(SoftReference):当系统内存 不足时才回收

     3.弱引用(WeakReference):当系统执行回收机制时回收

     4.虚引用(PhantomReference):跟没有引用差不多,主要用于跟踪对象状态,不能单独使用,只能跟ReferenceQueue一起使用

猜你喜欢

转载自blog.csdn.net/weixin_42668719/article/details/82180951
今日推荐