简述:
面向对象是一种现在最为流行的程序设计方法,几乎现在的所有应用都以面向对象为主了,最早的面向对象的概念实际上是由IBM提出的,在70年代的Smaltalk语言之中进行了应用,后来根据面向对象的设计思路,才形成C++,而由C++产生了Java这门面向对象的编程语言。
面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。
1.面向对象
对象:客观存在的事物皆为对象 ,所以我们也常常说万物皆对象。
- 类:
- 类的理解
类是对现实生活中一类具有共同属性和行为的事物的抽象
类是对象的数据类型,类是具有相同属性和行为的一组对象的集合
简单理解:类就是对现实事物的一种描述
- 类的组成
属性:指事物的特征,例如:手机事物(品牌,价格,尺寸)
行为:指事物能执行的操作,例如:手机事物(打电话,发短信)
- 类和对象的关系
- 类:类是对现实生活中一类具有共同属性和行为的事物的抽象
- 对象:是能够看得到摸的着的真实存在的实体
- 简单理解:类是对事物的一种描述,对象则为具体存在的事物
总结:
类是对象的模板,对象是类的实例。类只有通过对象才可以使用,而在开发之中应该先产生类,之后再产生对象。类不能直接使用,对象是可以直接使用的。
2.类和对象
2.1类的定义
类的组成:
- 属性:在类中通过成员变量来体现(类中方法外的变量)
- 行为:在类中通过成员方法来体现(和之前“方法”相比去掉static关键字即可)
类的定义步骤:
- 定义类
- 编写类的成员变量
- 编写类的成员方法
public class 类名 {
// 成员变量
变量1的数据类型 变量1;
变量2的数据类型 变量2;
…
// 成员方法
方法1;
方法2;
}
2.2对象的使用
- 格式
- 类名称 对象名称 = new 类名称() ;
- 如果要想访问类中的属性或方法(方法的定义),则可以依靠以下的语法形式:
- 访问类中的属性: 对象.属性 ;
- 调用类中的方法: 对象.方法(实际参数列表) ;
示例:
创建对象
格式:类名 对象名 = new 类名();
范例:
Phone p = new Phone();
使用对象
1:使用成员变量
格式:对象名.变量名
范例:p.brand
2:使用成员方法
格式:对象名.方法名()
范例:p.call()
匿名对象
- 没有对象名称的对象就是匿名对象。 即栈内存中没有名字,而堆内存中有对象。
- 匿名对象只能使用一次,因为没有任何的对象引用,所以将称为垃圾,等待被GC回收。
- 只使用一次的对象可以通过匿名对象的方式完成,这一点在以后的开发中将经常使用到。
示例代码:
public static void main(String[] args){
//Math2 m=new Math2();
//int num=m.sum(100,200);
//不通过创建对象名,直接实例对象调用,这就是匿名对象。因为没有对象名指向对象,所以只能调用一次,然后被GC回收。
int num = new Math().sum(100,200);
System.out.println(num);
}
class Math2{
int sum(int x,int y){
return x+y;
}
}
3.对象内存图
3.1单个对象内存图
- 成员变量使用过程
成员方法调用过程
3.2多个对象内存图
-
成员变量使用过程
-
成员方法调用过程
总结:
多个对象在堆内存中,都有不同的内存划分,成员变量存储在各自的内存区域中,成员方法多个对象共用的
一份
3.3多个对象指向相同内存图
总结:
当多个对象的引用指向同一个内存空间(变量所记录的地址值是一样的)
只要有任何一个对象修改了内存中的数据,随后,无论使用哪一个对象进行数据获取,都是修改后的数据。
4.成员变量和局部变量
4.1声明位置
局部变量:方法体{} 中、形参、代码块{} 中
成员变量:
1.类变量:有static修饰
2.示例变量:没有static修饰
4.2修饰符
局部变量:final
成员变量:public、protect、private、final、static、volatile、transient(序列化)
4.3存储位置
- 局部变量:栈
- 实例变量:堆
- 类变量:方法区
4.4作用域
- 局部变量:从声明处开始,到所属的 } 结束
- 实例变量:在当前类中 “this.” (有时this.可以省略),在其他类中 “对象名.” 访问
- 类变量:在当前类中 “类名.” (有时类名. 可以省略),在其他类中“类名.” 或 “对象名.” 访问
4.5生命周期
- 局部变量:每一个线程,每一次调用执行行都是新的生命周期
- 实例变量:随着对象的创建而初始化,随着对象的被回收而消亡,每一个对象的实例化变量是独立的
- 类变量”随着类的初始化而初始化,随着类的卸载而消亡,该类的所有对象的类变量是共享的
5.封装
5.1 private关键字
private是一个修饰符,可以用来修饰成员(成员变量,成员方法)——内部操作,外部不可见。
被private修饰的成员,只能在本类进行访问,针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作
- 提供“get变量名()”方法,用于获取成员变量的值,方法用public修饰
- 提供“set变量名(参数)”方法,用于设置成员变量的值,方法用public修饰
实例代码:
class Person
{
private String name;
private int age;
public void setName(String n)
{
name = n ;
}
public String getName()
{
return name;
}
public void setAge(int i)
{
if (i>0&&i<=200)
{
age = i ;
}
else
{
age = 0 ;//处理过后,不符合常识的条件被转换
}
}
public int getAge()
{
return age;
}
public void getPersonInfo()
{
System.out.println("姓名:"+name+",年龄:"+age);
}
}
public class Text2
{
public static void main(String[] args)
{
Person person = new Person();
person.setName("张三");
person.setAge(-200);
person.getPersonInfo();
}
}
5.2 this关键字
this修饰的变量用于指代成员变量,其主要作用是(区分局部变量和成员变量的重名问题)
- 方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
- 方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量
5.2.1 this表示本类属性
打破程序就近原则,直接去类的属性中找同名属性
语法:this.属性名称
实例代码:
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void getPersonInfo() {
System.out.println("姓名是:"+name+", 年龄是:"+age);
}
}
public class ThisBiaoShiBenLeiShuXing {
public static void main(String[] args) {
Person per = new Person("张三", 18);
per.getPersonInfo();
}
}
建议:在类中方法访问类中属性,加this关键字
5.2.2 this表示本类方法
-
this表示本类构造方法
在构造方法首行使用this(参数)表示调用本类的构造方法。
语法:
this(方法参数);
class Person { private String name; private int age; public Person() { System.out.println("产生一个新的Person对象"); } public Person(String name) { // 调用本类无参构造 this(); this.name = name; } public Person(String name, int age) { // 调用本类有参构造 this(name); this.age = age; } public void getPersonInfo() { System.out.println("姓名是:"+name+", 年龄是:"+age); } } public class ThisDemoOne { public static void main(String[] args) { Person per1 = new Person(); Person per2 = new Person("张三"); Person per3 = new Person("李四", 20); per1.getPersonInfo(); per2.getPersonInfo(); per3.getPersonInfo(); } }
注意:this调用本类构造方法必须写在构造方法首行;this调用构造方法不能成“环”。
-
this表示本类普通方法
语法:
this.方法名称(方法参数);
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.fun();
this.name = name;
this.age = age;
}
public void getPersonInfo() {
System.out.println("姓名是:"+name+", 年龄是:"+age);
}
public void fun() {
System.out.println("产生一个Person对象");
}
}
public class ThisDemoTwo {
public static void main(String[] args) {
Person per = new Person("张三", 20);
per.getPersonInfo();
}
}
5.2.3 this表示当前对象
当前调用的属性或方法是通过哪个对象调用的,this就指代它。
class Person {
public void print() {
System.out.println("print方法"+this);
}
}
public class ThisDemoThree {
public static void main(String[] args) {
Person per1 = new Person();
System.out.println("main方法"+per1);
per1.print();
System.out.println("==========");
Person per2 = new Person();
System.out.println("main方法"+per2);
per2.print();
}
}
6.构造方法
构造方法是一种特殊的方法,它是一个与类同名的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。
Java构造方法有以下特点:
- 方法名必须与类名相同
- 可以有 0 个、1 个或多个参数
- 没有任何返回值,包括 void
- 默认返回类型就是对象类型本身
- 只能与 new 运算符结合使用
格式:
class class_name {
public class_name(){} // 默认无参构造方法
public ciass_name([paramList]){} // 定义构造方法
…
// 类主体
}