java中各种易错方法类型的总结static,final,abstract,抽象类和抽象方法......

static修饰的方法: 


1、父类中的静态方法可以被继承、但不能被子类重写。

2、如果在子类中写一个和父类中一样的静态方法,那么该静态方法由该子类特有,两者不构成重写关系。

3、静态方法可以被重载,并且前面有关键字static

final修饰: 


1、修饰类表示不允许继承

2、修饰方法表示不允许被子类重写,但是可以被子类继承,不能修饰构造方法。

3、修饰变量表示不允许被修改 

abstract修饰的方法:

1,abstract修饰类
会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型,也就是编译时类型,抽象类就像当于一个类的半成品,需要子类继承并覆盖其中的抽象方法。

2,abstract修饰方法
会使这个方法变成抽象方法,也就是只有声明(定义)而没有实现,实现部分以””代替。需要子类继承实现(覆盖)。

注意:有抽象方法的类一定是抽象类。但是抽象类中不一定都是抽象方法,也可以全是具体方法。

abstract修饰符在修饰类时必须放在类名前。 
abstract修饰方法就是要求其子类覆盖(实现)这个方法。调用时可以以多态方式调用子类覆盖(实现)后的方法,也就是说抽象方法必须在其子类中实现,除非子类本身也是抽象类。 
注意:父类是抽象类,其中有抽象方法,那么子类继承父类,并把父类中的所有抽象方法都实现(覆盖)了,子类才有创建对象的实例的能力,否则子类也必须是抽象类。抽象类中可以有构造方法,是子类在构造子类对象时需要调用的父类(抽象类)的构造方法。

3.下面对与abstract不能共存的三个关键字总结一下: 
   
  private: 
  因为private修饰的方法无法被继承,故无法与abstract共存,如要执意共存(private abstract void fun();),编译器会报这个The abstract method fun in type Test1 can only set a visibility modifier, one of public or protected,即只能用public,protected修饰(其实不写也行,默认包内访问权限)。 
   
  final 
  用final修饰的类代表此类不可被继承,与abstract修饰的类相互矛盾,所以不能共存,而用final修饰的方法代表这个方法不能被重写,所以也无法与abstract共存。 
   
  static 
  静态,用静态修饰的方法代表是属于类所有的,这个方法不能被重写(提一句,这个方法可以在子类内被重定义),所以它也无法与abstract共存。

 

 

构造方法:

概述:构造方法存在于类中,给对象数据(属性)初始化;

特点:方法名与类名一样;无返回值无void;

默认构造方法:我们不创建一个构造方法时,系统默认提供一个无参构造;当我们创建一个构造方法时,系统不再提供无参构造,所以在实际项目中,全部手动给出无参构造

其次什么是重载?什么是重写? 

重载:存在于在一个类中,方法名相同,方法参数的类型或个数不同

重写:存在于子父类中,方法名、方法参数、返回值全部相同

所以:构造方法可以重载,不能重写

在一个类中,可以有多个构造方法(方法参数不同) ,即重载,来实现对象属性不同的初始化;

但是子类中不能定义一个方法无void无返回值的方法,编译错误,即子类无法继承构造方法,但是子类的构造器中可以调用父类的构造方法(默认自动调用无参构造)
 

final和static的详细介绍:

1.final变量:

      当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中。这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。

     当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。

     另外方法中的内部类在用到方法中的参变量时,此参变也必须声明为final才可使用

2.final方法

     如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。 
使用final方法的原因有二: 
    第一、把方法锁定,防止任何继承类修改它的意义和实现。 
    第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。

3.final类

     final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。

二、static

      被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。 
      static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用 

     用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块

1.static变量

      按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是: 
    对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。

2.static方法

      静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。

3.static代码块

      static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。

4、static和final一块用表示什么 
static final用来修饰成员变量和成员方法,可简单理解为“全局常量! 
对于变量,表示一旦给值就不可修改,并且通过类名可以访问。 
对于方法,表示不可覆盖,并且可以通过类名直接访问。

这是补充:java里实现一个接口的类必须要实现接口里的所有方法吗?

答案是肯定的!

但是:如果是抽象类要实现接口,可以实现部分或者一个都不实现就行,要是具体类就必须实现所有的方法

实现接口或继承抽象类的子类必须实现接口的所有方法抽象类的所有抽象方法


接口中的所有方法均为抽象方法,抽象类中包含非抽象方法抽象方法。如果一个类实现了接口,那么该子类必须实现父接口的

所有方法。如果一个类继承了抽象类,那么该子类必须实现抽象类所有抽象方法

 

接口和抽象类的相同点:

 

1) 都是上层的抽象层。
2) 都不能被实例化
3) 都能包含抽象的方法,这些抽象的方法用于描述类具备的功能,但是不比提供具体的实现。

接口和抽象类的不同点:


1) 在抽象类中可以写非抽象的方法,从而避免在子类中重复书写他们,这样可以提高代码的复用性,这是抽象类的优势;接口中只能有抽象的方法。
2) 一个类只能继承一个直接父类,这个父类可以是具体的类也可是抽象类;但是一个类可以实现多个接口。

 

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值