Java接口与抽象类的区别+final + static

1.抽象类中可以有一个或多个抽象方法,而接口中的方法必须都是抽象方法。
!
2接口中声明的变量默认都是final的,抽象类中可以包含非final的变量。

接口中的成员函数默认是public的,抽象类的成员函数可以是private,protected,public。
3接口可以实现多继承,抽象类只能继承一个。

public class To extends Abstract_demo implements A1,A2,A3{
........
}

4.抽象类和方法必须使用abstract关键声明为抽象,而接口中的方法默认被修饰为public abstract 类型。
5.接口,定义用:interface ,实现接口:implements
抽象类,定义用:abstract, 继承:extends
二、final关键字的基本用法
java中final可以修饰类、方法和变量
1.修饰类
表示这个类不能被继承。其中的方法都被默认为final方法,访问权限是private。
2.修饰方法
该方法不能被重写,可以重载多个final修饰的方法。因为重写是子类从父类中继承的方法。
3.修饰变量
final成员变量表示常量,只能被赋值一次,必须要初始化。初始化方式:(1)变量声明时初始化(2)这个变量所在类的构造函数中给变量赋初值
4.final 变量和普通变量的区别
final定义的变量,在编译期间就知道它的确切值。final string b = “hello”;
string c = b + 2;
此时,编译的时候,就知道c = hello2;
final String b = getHello();
这个b的值需要运行时才知道。
4.被final修饰的引用变量指向的对象内容可变

public class Test { 
    public static void main(String[] args)  { 
        final MyClass myClass = new MyClass(); 
        System.out.println(++myClass.i); 
  
    } 
} 
  
class MyClass { 
    public int i = 0; 
}

输出结果为1,引用变量被final修饰后,虽然不能指向其他对象,但是它指向的对象的内容可变。

public class TestFinal {
    
    public static void main(String[] args){
        TestFinal testFinal = new TestFinal();
        StringBuffer buffer = new StringBuffer("hello");
        testFinal.changeValue(buffer);
        System.out.println(buffer);
        
    }
    
    public void changeValue(final StringBuffer buffer){
        //final修饰引用类型的参数,不能再让其指向其他对象,但是对其所指向的内容是可以更改的。
        //buffer = new StringBuffer("hi");
        buffer.append("world");
    }
}

输出helloword,用final进行修饰虽不能再让buffer指向其他对象,但对于buffer指向的对象的内容是可以改变的
5.final修饰参数,代表参数不可改变

public void changeValue(final int i){
        //final参数不可改变
        //i++;
        System.out.println(i);
    }

java中采用的是值传递,对于引用变量,传递的是引用的值,也就是说让形参和实参同时指向了同一个对象。

三、static用法
1)static方法
  static方法一般称作静态方法,该方法属于整个类,不依赖于任何对象就可以进行访问,并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
  而对于非静态成员方法,它访问静态成员方法/变量显然是毫无限制的
  在这里插入图片描述
2)static变量

static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

static成员变量的初始化顺序按照定义的顺序进行初始化。

3)static代码块

static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次

为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。下面看个例子:
  在这里插入图片描述
   isBornBoomer是用来这个人是否是1946-1964年出生的,而每次isBornBoomer被调用的时候,都会生成startDate和birthDate两个对象,造成了空间浪费,如果改成这样效率会更好: 在这里插入图片描述
因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。

在C/C++中static是可以作用域局部变量的,但是在Java中切记:static是不允许用来修饰局部变量。

你在方法里面定义的变量是局部变量,就是说他有一定的作用范围和生命周期,就只能在方法里面使用而不能将其扩展到别的地方,这个变量在方法结束后就会被回收器回收,就不再存在了,而你要强制将其加上static就是要把它的作用范围扩展到整个类,这就与你开始定义这个变量时违背了,这是语法上的错误。
建议深刻理解这句话

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值