黑马程序员_面向对象---封装

本文详细介绍Java面向对象的基本概念,包括封装、继承、多态等核心特性,并深入探讨构造函数、this关键字、静态成员及单例设计模式等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------- android培训java培训、java学习型技术博客、期待与您交流! ----------

                                                                                              面向对象---封装
1、认识面向对象
(了解★★☆☆☆)
1.1 面向对象:将功能封装进对象,强调具备了功能的对象。
特征:
封装(encapsulation)
继承(inheritance)
多态(polymorphism)
1.2 用java语言对现实生活中的事物进行描述。通过类的形式来体现的。
对象:其实就是该类事物实实在在存在的个体。
类与对象的关系?
类:事物描述。
对象:该类事物的实例。使用new来创建。
1.3 成员变量和局部变量的区别:
a.成员变量定义在类中,整个类中都可以访问。
局部变量定义在函数,语句,局部代码块中,只在所属的区域有效。
b.成员变量存在于堆内存的对象中。
局部变量存在于栈内存的方法中。
c.成员变量随着对象的创建而存在,随着对象的消失而消失。
局部变量随着所属区域的执行而存在,随着所属区域的结束而释放。
d.成员变量都有默认初始化值。
局部变量没有默认初始化值。不能被public、private、static修饰。
1.4 匿名对象
匿名对象使用方式一:当对对象的方法只调用一次时,可以用匿名对象来完成,这样写比较简化。
如果对一个对象进行多个成员调用,必须给这个对象起个名字。
匿名对象使用方式二:可以将匿名对象作为实际参数进行传递。
如:new Car().run();、show(new Car());
2、封装(了解★★☆☆☆)
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
好处:
将变化隔离。
便于使用。
提高重用性。
提高安全性。

封装原则:
将不需要对外提供的内容都隐藏起来。
把属性都隐藏,提供公共方法对其访问。

private :私有,权限修饰符:用于修饰类中的成员(成员变量,成员函数)。
私有只在本类中有效。

将变量私有化以后,类以外即使建立了对象也不能直接访问。
3、构造函数(重要★★★★☆)
对象一建立就会调用与之对应的构造函数。
作用:可以用于给对象进行初始化。

小细节:当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数。
当在类中自定义了构造函数后,默认的构造函数就没有了。

构造函数和一般函数在写法上有不同。
类名(参数)
{
代码块//不用写return语句
}
多个构造函数以重载的形式存在。

构造函数是在对象一建立就运行。给对象初始化。
一般函数是对象调用才执行,是对象添加对象具备的功能。

一个类中默认会有一个空参数的构造函数,
这个默认的构造函数的权限和所属类一致。
如果类被public修饰,那么默认的构造函数也带public修饰符。
如果类没有被public修饰,那么默认的构造函数,也没有public修饰。

默认构造构造函数的权限是随着的类的变化而变化的。
3.1构造代码块
定义格式
{
代码;
}
作用:给对象进行初始化。
对象一建立就运行,而且优先于构造函数执行。

与构造函数的区别:
构造代码块是给所有对象进行统一初始化。
而构造函数是给对应的对象初始化。
4、this关键字
特点:this代表其所在函数所属对象的引用。this代表本类对象的
this代表它所在函数所属对象的引用。
哪个对象在调用this所在的函数,this就代表哪个对象。

this的应用:在定义类中功能时,该函数内部要用到该函数的对象时,
这时用this来表示这个对象。但凡本类功能内部使用了本类对象,都用this表示。

this语句 :用于构造函数之间进行互相调用。
如:this();
this语句只能定义在构造函数的第一行。因为初始化要先执行。默认都在第一行。
如:

class Person
{
	private String name;
	private int age;
	Person(int age)
	{
		this.age = age;
	}
	Person(String name)
	{
		this.name = name;
	}
	Person(String name,int age)
	{
		this.name = name;
		this.age = age;
	}

	public void speak()
	{
		System.out.println("name="+this.name+"...age="+this.age);
		this.show();
	}
	public void show()
	{
		System.out.println(this.name);
	}

	/*
	需求:给人定义一个用于比较年龄是否相同的功能。也就是是否是同龄人。
	*/
	public boolean compare(Person p)
	{
		return this.age==p.age;

	}
}


5、static关键字

static关键字用于修饰成员(成员变量和成员函数)
被修饰的成员具有以下特点:
随着类的加载而加载
优先于对象存在
被所有对象所共享
可以直接被类名调用。类名.静态成员。

实例变量和类变量的区别:
1.存放位置
类变量随着类的加载而存在于方法区中。
实例变量随着对象的建立而存在于堆内存中。
2.生命周期
类变量生命周期最长,随着类的消失而消失。
实例变量生命周期随着对象的消失而消失。

注意:
静态方法只能访问静态成员
静态方法中不可以写this,super关键字
主函数是静态的

利弊:
利处:对对象的共享数据进行单独空间的存储,节省空间。
没有必要每个对象中都存储一份。
弊端:生命周期过长。访问出现局限性。静态只能访问静态。

成员变量也叫实例变量。
静态的成员变量也叫类变量。

public static void main(String[] args)
主函数:是一个特殊的函数。是程序的入口,可以被jvm调用。
定义:
public:代表着该函数访问权限是最大的。
static:代表主函数随着类的加载而加载。
void:主函数没有具体的返回值。
main:不是关键字,但是是一个特殊的单词,可以被虚拟机识别。
(String[] arr):函数的参数,参数类型是一个数组,该数组中的元素是字符串。字符串类型的数组。
固定格式。

静态的应用:
每一个应用程序中都有共性的功能,可以将这些功能进行抽取,独立封装。以便复用。

静态代码块:

格式:
static
{
//代码
}
特点:随着类的加载而执行,但只执行一次,并优先于主函数和构造代码块。用于给类进行初始化的。
静态变量:
当分析对象中所具备的成员变量的值都是相同的,这时这个成员就可以被静态修饰。只要数据在对象中
都是不同的,就是对象的特有数据,必须存储在对象中,定义成静态的。
静态函数:
函数是否用静态修饰,就参考一点,就是该函数功能是否访问到对象中的特有数据。
静态函数只能访问静态方法或者静态变量。

-----------------------------------
Person p = new Person("zhangsan",20);
该句话:
1.因为new用到了Person.class。所以会先找到Person.class文件并加载到内存中。
2.执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
3.在堆内存中开辟空间,分配内存地址。
4.在堆内存中建立对象的特有属性。并进行默认初始化。
5.对属性进行显示初始化。
6.对对象进行构造代码块初始化。
7.对对象进行对应的构造函数初始化。
8.将内存地址赋给栈内存中的p变量。
-------------------------------------

6.单例设计模式
单例设计模式:解决一个类在内存只存在一个对象。

饿汉式

public Single()
{
	private Single(){}
	private static Single s = new Single();
	public static Single getInstance()
	{
		return s;
	}
}


懒汉式

public Single()
{
	private Single(){}
	private static Single s = null;
	public static Single getInstance()
	{
		if(s==null)
			s = new Single();
		return s;
	}
}


优化:

class Single
{
	private static Single s = null;
	private Single(){}
	public static Single getInstance()
	{
		if(s==null)
		{
			synchronized(Single.class)
			{				
				if(s==null)
					s = new Single();
			}
		}
		return s;
	}
}


7、值传递和引用传递的区别
值传递:
方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

------- android培训java培训、 java学习型技术博客、期待与您交流! ----------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值