1.面向对象的概述
面向对象思想是人类最自然的思考方式,它将所有预处理的问题抽象为对象,同时了解这些对象具有哪些相应的属性以及行为,以解决这些对象面临的一些实际问题,面向对象设计实质上就是对现实世界的对象进行建模操作。
1.1 对象
对象是一个抽象概念,英文称作“Object”,表示任意存在的事物。世间万物皆为对象,对象是事物存在的实体,例如一个人。
通常将对象划分为两个部分,即静态部分与动态部分。静态部分被称为 “属性” ,任何对象都具备自身属性,这些属性不仅是客观存在的,而且是不能被忽视的,例如人的性别。动态部分是指的是对象的行为,即对象执行的动作,例如人可以走和跑。
1.2 类
类是封装对象属性和行为的载体,反过来说具有相同属性和行为的一类实体被称作为类,例如定义一个燕子类,它具备翅膀,喙,爪子等属性,飞行,睡觉,觅食等行为,以只从南方飞回北方的燕子则被视为燕子类的一个对象,具体关系如下图所示:
在Java语言中,类包括对象的属性和方法。类中对象的属性是以成员变量的形式定义的,对象的行为是以方法的形式定义的。
1.3 面向对象程序设计的特点
面向对象程序设计具有以下特点:封装性 继承性 多态性
1.3.1 封装
封装是面向对象编程的核心思想。将对象的属性和行为封装起来,其载体就是类,类会对用户隐藏现实细节,这就是封装的思想,例如:你去饭店吃饭,你只用吃,你无须知道饭是厨师怎样做出来的。
采用封装的思想保证内部数据结构的完整性,使用该类的用户不能直接操作此数据结构,只能操作类允许公开的数据。这样避免外部操作对内部数据产生影响,提高程序的可维护性。
1.3.2 继承
矩形,菱形,平行四边形都是四边形。因为四边形与它们具有共同的特征:有四条边。将四边形合理延伸,就会得到上述图形。以平行四边形为例,如果把平行四边形看作四边形的延伸,那么平行四边形就复用了四边形的属性和行为,同时添加了平行四边形特有的属性和行为,例如平行四边形对边平行且相等。Java中,可以将平行四边形类看作是继承四边形类后产生的类,其中平行四边形类称为子类,四边形类称为父类或超类。
注意:Java中,子类的实例都是父类的实例,但不能说父类的实例都是子类的实例。
综上,继承是实现和重复利用的重要手段,子类通过继承,复用父类的属性和行为的同时又添加子类特有的属性和行为。
1.3.3 多态
将父类对象应用于子类的特征就是多态。父类衍生出不同的子类,子类继承父类特征的同时,也具备自己的特征,并且能够实现不同的效果,这就是多态化的结构。
2.类与对象
类是封装对象的属性和行为的载体,Java中定义类时使用class关键字,语法格式如下:
class 类名称{ //类的成员变量 //类的成员方法 }
对象的属性以成员变量的形式存在,对象的行为以成员方法的形式存在。
2.1 成员变量
Java中,对象的属性也称为成员变量,成员变量与普通变量定义一样,格式:
数据类型 变量名称;
定义变量时可以赋值也可以不赋值。
我们可以先定义一个Student类,成员变量对应类对象的属性。
public class Student{ String name; //姓名 String gender; //性别 int age; //年龄 }
成员变量就是普通的变量,可以赋值也可以不赋值,如果不设置初始值,系统会有默认值,
Java中常见类型的默认值:
数据类型 | 默认值 | 说明 |
byte short int long | 0 | 整型0 |
float double | 0.0 | 浮点0 |
char | ' ' | 空格字符 |
boolean | false | 逻辑假 |
引用类型 | null | 空值 |
引用类型 null 空值
2.2 成员方法
成员方法对应类对象的行为,主要用来定义可执行的操作。
成员方法的定义,语法格式:
访问修饰符 返回值类型 方法名(参数列表){ //方法体 return 返回值; }
访问修饰符可以是public private protected 任意一个也可以不写,主要用来控制方法的访问权限
访问修饰符:
public |
protected | default(省缺) | private | |
本类 | 可见 | 可见 | 可见 | 可见 |
本类所在包 | 可见 | 可见 | 可见 | 不可见 |
其他包中的子类 | 可见 | 可见 | 不可见 | 不可见 |
其他包中的非子类 | 可见 | 不可见 | 不可见 | 不可见 |
说明: 方法的定义必须在某个类中,定义方法时如果没有指定权限修饰符,方法的默认访问权限为省缺。
例:
public void SetStudent(int age,String name){ System.out.println(age+name); }
因为是void类型所以无返回值,如果有返回值,返回值类型必须与方法的返回值类型一致。
2.3 构造方法
在类中存在一种特殊类型的方法,就是构造方法,构造方法与类同名,对象的创建就是通过构造方法完成的。每当类实例化一个对象时,类都会自动调用构造方法。
构造方法的特点:
· 构造方法没有返回值类型,也不能定义为void
· 构造方法名称要与本类的名称相同
· 构造方法的主要作用是完成对象的初始化工作,它能把定义对象的参数传给对象成员
构造方法的定义语法:
public class Student { //构造方法 public Student(){ } }
public 为构造方法的修饰符
如果类中没有明确定义构造方法,则编译器会自动创建一个不带参数的默认构造方法
构造方法可以为成员变量赋值,并且构造方法可以带有参数。例:
public class Student { int age; String name; String gender; public Student(int age,String name,String gender){ //构造方法 this.age = age; this.name = name; //赋值 this.gender = gender; } }
注意:只有在类中没有定义任何构造方法时,编译器才会创建一个默认无参的构造方法
实例:创建一个学生类,用构建方法为成员变量赋值,并输出打印。
public class Student { int age; String name; String gender; public Student(int age,String name,String gender){ this.age = age; this.name = name; this.gender = gender; } void printStudent(){ System.out.println(name+"-"+gender+"-"+age); } public static void main(String[] args) { Student s = new Student(20,"XiaoHua","女"); s.printStudent(); } }
输出结果:
2.4 局部变量
如果在成员方法内定义一个变量,这个变量就被称为局部变量
局部变量在方法执行时被创建,在方法执行结束时被销毁。局部变量在使用时必须初始化,否则会出现编译错误。例:
编译器直接飘红
2.5 this关键字
先看一段代码:
public class Student { int age; String name; String gender; public Student(int age,String name,String gender){ age = age; name = name; //哪个是参数,哪个是成员变量呢? gender = gender; }
当类中的成员变量与成员方法中的参数重名时,方法如何使用成员变量呢?
在Java中,规定使用this关键字来代表本类对象的引用,this被隐式的用于引用对象的成员变量和方法。将上述代码改进如下:
public Student(int age,String name,String gender){ this.age = age; this.name = name; this.gender = gender; }
· this关键字引用的就是本类的一个对象,在局部变量或方法参数覆盖了成员变量时,如上面代码情况,就要添加this关键字明确引用的是类成员还是局部变量或方法参数。
· 如果省略this关键字直接写成 name = name ,那只是把参数name赋值给参数变量本身而已,成员变量name的值没有改变,因为参数name在方法的作用域中覆盖了成员变量name。
· this关键字除了可以调用成员变量或成员方法之外,还可以作为方法的返回值,例:
public class Book{ public Book getbook(){ return this; //返回Book类引用 } }
3. static关键字
由static 修饰的变量,常量,方法分别称为静态变量,静态常量,静态方法,也被称作类的静态成员。
3.1 静态变量
许多时候不同类之间需要同一个变量进行操作,例如同一个班的学生,学生本身的属性不同,但是所有学生共享一个教室。在Java中如果用static修饰共享的变量,那么该变量就是静态变量。
调用静态变量的语法如下: 类名.静态成员
先看这样的一段代码:
public class Student { int age; String name; String gender; static String classRoom = "307"; public Student(int age,String name,String gender){ this.age = age; this.name = name; this.gender = gender; } void printStudent(){ System.out.println(name+"-"+gender+"-"+age); } public static void main(String[] args) { Student s1 = new Student(20,"XiaoHua","女"); Student s2 = new Student(22,"XiaoFang","女"); Student s3 = new Student(23,"XiaoZhang","男"); Student s4 = new Student(24,"XiaoLi","男"); } }
在这里打断点:
进行调试:
发现静态成员变量不在具体的对象中存在。
静态成员只有一份,被所有的对象共享,当类被卸载时,静态成员才会被销毁。
静态成员变量访问的方式有两种:通过成员访问和直接通过类名访问,推荐:类.静态成员变量
3.2 静态方法
如果想要使用类中的成员方法,需要先将这个类进行实例化,但有些时候不想或者无法创建类的对象时,还要调用类中的方法才能够完成,这种情况下可以使用静态方法,调用静态方法格式如下:
类名.静态方法();
例如这段代码:
public class Student { int age; String name; String gender; static String classRoom = "307"; public Student(int age,String name,String gender){ this.age = age; this.name = name; this.gender = gender; } public static String getClassRoom(){ //静态成员方法 return classRoom; } public static void main(String[] args) { System.out.println(Student.getClassRoom()); } }
利用静态成员方法访问静态成员变量。
注意:静态方法不能访问实例变量。
4. 代码块
4.1 代码块概念及分类
使用 { } 定义的一段代码称为代码块,根据代码块的位置以及关键字,分为以下四种:
普通代码块,构造代码块,静态代码块,同步代码块(暂时不谈)
4.2 普通代码块
普通代码块:定义在方法中的代码块。
public static void main(String[] args) { int a = 10; System.out.println(a); }
4.3 构造代码块
构造块:定义在类中的代码块(无任何修饰符),也叫实例代码块,一般用于初始化实例成员变量
public class Student { int age; String name; String gender; public Student(){ System.out.println("我是构造方法"); } //实例代码块 { this.age = 20; this.name = "XiaoHe"; this.gender = "男"; } public void printStudent(){ System.out.println(name+gender+age); } public static void main(String[] args) { Student s = new Student(); s.printStudent(); } }
注意事项:实例代码块优先于构造方法执行,因为编译完成后,编译器会将实例代码块中的代码拷贝到每个构造方法第一条语句前。
4.4 静态代码块
使用static定义的代码块称为静态代码块,一般用于初始化静态成员变量
public class Student { int age; String name; String gender; static String classRoom; public Student(){ System.out.println("我是构造方法"); } //实例代码块 { this.age = 20; this.name = "XiaoHe"; this.gender = "男"; } //静态代码块 static{ classRoom = "8-b-307"; } public void printStudent(){ System.out.println(name+gender+age); } public static void main(String[] args) { Student s = new Student(); s.printStudent(); System.out.println(s.classRoom); } }
注意事项:
静态代码块不管生成多少个对象,只会执行一次
静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
5. 类的主方法
主方法是类的入口点,它指定了程序从何处开始,提供对程序流向的控制,Java编译器通过主方法来执行程序。
主方法语法如下:
public static void main(String[] args) { //方法体 }
主方法的特性:
· 主方法是静态的,所以要直接在主方法中调用其他方法,则该方法也必须是静态的。
· 主方法没有返回值
· 主方法的形参为数组。其中args[0]~args[n]分别代表程序的第一个参数到第n+1个参数,可以使用args.length获取参数的个数。