——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
此版块包含的知识点较多:
- 面向对象概述
- 类与对象关系
- 局部变量与成员变量
- 匿名对象
- 封装概述(好处、原则)
- Java中的四种权限(private、public、默认、protected)
- 构造函数、构造代码块
- this关键字(应用、在函数间调用、this语句)
- static关键字(main函数、什么时候用、静态代码块、工具类)
- 对象初始化过程
面向对象是相对面向过程而言的。
面向对象和面向过程都是一种思想。
面向过程强调的是功能行为。
面向对象将功能封装进对象,强调具备了功能的对象
面向对象是基于面向过程的。
以大象放入冰箱的例子
面向过程:
1.打开冰箱 打开
2.把大象放进冰箱 存储
3.把冰箱门关上 关闭
强调的是过程当中所涉及的行为也就是功能。
面向对象:
1.冰箱.打开
2.冰箱.存储
3.冰箱.关闭
强调的是具备功能的对象
面向对象将复杂问题简单化,将功能封装,我们的角色由执行者转变为指挥者。
面向对象开发其实就是在找对象使用,没有对象就创建一个对象。找对象、建立对象、使用对象、维护对象关系就是以后我们要做的工作。
面向对象比较禅道的说法:万物皆对象。
面向对象三大特性:封装、继承、多态
类和对象的关系:
类就是对现实生活中事物的描述。
对象就是这类事物实实在在存在的个体。通过new操作符产生。在堆内存中。
局部变量和成员变量的区别
局部变量定义在方法或语句中,成员变量定义在方法或函数外边
区别:成员变量作用于整个类中,存放在堆内存中;
如果未初始化成员变量,系统会自动初始化。规则如下:
数字:0 布尔:false char:\u0000 引用类型:null
局部变量作用于函数或语句中,存放在栈内存中。
使用时,必须手动初始化
匿名对象:
匿名对象是对象的简化形式。
匿名对象的两种使用情况:
1.当对对象方法仅进行一次调用时
2.匿名对象可以作为实际参数进行传递
面向对象特性–封装
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
好处:将变化隔离、便于使用、提高安全性、提高重用性。
原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。
函数、类、包、框架、private等都是Java封装的形式。
封装的一种实现方式:使用private关键字
private私有 权限修饰符,修饰类中成员(成员函数或成员方法)
之所以提供访问方式,就是因为可以在访问中加入逻辑判断语句对访问的数据进行操作,提高代码健壮性。
private只在本类中有效。
Java中的四种权限修饰符:
Java有四种访问权限, 其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符。
private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。
default:即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,只允许在同一个包中进行访问。如果不在同一个包内,子类无法访问到父类默认修饰的成员。
protect: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。
构造函数:
特点:
1.函数名与类名相同
2.不用定义返回值类型
3.不可以写return语句
作用:
给对象初始化
一个类中如果不定义构造函数、系统会默认提供一个空参数的构造函数,如果自定义了,默认的构造函数就没有了。可以定义多个构造函数重载。
什么时候定义构造函数呢?
当分析事物时,该事物存在具备了一些特性或行为,那么将这些内容定义在构造函数中。需不需要位未知内容参与运算,需要就定义参数。
构造函数与普通函数的区别:
写法上:
构造函数的名称与类名相同
构造函数不需要定义返回值类型
构造函数不可以写return语句语句
运行上:
构造函数是在对象一建立就运行,给对象初始化。
普通函数是对象调用才执行,给对象添加对象具备的功能。
一个对象建立构造函数只能运行一次,普通函数可以被对象调用多次
构造代码块:
形式
class Person
{
{} //构造代码块
person (){}//构造函数
}
作用:给对象进行初始化,对象一建立就运行,且优先于构造函数运行。
与构造函数的区别:构造代码块是给所有对象同一初始化,构造函数是给对应对象初始化。
eg:有的孩子一出生就有名字有的没有,但是每个孩子一出生就哭,那么哭就定义在构造代码块中。
构造代码块中定义的是对象共性的初始化内容。
this关键字:
this代表它所在函数所属对象的引用。
简单来讲,就是哪个对象调用了this所在的函数this就代表哪个对象。this关键字用于区分局部变量和成员变量同名的情况。
应用:
在定义类中功能时,该函数内部要用到调用该函数的对象时,这时用this表示这个对象,但凡本类功能内部使用到了本类对象,都用this表示。
this()
this语句 用于构造函数之间的互相调用。
this语句只能定义在构造函数的第一行。因为初始化要先执行
class Person
{ private String name;
person()
{
System.out.println("haha");
}
person(String name)
{
this();
this.name=name;
}
}
static关键字:
static关键字用于修饰成员(成员函数或成员变量)
成员被static修饰后,就多了个调用方式,除了可以被对象调用以外,还可以被类名调用。类名.静态成员。
特点:
1.随着类的加载而加载
随着类的消失而消失,生命周期最长
2.优先于对象存在
静态先存在,对象后存在
3.被所有的对象所共享
4.可以直接被类名调用
实例变量和类变量的区别:
1.存放位置
类变量随着类的加载而存放在方法区中
实例变量随着对象的建立而存放于对内存中
2.生命周期:
类变量生命周期最长,随着类的消失而消失
实例变量生命周期随着对象的消失而消失。
静态使用注意事项:
1.静态方法只能访问静态成员
非静态方法即可以访问静态也可以访问非静态
2.静态方法中不可以定义this,super关键字
因为静态优先于对象存在,所以静态方法中不可以出现this
3.主函数是静态的
静态有利有弊
利处:对对象的共享数据进行单独空间的存储,节省空间。没必要每个对象都存储一份
可以直接被类名调用
弊端:生命周期过长
访问出现局限性(静态只能访问静态)
静态什么时候使用?
从两方面下手:
因为静态修饰的内容有成员变量和函数。
什么时候定义静态变量呢?
当对象中出现共享数据时,该数据被静态所修饰
对象中的特有数据要定义在非静态存在于堆内存中
什么时候定义静态函数呢?
当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。
主函数:
public static void main(String[] args)
主函数,是一个特殊的函数。作为程序的入口,可以被jvm调用。
主函数的定义 :
public:代表着该函数访问权限是最大的
static:代表主函数随着类的加载就已经存在了。
void:主函数没有具体的返回值
main:不是关键字,但是是一个特殊的单词,可以被jvm识别
(String[] arr):函数的参数,参数类型是一个数组,该数组中的元素是字符串,字符串类型的数组。
对象的初始化过程:
以Person类为例:
class Person
{
private static String country="cn";
private String name="haha";
private int age;
Person(String name,int age)
{
this.name=name;
this.age=age;
}
Person(){}
{
System.out.println(name+"..."+age);
}
public void speak(){
System.out.println(name+"...."+age);
}
public void setName(String name)
{
this.name=name;
}
public static void showCountry()
{
System.out.println("country="+country);
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p=new Person("zhangsan",50);
p.saeName("lisi");
}
}
/*
Person p=new Person("zhangsan",50);
这句话都执行了那些动作呢?
1.new 用到了Person.class;所以会先找Person.class文件并加载进内存;
2.如果有static代码块应该先执行静态代码块,给Person.class类进行初始化;
3.在堆内存中开辟内存空间,分配内存地址
4.在堆内存中建立对象特有属性,并进行默认初始化;
5.对属性进行显示初始化
6.对对象进行构造代码块初始化
7.对对象进行对应构造函数初始化
8.将内存地址付给栈内存中的p变量
*/