终于还是来到了,这个最陌生的花园
冲鸭
!!!未经允许不得转载(虽然没啥难度,但是码了好久且!自己写的要维权 嘤(✪ω✪))
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中会大量使用。。。现在就了解一下⑧ 回头看得懂就阔
终于终于把基础知识回了一遍……后面的还有一些,这些应该是最最基础的辽,记住它!!!