java基础之分辨final,static, abstract

final:

用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

(内部类要访问局部变量,局部变量必须定义成final类型)

static:

static是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会 一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就会一直存在。这样做有什么意义呢? 和
在Java程序里面,所有的东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用他的成员,那么普通情况下必须先实例化对象后,通过对象的引用才能够访问这些成员,但是有种情况例外,就是该成员是用static声明的(在这里所讲排除了类的访问控制),

类属性中被static所引用的变量,会被作为GC的root根节点。作为根节点就意味着,这一类变量是基本上不会被回收的。因此,static很容易引入内存泄漏的风险。

1.静态方法只能访问静态成员,可以直接用类名调用

(非静态方法既可以访问静态,又可以访问非静态。只能被对象调用,必须用类new出对象才能调用,如果这时候static方法里调用非static的方法就会出现空指针异常,当然这种错误编译时就不会通过)

 

2.静态变量可以被对象调用,还可以被类名调用

 

是否可以从一个static方法内部发出对非static方法的调用?

不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用。

 

abstract class和interface有什么区别?

含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。

接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。

下面比较一下两者的语法区别:

1.抽象类可以有构造方法,接口中不能有构造方法。

2.抽象类中可以有普通成员变量,接口中没有普通成员变量

3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然

eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。

5. 抽象类中可以包含静态方法,接口中不能包含静态方法

6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。

7. 一个类可以实现多个接口,但只能继承一个抽象类。

接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用

转载于:https://www.cnblogs.com/corolliberty/p/5980583.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我了解了你的问题,下面是代码示例: 首先是 Container 接口的定义: public interface Container { public static final double pi = 3.14; public abstract double area(); public abstract double perimeter(); public static double sumofArea(Container c[]) { double sum = 0; for(Container container : c) { sum += container.area(); } return sum; } public static double sumofPerimeter(Container c[]) { double sum = 0; for(Container container : c) { sum += container.perimeter(); } return sum; } } 然后是 Rectangle 类的实现: public class Rectangle implements Container { private double length; private double width; public Rectangle(double length, double width) { this.length = length; this.width = width; } @Override public double area() { return length * width; } @Override public double perimeter() { return 2 * (length + width); } } 最后是 Circle 类的实现: public class Circle implements Container { private double radius; public Circle(double radius) { this.radius = radius; } @Override public double area() { return pi * radius * radius; } @Override public double perimeter() { return 2 * pi * radius; } } 主函数部分: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); Container[] containers = new Container[n]; for(int i = 0; i < n; i++) { String type = sc.next(); if(type.equals("Rectangle")) { double length = sc.nextDouble(); double width = sc.nextDouble(); containers[i] = new Rectangle(length, width); } else if(type.equals("Circle")) { double radius = sc.nextDouble(); containers[i] = new Circle(radius); } } System.out.println("周长之和:" + String.format("%.2f", Container.sumofPerimeter(containers))); System.out.println("面积之和:" + String.format("%.2f", Container.sumofArea(containers))); } } 注释: 主函数通过 Scanner 类从控制台输入对象个数和每个对象的类型和属性,并使用 switch 语句实例化不同的对象,最后调用接口的静态方法输出面积和周长之和。在输出时,使用 String.format("%.2f", num) 格式化输出结果,保留两位小数。 希望这份代码能够解决你的问题,注意不要泄露你的要求哦。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值