Java之面向对象
在Java中,类可以看做是一种自定义的数据类型,所有的类都是引用类型。
1、static关键字
static是一个比较特殊的修饰符。static修饰的变量、方法表示它属于类本身,而不是类的某个实例。static修饰的变量、方法称为类变量、类方法(静态变量、静态方法)。
static方法(包括main方法)不能直接访问非static方法。因为static修饰方法属于类本身,而非static修饰的方法属于实例。所以要访问非static方法,必须要先实例化对象。
Person {
public void say() {
System.out.printy("say something");
}
public static void main(String[] args){
// 直接调用say方法出现错误,当前main方法属于成员方法,而say方法属于实例方法
say();
// 实例化对象,通过对象来调用say方法
Person p = new Person();
p.say();
// 或者也可以将say方法声明为static类型,这样可以直接调用
say();
}
}
2、构造器
构造器没有返回值,但是不用void进行修饰,否则会被编译器识别为普通方法(其实构造器是有返回值的,当使用new关键字来调用构造器时,可以把这个类的实例当做构造器的返回值)
// 定义Person的变量p
Person p;
// 使用new关键字调用构造器,返回Person实例
p = new Person();
在上面的代码中,产生了一个变量p,一个Person对象。在内存中,引用变量p存储在栈内存,指向存储在堆内存中的Person实例变量。
3、对象的this引用
this关键字总是指向调用该方法的对象。
4、方法及其传参机制
Java方法中参数的传递方式只有值传递一种,即将实际参数的副本传入方法内,而参数本身不会受到任何影响。
5、封装
其中,private只对自己可见(变量只能被当前类的方法访问,子类也不行);default对一个包内可见,不论是子类还是实例;protected允许任何包中的子类访问,通常是希望子类重写父类方法;public无限制。
6、多态
先来理解下Java编译、运行机制。在Java编译阶段,源程序被JVM虚拟机中的编译器编辑为.class文件。编译后的字节码文件格式主要分为两大类:常量池和字节码。其中,常量池记录的是代码出现过的常量、类名及成员变量等及符号的引用(类引用、方法引用、成员变量引用)。方法字节码中存放了各个方法的字节码。
运行阶段,Java的运行阶段主要分为:类的加载、类的执行。注意,JVM在第一次运行主动需要类的时候才会去加载。
回到多态上来。
father ft = new son()
其中,在编译阶段,ft的数据类型被指定为father,而在运行阶段,ft引用指向了son。
7、抽象类
先来了解下抽象方法。抽象方法只有声明,没有具体的实现(也就是没有方法体,{}):
// 抽象方法,没有方法体
abstract void fun();
// 普通方法,有方法体
void fun(){}
《Java编程思想》中将抽象类定义为“含有抽象方法的类”。抽象类和普通类主要有三点区别:
1、抽象方法必须声明为public或protected,缺省情况下默认为protected(private情况下子类无法继承);
2、抽象类不能用来创建对象;
3、子类必须实现父类的抽象方法。如果没有,则子类也必须定义为抽象类。
8、接口
接口中的变量被隐式指定为public static final,方法被指定为public abstract
9、内部类
主要分为内部类、成员内部类、匿名内部类。内部类提供了更好的封装,解决了Java多继承的问题。
下一篇: Java之面向对象