Java基础
-
继承是多态的前提(抽取共性)
- 访问时,先子类后父类
- 重写:继承时,方法名称一样,参数列表一样,子类的返回值范围不能超过父类的返回值范围
- 子类方法的权限必须大于等于父类方法的权限
public > protected > default > private
class Fu{ public void method(){ System.out.println("fu"); } } class Zi extends Fu{ public void method(){ System.out.println("zi"); } } Fu test = new Zi(); test.method(); //输出zi,new出哪个用哪个
- 父类构造方法 -> 子类构造方法
- 子类构造方法有个默认的
super();
, super 只能有一个且在第一个语句 - super 和 this 两种构造调用不能同时使用
- 子类的
.class
中会有一个[[super_class]]
, 它指向父类 - 子类对象当中包含了一个完整的父类对象结构
- Java是单继承的,但可以多级继承,最顶端的类是Object
- 抽象
abstract
- 抽象方法所在的类必须是抽象类,但一个抽象类不一定含有抽象方法
- 不能直接new抽象类
- 抽象父类的构造方法只能通过子类的
super()
来执行 - 当子类是抽象类时可以不用完全重载父类的抽象方法
- 接口
interface
:公共规范标准-
编译生成的字节码文件仍然是
.class
-
可以包含:常量,抽象方法,默认方法,静态方法,私有方法
- 抽象方法:必须是
public abstract
连用 或者 省略 - 默认方法:
public default
, 其中public
可以省略, 会被实现类继承下并且可以被覆盖重写 - 静态方法:
public static
, 不能通过实现类的对象来调用, 直接通过接口名来调用 - 私有方法:解决默认(静态)方法之间重复代码问题
- 常量:
public static final
(可以省略,但默认是这三个),必须赋值,大写
- 抽象方法:必须是
-
接口不能直接使用,不许得有实现类来实现接口
-
实现类必须覆盖重写接口的所有的抽象方法,否则自己必须是抽象类
-
没有静态代码块和构造方法
-
一个类可以实现多个接口
- 若多个接口里面有重名的抽象方法,实力类只实现一个就行
- 重复的默认方法时,实现类一定要对冲突的默认方法进行重写
- 父类方法和接口默认方法冲突时,优先父类中的方法
-
接口之间可以多继承
- 多个父接口抽象方法重复,没关系
- 多个父接口默认方法重复,字接口重写,而且要带着default
-
- 多态:父类名称指向子类名称 或 接口名称指向实现类名称
- 成员变量访问规则:等号左边是谁,先用谁,找不到向上找(编译看左边,运行看左边)
- 成员方法访问规则:new 出来的谁,先用谁,没有向上找(编译看左边,运行看左边)
- 好处:提高代码扩展性
- 向上转型:
Fu obj = new Zi();
这时无法调用子类特有的方法 - 向下转型:还原,
Zi zi = (Zi) obj;
- 判断父类引用对象本来是什么子类,
instanceof
class Fu{
int num = 10;
}
class Zi extends Fu{
int num = 20;
}
public class Test {
public static void main(String[] args) {
Fu test = new Zi();
System.out.println(test.num); // 10, 等号左边是谁,先用谁,找不到向上找
}
}
method(10); //不报错,自动类型转换
public void method(double num){
System.out.println(num);
}
- final:不可改变
- 修饰类:当前类不能有子类
- 修饰方法:不能被覆盖重写(对于类和方法来说,abstract和final不能同时使用,矛盾)
- 修饰局部变量:不能修改,一次赋值终身不变。对于基本类型,不可变是数值不可变;对于引用类型来说是地址值不可改变,内容可以变。
- 修饰成员变量:不会再给默认值,要么直接赋值,要么通过构造方法赋值
- 成员内部类:内用外随意访问;外用内需要借助内部类对象;class内写class
- 间接使用:在外部类的方法中使用内部类
- 直接方式:
外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
- 访问外部类成员变量:
Outer.this.num
class Fu{
class Zi{
}
}
- 局部内部类:定义在方法内,出方法不能使用
- 如果想访问所在方法的局部变量,那么这个变量必须是有效final
- 定义类时权限修饰符规则:
- 外部类:public / default
- 成员内部类:public / protected / default / private
- 局部内部类:什么都不能写
- 匿名内部类:
接口名称 obj = new 接口名称() {覆盖重写所有抽象方法};