目录
一、面向对象概述
1.1 对象
1.2 类
1.3 封装
1.4 继承
1.5 多态
二、类
2.1 成员变量
2.2 成员方法
2.3 权限修饰符
2.4 局部变量
2.5 局部变量的有效范围
2.6 this关键字
三、类的构造方法
四、静态变量和静态方法
五、类的主方法
六、对象
6.1 对象的创建
6.2 访问对象的属性和行为
6.3 对象的引用
6.4 对象的销毁
通常会将对象分为两部分,即静态部分和动态部分。静态部分就是不能动的部分,这个部分被称为“属性”,动态部分即对象可执行的动作,这部分称为“行为”。
可以将属性和行为封装起来,构成我一个类。
类实质上就是封装对象属性和行为的载体,而对象则是类抽象出来的一个实例。
类就是同一类事物的统称。类是构造对象时所依赖的规范。
类是封装对象的属性和行为的载体,反过来说,具有相同属性和行为的一类实体被称为类。
在Java语言中,类对象的行为是以方法的形式定义的,对象的属性是以成员变量的形式定义的,所以类包括对象的属性和方法。
面向对象程序设计具有以下特点:封装性、继承性和多态性。
封装是面型对象编程的核心思想。将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节。
采用封装的思想保证了类内部数据结构的完整性。
类与类之间同样具有关系,这种关系被称为关联。关联主要描述两个类之间的一般二元关系。继承是关联中的一种。
设计软件时,使用继承思想可以缩短软件开发的周期,复用那些已经定义好的类可以提高系统性能,减少系统在使用过程中出现错误的概率。
继承性主要利用特定对象之间的共有属性。
类的实例都是父类(超类)的实例,但不能说父类的实例是子类的实例。
继承关系可以使用树形关系表示,父类和子类存在一种层次关系,一个类处于继承体系中,它既可以是其他类的父类,为其他类提供属性和行为,也可以是其他类的子类,继承父类的属性和方法。
将父类对象应用于子类的特征就是多态。以图形类来说明多态,每个图形都拥有绘制自己的能力,这个能力可以看作是该类具有的行为,如果将子类的对象统一看作是父类的实例对象,这样当绘制图形时,简单地调用父类也就是图形类绘制图形的方法即可绘制任何图形,这就是多态最基本的思想。
在Java中,对象的属性也称为成员变量,成员变量可以是任意类型,整个类中均是成员变量作用的范围。
例:创建一个Book类,在类中设置一个name属性,并为该属性编写Getter/Setter方法。
public class Book{ //类
private String name; //String类型的成员变量
public String getName() { //name的Getter方法
return name;
}
public void setName(String name) { //name的Setter方法
this.name=name;
}
}
成员变量name前面有一个关键字private关键字,它用来定义一个私有成员。
在Java语言中,使用成员方法对应于类对象的行为。
以Book类为例,它包含getName()和setName()两个方法,这两个成员方法分别为获取图书馆名称和设置图书名称的方法。
定义成员方法的语法格式如下:
权限修饰符 返回值类型 方法名(参数类型 参数名){
... // 方法体
return 返回值;
}
一个成员方法可以有参数,这个参数可以是对象,也可以是基本数据类型的变量,同时成员方法有返回值和不返回任何值的选择,如果方法需要返回值,可以在方法中使用return关键字,使用这个关键字后,方法的执行将被终止。
要使Java代码中的成员方法无返回值,可以使用void关键字表示。
成员方法的返回值类型要与方法返回值类型一致。
在成员方法中可以调用其他成员方法和类成员变量。
如果一个方法中含有与成员变量同名的局部变量,则方法中对这个变量的访问以局部变量进行。类的成员变量和成员方法也可以统称为类成员。
Java的权限修饰符主要包括private、public和protected。
访问包位置 | 类修饰符 | ||
---|---|---|---|
private | protected | public | |
本类 | 可见 | 可见 | 可见 |
同包其他类或子类 | 不可见 | 可见 | 可见 |
其他包的类和子类 | 不可见 | 不可见 | 可见 |
public和pritected修饰的类可以由子类访问,如果父类和子类不在同一包中,那么只有修饰符为public的类可以被子类访问。如果父类不允许通过继承产生的子类访问它的成员变量,那么必须使用private声明父类的这个成员变量。
当声明类不适用public、protected和private修饰符设置类的权限,则这个类预设为包存取范围,即只有一个包中的类可以访问这个类的成员变量或成员方法。
例如,在项目中的com.mr包下创建AnyClass类,该类使用默认的访问权限。
package com.mr;
class AnyClass{
public void doString(){
... // 方法体
}
}
doString()方法的访问权限依然与AnyClass类的访问权限相同。
方法中的形参也可以作为一个局部变量。
局部变量在使用时必须进行赋值操作或被初始化,否则会出现编译错误。
package haha;
public class helloworld{
public static int[] exchange(int[] arr) {
int temp=arr[0];
arr[0]=arr[1];
arr[1]=temp;
return arr;
}
public static void main(String[] args) {
int arr[]= {17,29};
System.out.println("第一个值="+arr[0]+",第二个值="+arr[1]);
arr=exchange(arr);
System.out.println("第一个值="+arr[0]+",第二个值="+arr[1]);
}
}
可以将局部变量的有效范围称为变量的作用域,局部变量的有效范围从该变量的声明开始到该变量的结束为止。
在相互不嵌套的作用域中可以同时声明两个名称和类型相同的局部变量。
在作用范围外使用局部变量是一个常见的错误,因为在作用范围外没有声明局部变量的代码。
this关键字用于表示本类当前的对象。this关键字只能在本类中使用。
public void setName(String name) { //定义一个setName()方法
this.name=name; //将参数值赋予类中的成员变量
}
在Java语言中,规定使用this关键字来代表本类对象的引用。
但Java语言中最常规的调用方式是“对象.成员变量”或“对象.成员方法”进行调用。
this除了可以调用成员变量和成员方法,还可以作为方法的返回值。例如,返回图书类本类的对象,可以写成下面这种形式:
public Book getBook(){
return this; //返回Book类的本类对象
}
构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的。每当类实例化一个对象时,类都会自动调用构造方法。
构造方法的特点如下:
在定义构造方法时,构造方法没有返回值,但这与普通没有返回值的方法不同,普通没有返回值的方法使用public void methodEx()这种形式进行定义,但构造方法并不需要void关键字进行修饰。
构造方法的定义语句如下:
public Book{
... //构造方法体
}
在构造方法中可以为成员变量赋值,这样当实例化一个本类对象时,相应的成员变量也将被初始化。如果类中没有明确定义构造方法,编译器会自动创建一个不带参数的默认构造方法。
如果在类中定义的构造方法都不是无参的构造方法,那么编译器也不会为类设置一个默认的无参构造方法,当试图调用无参构造方法实例化一个对象时,编译器会出错。所以,只有在类中没有定义任何构造方法时,编译器才会在该类中自动创建一个不带参数的构造方法。
this可以调用类中的构造方法。
package haha;
public class EggCake{
int eggCount; //鸡蛋灌饼里蛋的个数
public EggCake(int eggCount) { //参数为鸡蛋灌饼里蛋的个数的构造方法
this.eggCount=eggCount; //将参数eggCount的值付给属性eggCount
}
public EggCake() { //无参数构造方法,默认给饼加一个蛋
//调用参数为鸡蛋灌饼里蛋的个数的构造方法,并设置鸡蛋灌饼里蛋的个数为1
this(1);
}
public static void main(String[] args) {
EggCake cake1=new EggCake();
System.out.println("顾客不要求加蛋的数量,饼里会有"+cake1.eggCount+"个蛋。");
EggCake cake2=new EggCake(2);
System.out.println("顾客要求加2个蛋,饼里会有"+cake2.eggCount+"个蛋。");
}
}
由static关键字修饰的变量和方法被称为静态变量和静态方法。
被声明为static的变量和方法被称为静态成员。静态成员属于类所有,区别于个别对象,可以在本类或其他类使用类名和"."运算符调用静态成员。语法如下:
类名.静态类成员
package haha;
public class StaticDemo{
static double PI=3.1415; //在类中定义静态变量
public static void method() { //在类中定义静态方法
System.out.println("这是静态方法");
}
public static void main(String[] args) {
System.out.println(StaticDemo.PI); //调用静态变量
StaticDemo.method(); //调用静态方法
}
}
静态成员同样遵循着public、private和protected修饰符的约束。
package haha;
public class Cust{ //顾客类
static int count=0; //共享的属性:人数
String name; //名称属性
public Cust(String name) {
this.name=name; //记录名称
count++; //人数递增
}
public static void main(String[] args) {
Cust c1=new Cust("tom");
System.out.println("我是第"+Cust.count+"名顾客,我叫"+c1.name);
Cust c2=new Cust("张三");
System.out.println("我是第"+Cust.count+"名顾客,我叫"+c2.name);
Cust c3=new Cust("狗蛋儿");
System.out.println("我是第"+Cust.count+"名顾客,我叫"+c3.name);
}
}
如果执行类时,希望先执行类的初始化动作,可以使用static定义一个静态区域,这块区域被称为静态代码块。当类文件被执行时,会首先执行static块中的程序,并且只会执行一次。静态代码块的语法如下:
public class example{
static{
... //可以在这里写初始化的代码
}
}
使用static关键字要注意的几点:
主方法是类的入口点,它定义了程序从何处开始。主方法提供对程序流向的控制,Java编译器通过主方法来执行程序。主方法的语法如下:
public static void main(String[] args){
... //方法体
}
在主方法的定义中可以看到其具有以下特性:
可以在Java语言中使用new操作符调用构造方法创建对象。
package haha;
public class People{
String name;
int age;
String sex;
public People() {
}
public People(String name,int age,String sex) {
this.name=name;
this.age=age;
this.sex=sex;
}
public static void main(String[] args) {
People s1=new People("tom",23,"男");
People s2=new People("lily",19,"女");
}
}
用户使用new操作符创建一个对象后,可以使用“对象.类成员”来获取对象的属性和行为。
例:在Dog类中创建名字、颜色和声音3个属性,再创建一个“叫”的方法。以Dog类为模板创建两只狗,一只是白色且会汪汪汪叫的毛毛,一只是灰色且会嗷呜叫的灰灰。
package haha;
public class Dog{ //狗
String name; // 名字
String Color; //颜色
String voice; //声音
public Dog(String name,String color,String voice) {
this.name=name;
this.Color=color;
this.voice=voice;
}
public void call() { //叫
System.out.println(voice);
}
public static void main(String[] args) {
Dog d1=new Dog("毛毛","白色","汪汪汪");
System.out.print(d1.name+"的颜色是"+d1.Color); //访问对象的属性
System.out.print(",叫起来的声音:");
d1.call(); //访问对象的行为
Dog d2=new Dog("灰灰","灰色","嗷呜~");
System.out.print(d2.name+"的颜色是"+d2.Color); //访问对象的属性
System.out.print(",叫起来的声音:");
d2.call();
}
}
一个People类的引用可以使用以下代码:
People tom;
通常一个引用不一定需要有一个对象相关联。引用与对象相关联的语法如下:shij
People tom=new People();
实际上真正的对象是“new People()”这段代码。
new People().getClass();
等价于
People tom=new People();
tom.getClass();
以下两种情况的对象会被Java虚拟机视为“垃圾”:
虽然Java的垃圾回收机制已经很完善,但垃圾回收器只能回收那些由new操作符创建的对象。某些对象不是通过new操作符在内存中获取存储空间的,这种对象无法被拉季==垃圾回收机制所识别。