1.权限修饰符
三种权限:
private protected public
本类 可见 可见 可见
同包的其他类 不可见 可见 可见
其他包的类 不可见 不可见 可见
子类(不管是否同包) 不可见 可见 可见
如果没有显示说明是什么权限,则会使用包存取范围,即只有同一个包中的类可以访问这个类的成员变量和成员方法(不同包的子类也无法访问),包存取范围是Java的默认权限。
static静态方法同样遵循着权限修饰符的约束
2.类和对象
Java离不开类和对象,只有通过类和对象才能调用方法和属性。
1.this关键字
this关键字用语表示本类当前对象,当前对象不是new创建出来的实体对象, 而是当前正在编辑的类。this关键字本身就是引用一个对象。
Java中可以通过“.”(英文中的句号)来调用属性和方法
如果局部变量和成员变量同名时,必须显式地使用this来引用成员变量;如果没有重名局部变量则可以直接引用成员变量,而不必显式地使用this.来引用
2.构造方法
(1)没有返回值
(2)必须和类同名
(3)Java隐式地提供无参构造方法
3.静态方法
(1)不能使用this关键字
(2)静态方法不可以直接调用非静态方法,需要先实例化非静态方法所属类的对象,然后通过对象调用方法,典型例子就是main函数
(3)局部变量不能使用static关键字
(4)主方法必须使用static关键字
(5)只有内部类可以使用static关键字,只有static内部类才能有static成员【注:在5当中和继承相对比说明】
4.new关键字
Java中没有指针一说,通过new创建的对象其实都是类的引用。每个对象都是独立的,在内存中占据独立的内存地址,并且每个对象都有自己的声明周期。当对象的声明周期结束后,会被Java的垃圾回收机制自动回收内存。
在Java语言中,尽管一切都可以看作对象,但真正的操作标识符实际上是一个引用,举例说明:
例:
一个People类的引用可以使用以下代码
People tom; // 通常一个引用不一定需要有一个对象关联起来
如果要关联一个对象则要使用new关键字:
People tom = new People;
其中:
类名 引用 对象的实体
People tom = new People();
实际上真正的对象是“new People()”这段代码,为了方便开发者保存、调用对象,才有语法创建一个People类型、名为tom的引用变量。tom实际就是一段内存地址,用来标记"new Peopple"对象在内存中的位置。因为内存地址又长又乱,很难让人记住,所以Java语言利用引用变量帮助开发者标记内存地址。
当对象被设置为null时,将消亡
3.封装、继承和多态
总结:常用封装、继承和多态尽量少用
封装的体现在方方面面,Java最基础的特性就是封装,例如私有类,接口等
继承、多态
继承主要利用特定对象之间的共有属性,关键字extends,格式 子类 extends 父类。
(1)Object父类
Java中所有的类都继承自Object,只是不必显式的写出
而Object的常用方法equals()和toString()也继承给了所有的类。
1.getClass()
返回对象执行时的Class实例,然后使用此实例调用getName()获取类的名称,语法如下:
getClass().getName()
2.toString()
将一个对象返回字符串形式,它会返回一个String对象实例。通常会重写toString()为对象提供一个特定的输出模式。当对象转换为字符串,或与字符串连接时,将自动调用重写的toString()
3.equals()
“==”比较的是两个对象引用的内存地址是否相等,即是否为同一个对象;equals()比较的是两个对象的实际内容
(2)向上转型和向下转型
向上转型:子类对象变为父类对象
向下转型:父类对象变为子类对象
向上转型时安全的,因为由具体的类型转换为一个较为抽象的类型是可以的,且在向上转型的过程中,父类不能调用子类独有的属性和方法;而向下转型是不安全的,因为父类对象可以指向任意的子类,而不确定是否指向转型的子类,需要借助强制类型转换,前提是:这个父类对象要先引用这个子类对象:
Bird bird = new Pigeon();
Pigeon pigeon= (Pigeon) bird;
如过父类对象的不是子类对象的实例,会发生ClassCastExeption异常,用instanceof在强制转换之前检查,完善上面的转换:
Bird bird = new Pigeon();
if( bird instanceof Pigeon )
Pigeon pigeon= (Pigeon) bird;
instanceof的返回值是一个布尔类值。
(3)方法的重载(Overloading)和重写(Overriding)
重载:
1.方法名必须相同
2.参数类型不同,构成重载
3.参数顺序不同,构成重载
4.参数个数不同,构成重载
5.重载的访问可以拥有不同的权限等级
6.既可以重载实例方法,也可以重载静态方法
重写:
1.方法名相同
2.参数列表相同
3.返回值相同
4.访问权限不能小于父类
5.只能重写实例方法,不能重写静态方法
(4)final关键字
变量声明为final:变量不能再被改变
方法声明为final:不能被子类修改
如果一个方法被声明为private,子类将无法方位这个方法,所以将一个方法定义为private被隐式地声明为final,无须再将一个定义为private的方法再定义为final
(5)抽象类和接口
抽象类:
使用abstract将类定义为抽象类。抽象类除了被继承,没有任何意义。
使用abstract定义的方法称为抽象方法。抽象类没有任何方法体,这类没有任何意义,除非它被重写。
如果要定义一个抽象方法,则必须将其类定义为抽象类
接口:
接口是抽象类的延伸,是纯粹的抽象类,因为其中的所有方法都没有方法体。
定义接口方法可以省略public abstract,例:
public interface Paintable {
void draw(); // 可省略public abstract
}
public:仅限于用于接口在与其同名的文件中被定义
特点:
(1)接口中,方法必须被定义为public或abstract形式,其它权限修饰符不被Java编译器认可。即,Java默认接口中的方法为public。
(2)接口中定义的任何字段(变量)都自动是public static final 的。
原因:
static是因为接口要实现在没有任何实例的情况下被访问,final是因为让接口中的变量可以任意被访问而不被改变,public是为了让所有类都可以访问,这都是让接口有更多的复用性而设计的。