Java基础总结6--面向对象2

Java接口

系统自动为接口里定义的成员变量增加 public static final 修饰符

int MAX_SIZE = 50;== public static final int MAX_SIZE = 50;

接口里定义的成员变量只能是常量

接口里定义的普通方法只能是public的抽象方法

比如 void out();

接口里定义的默认方法需要使用default修饰

default void print(String msgs){

          for(String msg :msgs){

              system.out.println(msg);

            }

}

接口里定义的类方法需要使用static修饰

static String staticTest(){

    return “接口里的类方法”;

}

一个类可以继承一个父类,并同时实现多个接口,implements部分必须放在extends部分之后。

一个接口可以继承多个接口


实现接口方法时,必须使用public 访问控制符,因为接口里的方法都是public的,而子类(相当于实现类)重写父类方法时访问权限只能更大或者相等,所以实现接口里的方法时只能使用public 访问权限。


接口和抽象类区别:

接口里只能包含抽象方法和默认方法,不能为普通方法提供方法实现;抽象类则完全可以包含普通方法。

接口里不能定义静态方法,抽象类则可以定义静态方法

接口里只能定义静态变量,不能定义普通成员变量,而抽象类既可以定义静态变量,也可以定义普通成员变量

接口里不包含构造器;抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成抽象类的初始化操作。

接口里不包含初始化块,而抽象类则包含初始化块。

一个类最多只能有一个父类,包括抽象类,但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承的不足。


Java 8 新增的Lambda表达式

Lambda 表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例。


使用匿名内部类

public class CommandTest{

     public static void main(String args){

             ProcessArray pa = new ProcessArray();

             int【】target = {3,-4,6,4};

            //处理数组,具体处理行为取决于匿名内部类

           pa.process( target , new Command(){

                  public  void process(int [ ]  target ){

                        int  sum = 0;

                        for(   int tmp : target){

                              sum += tmp;

                         }

                       system.out.println("数组元素的总和是:" + sum);

                   }

            });

     }

}


public class CommandTest2{

     public static void main(String args){

             ProcessArray pa = new ProcessArray();

             int【】target = {3,-4,6,4};

            //处理数组,具体处理行为取决于匿名内部类

           pa.process( target , (int [ ]  target ) -> {

                        int  sum = 0;

                        for(   int tmp : target){

                              sum += tmp;

                         }

                       system.out.println("数组元素的总和是:" + sum);

          });

     }

}


从上面的表达式可以看出Lambda 表达式的主要作用就是代替匿名内部类的烦琐语法。

它由三部分组成

1、行参列表  行参列表允许省略形参类型,如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。

2、箭头(->)。必须通过英文中画线号 和大于号组成。

3、代码块。如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号。


垃圾回收具有如下特征

垃圾回收机制 只负责回收内存中的对象,不会回收任何物理资源(例如数据库连接,网络IO等资源)

程序无法精确的控制垃圾回收的运行,垃圾回收会在合适的时候进行,当对象永久性的失去引用后,系统就会在合适的时候回收它所占用的内存。

在垃圾回收机制回收任何对象之前,总会先调用它的finalize()方法,该方法可能使该对象重新复活,从而导致垃圾回收机制取消回收。


程序无法精准控制Java垃圾回收的时机,但依然可以进行强制系统进行垃圾回收---这种强制只是通知系统进行垃圾回收,但系统是否进行回收依然不确定。大部分时候,程序强制系统垃圾回收后总会有一些效果,强制系统垃圾回收有如下两种方式。

1、调用System类的gc()静态方法:System.gc();

2、调用Runtime 对象的gc()实例方法:Runtime.getRuntime().gc()。


finalize() 方法具有如下4个特点。

1、永远不要主动调用某个对象的finalize() 方法,该方法应交给垃圾回收机制调用。

2、finalize() 方法何时被调用,是否调用具有不确定性,不要把finalize()方法当成一定会被执行的方法。

3、当JVM执行可恢复对象的finalize()方法时,可能使该对象或者系统中的其他对象重新变成可达状态。

4、当JVM执行finalize()方法出现异常时,垃圾回收机制不会报告异常,程序继续执行。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值