前言
初识类和对象;掌握类的定义方法以及对象的实例化;掌握类中的成员变量和成员方法的使用;掌握对象的整个初识化过程。
一、类与对象的初步认识
现实世界的实体——>可以抽象成主观世界的类别
在Java中把具有相同特性的对象可以归总为一个类,类可以实例化多个对象。
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
Java是基于面向对象的,关注的是对象, 将一件事情拆分成不同的对象,靠对象之间交互完成。
面向过程:1)打开冰箱 2)把大象放进去 3)冰箱关起来
面向对象:冰箱是一个对象,打开冰箱、存储、关闭都是对冰箱的操作,是冰箱的行为。
【面向对象概念】
1.面向对象是思考问题的一种思考方式,是一种思想
2.类就是一类对象是统称,对象就是这一类具体化的实例
3.面向对象的好处:将复杂问题简单化,只要面对一个对象就行。
【面向对象设计】
面向对象设计把握一个重要的经验:谁拥有数据,谁对外提供操作这些数据(私有)的方法!
在开发时:找对象,建对象,用对象,并维护对象之间的关系。
总结
面向对象就是用代码(类)来描述客观世界的事物的一种方式,一个类主要包含一个事物的属性和行为。
二、类和类的实例化
类就是一类对象的统称,对象就是这一类具体化的实例。(一个类可以产生无数的对象)
声明一个类就是创建一个新的数据类型,而类在Java中属于引用类型,Java使用关键字class来声明
基本语法:
//创建类
class class_name {
field;//成员属性、实例属性
method;//成员方法、实例方法
}
//实例化对象
class_name 对象名 = new class_name ();
class 为定义类的关键字,class_name为类的名字,{}中为类的主体。
类的实例化
用类类型创建对象的过程,称为类的实例化
1.类只是一个模型,限定了类有哪些成员
2.一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量
3.比如,类实例化出对象就像是用建筑设计图造出房子,类就是设计图,只设计需要什么东西,没有实体建筑存在,同样类也只是一个设计,实例出的对象才能实际存储数据,占用物理空间
例子:
class Person{
//成员属性
public int age;
public String name;
public String sex;
public void eat(){ //成员方法
System.out.println("吃饭!");
}
public void sleep(){
System.out.println("睡觉!");
}
}
public class Test {
public static void main(String[] args) {
Person person = new Person();//通过new实例化对象
person.eat();//成员方法调用需要通过对象的引用调用
person.sleep();
Person person2 = new Person();
Person person3 = new Person();
}
}
输出结果:
吃饭!
睡觉!
·new关键字用于创建一个对象实例
·使用“.”来访问对象中的属性和方法
·同一个类可以创建多个实例
三、类的成员
类的成员包含:字段、方法、代码块、内部类和接口等
1.字段/属性/成员变量
(1)定义:
在类中,方法外部定义的变量,称为“字段”、“属性”或“成员变量”,用于描述类中包含哪些数据
注意:对一个对象的属性没有设置初始值,那么就会被设置一个默认的处置
- 对于数字类型,默认值为 0
- 对象Boolean 类型,默认值为false
- 对于引用类型,默认值为 null
(2)null
null在java中为“空引用”,表示不引用任何对象,如果对null进行“.”操作就会引发异常
class Person{
public int age;
public String name;
}
public class Test {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name.length());
}
}
运行结果:
NullpointerException意思为调用了一个值为null的引用
(3)成员属性初始化
大部分时间我们都需要给成员属性设定初始值
class Person{
public int age = 18;
public String name = "小明";
public String sex = "男";
}
public class Test {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name);
System.out.println(person.age);
System.out.println(person.sex);
}
}
运行结果
2.方法(method)
方法用于描述一个对象的行为
class Person{
public String name = "小明";
public void eat(){
System.out.println(name+"正在吃饭!");
}
public void sleep(){
System.out.println(name+"正在睡觉!");
}
}
public class Test {
public static void main(String[] args) {
Person person = new Person();
person.eat();
person.sleep();
}
}
此处的eat和sleep方法就是person这个对象具有的一个展示行为。
这样的方法和person实例相关联的,如果创建了其他实例,那么方法的行为就会发生改变
class Person{
public int age = 18;
public String name = "小明";
public String sex = "男";
public void eat(){
System.out.println(name+"正在吃饭!");
}
public void sleep(){
System.out.println(name+"正在睡觉!");
}
}
public class Test {
public static void main(String[] args) {
Person person = new Person();
person.eat();
person.sleep();
System.out.println("-------------");
Person person1 = new Person();
person1.name = "小红";
person1.eat();
person1.sleep();
}
}
---------------------------------------------------------------------------------------------------------------------------------
方法中还有一种特殊的方法称为构造方法
在实例化对象的时候会被自动调用到的方法,方法名字和类名字相同,用于对象的初始化
构造方法的作用就是产生对象
使用new关键字产生一个对象时:
1.为对象在堆中分配空间
2.调用对象的构造方法为对象成员变量赋值
构造方法语法规则:
1.方法名和类名完全相同
2.构造方法没有返回值声明(不是void)
3.一个类中至少存在一个构造方法,若没有显示定于,编译器会生成一个默认的无参构造
当类中自定义了构造方法,则默认的无参构造就不在生成
构造方法可以重载
构造方法是为了类中的成员变量赋值,此时的重载只可能是参数的个数不同
3. static关键字
1.修饰属性 2.修饰方法 3.代码块 4.修饰类
(1)修饰属性
Java静态属性和类相关,和具体的实例无关。(同一个类的不同实例共用同一个静态属性)、
当一个实例变量被static关键字修饰,它就表示类的属性,该类的所有对象共享这个属性,所有对象的属性值都相同
static修饰的属性在JVM方法区中存储,所有类的对象共享此属性
static修饰的属性,直接通过类名称就可以访问,无需通过对象访问,例:Person.static修饰的属性
注意:不能在一个方法内部定义一个static变量,方法中定义的变量是全局变量,局部变量都在栈中存储,咋可能定义了个既在栈中又在方法区的属性呢。
(2)修饰方法
如果在任何方法上应用static关键字,此方法称为静态方法。
-静态方法属于类,而不属于类的对象
-可以直接调用静态方法,而无需创建类的实例
-静态方法可以访问静态数据成员,并可以更改静态数据成员的值
class TestDemo{
public int a ;
public static int count;
public static void change(){
count = 100;
//a = 10; error 不可以访问非静态数据成员
}
}
public class Test {
public static void main(String[] args) {
TestDemo.change();//无需创建实例对象,就可以调用
System.out.println(TestDemo.count);
}
}