欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java之面向对象

程序员文章站 2022-03-24 19:58:16
...

  在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多继承的问题。