【java】基础知识易错篇(5)——final、抽象类、接口与内部类

终于还是来到了,这个最陌生的花园
冲鸭
!!!未经允许不得转载(虽然没啥难度,但是码了好久且!自己写的要维权 嘤(✪ω✪))

1、final

  • java中的类、变量和方法都可以是final类型的
  • final与static不同,静态成员的值可以改变,但是final只能被赋值一次 (也就是说final类型的值是没有默认初始值为0这个特性的)。既然它俩不同也就没啥关系,可以用static final修饰一个变量,这样就可以定义一个不变的常量

final类型的变量

  • final类型的变量的赋值可以是运行时刻决定的。(这是说final类型的变量的值可以是一个函数值如random函数,这样运行时候才能确定,但是一旦确定之后后面就改不了了)
  • 注意!!!对final类型的对象变量来说,变量本身不可变,但是变量对象的值可以变。啥意思呢?举例来说,
class shape{
	protected int width=0;
}
public class tsts {
	public static void main(String[] srgs) {
		final shape s1=new shape();
		shape s2=new shape();
		System.out.println(s1.width);
		s1.width=8;
		//s1=s2;//这是错误的
		System.out.println(s1.width);
	}
}

在这里的s1不能重新赋值为其他对象如s2。这是不允许的。但是s1对象的成员变量的值可以变(只要不是final类型)。

final类型的方法

  • 父类final方法在被继承的时,不能被子类覆盖(重载)。这种不能有两种意义:
    • 若父类中的final方法不是私有的,则子类中不能用重载的方式写这种方法,是会编译出错的;
    • 若父类中final方法定义为私有(当然其实private的方法就是final的,其实不用显式定义,这里只是把这作为一种可能探讨),则子类中写的同签名的方法不构成重载,而只是子类的一个方法而已。
  • final方法是在编译时候就绑定了的,是一种静态绑定。(private的方法就是final的,也是静态)其他的默认使用动态绑定。

final的类

final的类不能被继承,其中的方法都是final类型。

2、抽象类与接口

  • 抽象类 定义:类前加一个abstract,表示抽象属性;方法前加abstract并且签名后用分号而写{} 如是abstract void Square();
    • 在抽象类中,可以有抽象方法也可以没有;
    • 有抽象方法的类一定得定义为抽象类,否则编译出错
    • 抽象类不能定义实体对象
    • 父类是抽象类,若子类不定义为抽象类,则需要在子类覆盖实现父类中所有的抽象方法,否则必须定义为抽象类
  • 接口:interface
    • 接口都是public abstract类型的,但是在定义的时候用interface替代这两个词就好;
    • 接口中的所有方法都是abstract的,不能有方法体
    • 接口中的所有成员变量都是public static final的,必须在定义的时候初始化
    • 类实现接口的关键字是 implements ,其实就是一种继承关系,那也就跟继承抽象类的规定一样。
    • java中允许一个类实现多个接口,也允许一个接口从多个接口中得到继承。
    • 尽管抽象类和接口不能有实例,但是抽象类和接口照样可以看做是父类,也就是说在参数和返回值类型中可以写接口(抽象类),这个时候这种参数对象指的是实现了这个接口的**类(可能有多个)**的对象,也就是说,实现了这个接口的类们的对象都可以作为这个参数传递进来。对返回值,则必须是一个可以有实例的类的对象。

3、内部类与匿名类

  • 内部类是啥?
    • 内部类也叫成员类,顾名思义,与成员变量、成员方法具有类似的属性。
    • 编译后的类文件是 外部类 $ 内部类.class 文件
  • 内部类有啥用?
    • 内部类最大的特点就是可以访问外部类的所有成员,包括私有成员
  • 举例:
//接口
interface Operator {
	Object current();// Object是java中所有类的根类

	void next();

	boolean end();
}

public class Queue {
	private Object[] arr;// 对象数组
	private int next = 0;

	// 构造函数,根据size大小构造arr数组
	public Queue(int size) {
		arr = new Object[size];
	}
	
	//逐个添加指向对象到arr数组中
	public void add(Object x) {
		if (next < arr.length) {
			arr[next++] = x;
		}
	}

	// 内部类
	private class SOperator implements Operator {
		int i = 0;
		//返回当前对象
		public Object current() {	
			return arr[i];
		}

		//递增对象的序号
		public void next() {
			if (i < arr.length) {
				++i;
			}
		}

		//判断是否结束
		public boolean end() {
			return i == arr.length;
		}
	}

	//返回一个对象,在这实际上返回的是SOperator对象
	public Operator getOperater() {
		return new SOperator();
	}

	public static void main(String[] args) {
		Queue q = new Queue(10);		//定义一个有10个对象的数组
		for (int i = 0; i < 10; i++)	//循环给每个数组添加对象,对象是String类型,因为这里调用的函数最后将integer包裹类转换成String
			q.add(Integer.toString(i)); //对象q的成员变量arr循环后获得的值是每个指向0-9的string对象
		Operator o1 = q.getOperater();	//创建一个Operator类型的对象
		while (!o1.end()) {				//当数组没有结束的时候,依次打印arr数组
			System.out.println((String) o1.current());
			o1.next();
		}
	}
  • 匿名类:没有名字的内部类,一般使用的时候跟上面的内部类差不多,是对一个接口进行实现,不同于内部类,这个累没有名字,但是有成员变量和方法。
    • 举例
interface Contents {
	int value();

}

class pack {
	public Contents cont() {
		// 匿名类
		return new Contents() {
			private int i = 11; // 匿名类的成员变量

			public int value() {// 匿名类的方法成员,实现了Contents中的抽象方法
				return i;
			}
		}; // 分号不可少
	}
}

public class Sail {
	public static void main(String[] args) {
		pack p = new pack();
		Contents c = p.cont();// 实际上这里返回的是对接口实现后的内部类的对象
		System.out.print(c.value());
	}
}

内部类据说在GUI中会大量使用。。。现在就了解一下⑧ 回头看得懂就阔

终于终于把基础知识回了一遍……后面的还有一些,这些应该是最最基础的辽,记住它!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值