认识类与对象
OOP
Java中的重点内容!
什么是OOP
OOP:Object-Oriented Programming 面向对象程序设计
Java是面向对象,OOP是使用Java语言描述客观存在的事和物,并使用程序的逻逻辑将这些事和物联系起来,为实现某个目的而进行交互的过程。因此必须熟悉OOP才能很好的使用Java。
OOP的程序组成
面向对象的程序是由对象组成的,每个对象包含对用户的公开部分和隐藏部分。
认识类与对象
什么是类
类是一个模板,是对一类对象和行为和状态的描述,类中定义的是属性和行为(方法)。
什么是对象
对象是类的一个实例,表示一个独立的个体,每个对象都有自己的属性,通过不同的属性来区分不同对象。
类与对象的关系
类是对象的模板,对象是类的实例。类只有通过对象才可以使用,而在开发之中应该先产生类,之后再产生对象。类不能直接使用,对象是可以直接使用的。
类与对象的定义和使用
定义
{
class 类名{
变量(属性);
方法(行为);
}
范例:定义一个人(Person)类,有名字(name)和年龄(age)两个属性,有一个介绍(introduce)行为。
public class Person {
String name;
int age;
public void introduce(){
System.out.println("我的名字是:"+name+",年龄为:"+age);
}
}
使用
实例化对象
1、声明和实例化分开。
/*
类名 对象名 = null;
对象名 = new 类名();
*/
Person person = null;
person = new Person();
2、声明并且实例化对象
//类名 对象名 = new 类名();
Person person = new Person();
使用对象操作类
//对象名.属性名:表示调用类之中的属性;
//对象名.方法名():表示调用类之中的方法。
public static void main(String[] args) {
//声明对象person1
Person person1 = null;
//实例化对象
person1 = new Person();
//给person1的name和age属性赋值
person1.name = "WANWAN";
person1.age = 21;
//调用person1的介绍
person1.introduce();
Person person2 = new Person();
person2.name = "MOMO";
person2.age = 22;
person2.introduce();
}
运行结果:
我的名字是:WANWAN,年龄为:21
我的名字是:MOMO,年龄为:22
两种方式实例化对象的区别
从内存角度分析实例化过程;
首先了解一下两种内存空间是用来做什么的:
1、栈内存:保存的是堆内存的地址(方便理解就想成是保存了对象的名字)。
2、堆内存:保存的是对象的属性内容,堆内存要用new关键字来分配空间。
第一种方法:
第二种方法:
可以看出,第二种方法就是把第一种方法的一二步合起来了
对象的引用传递
先看代码,还是刚才的两个对象,我们让person2 = person1来看看结果。
public static void main(String[] args) {
Person person1 = null;
person1 = new Person();
person1.name = "WANWAN";
person1.age = 21;
person1.introduce();
Person person2 = new Person();
person2.name = "MOMO";
person2.age = 22;
person2.introduce();
person2 = person1; //引用传递
person2.name = "FANFAN";
person1.introduce();
}
运行结果:
我的名字是:WANWAN,年龄为:21
我的名字是:MOMO,年龄为:22
我的名字是:FANFAN,年龄为:21
可以看到通过person2.name修改了name属性值,person1的name属性值也改变了。
我们可以来看下内存中的过程:
类的构造方法
在Java中每个类都有构造方法。如果没有显式地为类定义构造方法,Java 编译器将会为该类提供一个默认构造方法。
在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。
Person类:
public class Person {
String name;
int age;
//无参构造
public Person() {
System.out.println("调用了无参构造");
}
//有参构造(1个参数)
public Person(String name){
System.out.println("调用了带name有参构造");
this.name = name;
}
//有参构造(全部参数)
public Person(String name, int age) {
System.out.println("调用了全参构造");
this.name = name;
this.age = age;
}
}
下面看几个测试,来搞清楚对无参与带参的调用。
public class Test {
public static void main(String[] args) {
Person person1 = new Person();//没有参数
}
}
//运行结果:
//调用了无参构造
public class Test {
public static void main(String[] args) {
Person person1 = new Person("WAN",21);//全参
}
}
//运行结果:
//调用了全参构造
public class Test {
public static void main(String[] args) {
Person person1 = new Person("WAN");//带name参数
}
}
//运行结果:
//调用了带name有参构造
public class Test {
public static void main(String[] args) {
Person person1 = new Person(22);//带age参数
}
}
//运行结果:
//Error:不兼容的类型: int无法转换为java.lang.String
通过这些测试可以看出:new对象时会根据所带的参数选择已经写了的构造方法,如果没有对应的构造方法,则会报错
类的成员方法
类成员方法就是对象所拥有的动作,比如自我介绍就是人的一个动作,就可以称之为人的一个方法。成员方法由自己编写,和之间在入口方法中写代码一样。
格式:
访问修饰符 [特殊修饰符 static/final/synchronized] 返回类型 方法名称([形参列表]){
...
}
例:
public class Person {
String name;
int age;
//这个就是成员方法
public void introduce(){
System.out.println("我的名字是:"+name+",年龄为:"+age);
}
}