类和对象
Java的类模板
Java的类模板如下所示:
public class<类名>{
//定义属性部分
属性1的类型 属性1;
属性2的类型 属性2;
......
属性n的类型 属性n;
//定义方法部分
方法1;
方法2;
......
方法n;
}
在Java中创建一个类需要使用一个class
(创建类的关键字),一个类名,一个大括号。 public
:公有 private
:私有
类的命名规范
- 不能使用Java中的关键字
- 不能包含任何嵌入的空格或者点好”.”,以及除了下划线”_”,字符”$”外的特殊字符
- 不能以数字开头
static修饰符详解
static
可以用来修饰属性、方法和代码块。 static
修饰的变量属于这个类所有,即由这个类创建的所有对象共用同一个static变量。
通常把static
修饰的属性和方法称为类属型(类变量)
和类方法
。
不使用static
修饰的属性和方法属于单个对象,通常称为实例属性(实例变量)
和实例用法
。
下面通过一个例子演示static
的用法以及使用static
修饰属性和代码块时,是如何分配内存空间的:
package demo;
public class Demo {
static int i;
static int m = 30;
int j;
int k = 25;
static {
i = 10;
System.out.println("i的初始化值为:" + i);
}
public Demo() {
j = 20;
System.out.println("j的初始值为:" + j);
}
public static void getNum() {
System.out.println("得到的i的值为:" + i);
}
public static void main(String[] args) {
Demo d = new Demo();
System.out.println("i的值为:" + d.i);
d.getNum();
System.out.println("m的值为:" + d.m);
System.out.println("k的值为:" + d.k);
}
}
演示结果:
结论:
- 在加载过程中,完成静态变量的内存分配,再执行静态块,两者是在创建对象之前执行的。
- 类属型和类方法可以通过类名和对象名访问,实例属性和实例方法只能通过对象访问
- 类方法只能访问类属型和其他类方法
- 静态方法中不能使用this和super关键字
- 方法里不可以定义static变量,也就是说,类变量不能使局部变量
封装
封装
是面向对象的三大特性之一,就是将类的状态信息隐藏在类内部,不允许外部程序直接访问,而通过该类提供的方法来实现对隐藏信息的操作和访问 封装的具体步骤
修改属性的可见性来限制对属性的访问;
为每个属性创建一对赋值(setter
)方法和取值(getter
)方法,用于对这些属性的存取;
在赋值方法中,加入对属性的存取控制语句。 封装的好处
隐藏类的实现细节;
让使用者只能通过程序规定的方法来访问数据;
可以方便的加入存取控制语句,限制不合理的操作。 封装时用到的多种权限控制符修饰成员变量和方法,区别如下:
-
private
:成员变量和方法只能在其定义的类中被访问,具有类可见性 -
默认
:成员变量和方法只能被同一个包里的类访问,具有包可见性 -
protected
:可以被同一个包中的类访问,被同一个项目中不同包中的子类访问 -
public
:可以被同一个项目中的所有类访问,具有项目可见性,这是最大的访问权限
重载
构造方法的重载
方法名相同,参数列表不同,这称为构造方法的重载
- 在没有给类提供任何构造方法时,系统会提供一个无参的方法体为空的默认构造方法。
- 一旦提供了自定义构造方法,系统将不再提供这个默认的构造方法。如果要使用它,则程序员必须手动添加。
方法的重载
如果一个类包含了两个或两个以上的方法,他们的方法名相同,方法参数的个数或参数类型不同,则称该方法被重载了,这个过程称为方法重载。
成员变量和构造方法都可以进行重载。 注意:
- 方法重载的判断依据如下:
- 必须在同一个类里
- 方法名相同
- 参数列表(方法参数的个数或参数类型)不同
- 与方法的返回值和方法修饰符没有任何关系!
- 在使用
this
调用自身的其他构造方法时,只能作为第一条语句
super关键字
super
关键字是对一个对象的默认引用。在每个实例方法内部,都有一个this引用变量,指向调用这个方法的对象。
super
使用实例:
- 使用
this
调用成员变量,解决成员变量和局部变量的同名冲突
public void setName (String name) {
this.name = name;
}
public void setName (String xm) {
name = xm;
}
- 使用
this
调用成员方法
public void play (int n) {
health = health - n;
this.print(); //this可以省略,直接调用print();
}
- 使用
this
调用重载的构造方法,只能在构造方法中使用,必须是构造方法的第一句。
public Dog (String name, String sex) {
this.name = name;
this.sex = sex;
}
public Dog (String name, String sex, int health) {
this(name, sex); //调用重载的构造方法
this.health = health;
}
- 因为
this
在对象内部指代自身的引用,所以this
只能调用实例变量、实例方法和构造方法 -
this
不能调用类变量和类方法,也不能调用局部变量
继承
继承的语法规范
修饰符 SubClass extends SuperClass {
//类定义部分
}
继承(inheritance)通过extends
关键字来实现,其中的SubClass
称为子类,SuperCLass
称为父类、基类或超类。
- 修饰符如果是
public
,则该类在整个项目中可见; - 若无
public
修饰,则该类只在当前包可见; - 不可以使用
private
和protected
修饰类
继承的介绍
继承是面向对象的三大特性之一,是Java中实现代码重用的重要手段之一。
Java中只支持i单继承,即每个类只能有一个直接父类。
继承表达的是is a
关系,或者说是一种特殊和一般的关系,如Dog is a Pet
。
在Java中,子类可以从父类中继承到如下”财产”:
- 继承public
和protected
修饰的属性和方法,无论子类和父类是否在同一个包里。
- 继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里。
- 无法继承private
修饰的属性和方法。
- 无法继承父类的构造方法。
访问修饰符的访问权限
访问修饰符的访问权限如下所示:
访问修饰符 | 本类 | 同包 | 子类 | 其他 |
private | √ | × | × | × |
默认 | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |