1.抽象类
类:现实世界不存在的,人类大脑思考总结的结 果。
对象:是现实世界中存在的。
抽象类无法被实例化
:抽象类是类和类之间有共同特征,将这些具有共同特征的类再进一步抽象形成了抽象类,由于类本身是不存在的,所以抽象类无法创建对象。
所以,抽象类是用来被子类继承的。
- 抽象类属于引用类型
- 抽象类无法被实例化,无法创建对象,所以抽象类是用来被子类继承的。
- 抽象类虽然无法被实例化,但是抽象类有构造方法,这个构造方法是供子类使用的(子类的构造方法第一行默认有个super())
- final 和 abstruct 不能联合使用,这两个关键字是对立的
- 抽象类的子类可以是抽象类,也可以是非抽象类
- 抽象方法:没有方法体,以分号结尾;前面修饰符有abstract关键字
- 抽象类可以没有抽象方法,但是抽象方法必须出现在抽象类中。
- 一个非抽象类继承抽象类,必须将抽象类的抽象方法实现(重写/覆盖 );
- 面向抽象编程
//抽象类
abstract class Animal{
//抽象方法
public abstract void move();
}
//普通类继承抽象类
class Bird extends Animal{
//重写抽象方法
public void move(){
System.out.println("Bird_Move");
}
}
public class Test{
public static void main(String[] args){
//能使用多态,向上自动类型转换
Animal animal = new Bird();
//animal 类型是Animal,Animal是抽象的
//父类引用指向子类对象,编译时父类方法,运行时子类方法。
animal.move();//out:Bird_Move
}
}
Java语言凡是没有方法体的方法都是抽象方法?
答: 错误,Object类中就有很多方法都没有方法体,以 " ;" 结尾,但他们都不是抽象方法,例如:public native int hashCode(); 这个方法底层调用了C++写的动态链接库程序。native表示调用JVM本地程序。
2.接口
- 接口属于引用类型,编译以后也是一个.class字节码文件
- 接口无法被实例化,无法创建对象,所以接口是用来被类实现或被接口继承的。
- 完全抽象的,可以说是一种特殊的抽象类
- 当一个非抽象类实现这个接口时,要把接口中的方法全部重写,访问修饰符补全,注意重写方法的规则。
- 接口间支持多继承,一个类支持多实现
弥补了单继承带来的缺陷。 - 接口中所有的元素都是public修饰的
接口中只能有抽象方法和常量
抽象方法:public abstract 修饰的方法
常量:public static final 修饰的变量
- 抽象方法的public abstract 可以忽略,即:接口中定义的方法实际上都是抽象方法。
- 常量的public static final可以忽略,即:接口中定义的变量实际上都是常量。
//接口间的多继承
interface C extends A,B,D,E{
//C自己的
public static final double PI_1 = 3.14;
double PI_2 = 3.15;//省略了 public static final
public abstract void test1();
void test2();//省略了 public abstract
//不用管A,B,D,E
}
//一个普通类的多实现
class X implements A,B,D,E{
//重写A,B,D,E内的所有方法
}
//一个抽象类的多实现
abstract class Y implements A,B,D,E{
//不用管A,B,D,E
}
//接口使用例子
interface Animal{
void move();
}
//普通类实现接口
class AnimalImpl1 implements Animal{
//重写Animal内的方法
public void move(){
System.out.println("AnimalImpl_1");
}
}
//普通类实现接口
class AnimalImpl2 implements Animal{
//重写Animal内的方法
public void move(){
System.out.println("AnimalImpl_2");
}
}
public class Test{
public static void main(String[] args){
//能使用多态,向上自动类型转换
//animal 类型是Animal,Animal是抽象的
//父类引用指向子类对象,编译时父类方法,运行时子类方法。
Animal animal = new AnimalImpl1();
animal.move();//out:AnimalImpl_1
animal = new AnimalImpl2();
animal.move();//out:AnimalImpl_2
}
}
3.抽象类和接口的区别
- 抽象类:半抽象;接口:完全抽象
- 抽象类:有构造方法;接口:没有构造方法
- 抽象类(类):支持单继承,实现多接口;接口:支持多继承
- 抽象类:都有;接口:只出现常量和抽象方法
4.final
修饰的类不能被继承
修饰的方法不能被重写
修饰的基础变量只能赋值一次
修饰的引用不能改变指向(被指向的对象内部可以修改)
实例变量必须手动初始化,不能采用系统默认值
final与static一起使用修饰的变量称为常量
5.重载和重写
6.文本编译器下的Package包机制
目的:为了管理更方便
使用:放在Java源代码的第一行
例如 :
com文件夹下的cy文件夹下的emy文件夹下的HelloWorld.java文件
此时类名不再是HelloWorld,类名:com.cy.emy.HelloWorld
在com文件夹编译和运行:
编译:javac -d . HelloWorld.java
- javac : 负责编译的命令
- -d : 带包编译
- . : 代表编译后生成的东西放在当前目录下(" . "代表当前目录)
- HelloWorld.java :被编译的java文件名
运行:java com.cy.emy.HelloWorld
有包的情况下不能 cd 进入到emy文件夹下去运行 java HelloWorld
会报错:找不到这个类。
如果说类名的时候,带着包名描述,表示完整类名。如果没有带包,表示简类名。
7.import
A类中使用B类
A 和 B在同一包下,不需要import,A 和 B不在同一包下,需要导入。
java.lang.* ;这个包下的类不需要使用import 导入。eg.String.java,System.java,StringBuilder.java…
使用:在package 下 class 上
import 完整类名;eg.import java.util.Scanner;
import 包名. * ; eg.import java.util.* ;
注意:* 只能代表类这一级别,所以,类似 import java. *;,import * ;都是错误的。
8.访问控制权限
public > protected > default > private