18.面向对象基础
前言
写到这里的时候,笔者的《Java从入门到精通》恰好到了,接下来的内容将会以这本书为主要资源进行学习。
类
成员变量
在 Java 中对象的属性称为成员变量,范围是整个类。
java
public class Book {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这个代码中申明了一个成员变量name
,关于这里private
等权限修饰符和变量作用域的内容放在后面。
权限修饰符
在Java 中的权限修饰符有private
、public
、protected
。
private
如果一个成员变量被修饰为private
,该成员变量只能在本类中被访问,在子类中不可见,并且在其他类中也是不可见的。设置为private
之后,这个类将隐藏它内部的所有数据,防止用户直接进行访问。
public
如果设置为public
,则表示公开该成员变量,所有地方皆可访问。
protected
设置为protected
,只有本包内的该类的子类和其他类可以访问该类的成员变量和成员方法。
总结
三种方法都有其对应的使用场景。public
和protected
修饰的类可以被子类访问,但是子类和父类不在同一个包中就需要通过public
进行访问。如果父类不允许继承的子类访问成员变量,就需要使用private
来进行限制。
再进行概括一下就是,所有修饰符对于本类皆可见。区别在于同包下的其他类或者其他包。
private | protected | public | |
本类 | 可见 | 可见 | 可见 |
同包其他类或子类 | 不可见 | 可见 | 可见 |
其他包的类或子类 | 不可见 | 不可见 | 可见 |
也很好总结,private 就只能在本类中访问,protected 不能再其他类中进行访问,public较为博爱皆可访问。
当申明类时不适用修饰符,默认为包存取范围,只有这个包内可以访问成员变量或成员方法。
this 关键字
我们知道,类就是蓝图,可以批量生产出不同编号的类。this关键字所指的就是当前这个编号的对象,而不是其他对象。
可以使用this方法返回类本身,原因是该方法就是类自身的引用。
静态变量和静态方法
由static
修饰的变量或方法称为静态变量和静态方法。
有时在多个类中会需要在同一个内存共享一个数据,比如圆类中,PI 在所有类中的值都是一样的,那就没有必要在每一个圆类中都分配一个空间来存放PI ,直接在同一个内存中进行存放即可。为了解决这个问题,可以将PI设置为静态变量。
被声明为static的变量和方法叫做静态成员。静态成员归属于类所有,而不是任何一个对象。
java
import java.util.*;
public class Main {
public static String name;
public static void main(String[] args) {
System.out.println(Main.name);
System.out.println(getName());
setName("Jack");
printName();
}
public static String getName() {
return name;
}
public static void setName(String name) {
Main.name = name;
}
public static void printName() {
System.out.print(name);
}
}
上述创建了一个static
变量,为静态的变量进行了一些基本的操作。
类的构造方法
java
import java.util.*;
public class Main {
public static String name;
public static void main(String[] args) {
System.out.println(Main.name);
System.out.println(getName());
setName("Jack");
printName();
}
public static String getName() {
return name;
}
public static void setName(String name) {
Main.name = name;
}
public static void printName() {
System.out.print(name);
}
}
输出结果:
HarryPotter
又多了一本书.
HelloBook!
又多了一本书.
现在有2本书!
上述代码利用了类的构造,在创建类的时候为其指定一个名字。并应用了类的静态变量,所有书维护一个统一的数量。静态方法可以打印这个类的变量。
java
public class Example {
static {
...
}
}
可以用static
定义一个静态区域,当类文件被执行时,会首先执行static
块中的程序,并且只会执行一次。
需要注意的是,在static
静态代码块内部,避免使用动态的方法,也就是非静态方法,否则会报错。
java
public class Book {
public static int count;
public String name;
static {
System.out.println("static 静态代码块内的代码会优先执行!");
System.out.println(count);
// System.out.println(name);
}
public static void main(String args[]) {
System.out.println("主方法后调用!");
}
}
name
是一个非静态的变量,会随着生成的对象而变化,不是类进行统一维护的,如果进行调用会导致报错。但是 count
是一个静态的变量,可以进行访问。
类的主方法
类的主方法是类的入口点,并且args[]
形参在之前也提到过,这里就不进行过多的赘述。