经过15天的学习对类的知识学习的比较深刻,简单分享下
1. 类和对象
生活中所有的内容和事物,都可以用一个名词概括:东西
在Java中,所有的内容和事物,也都可以用一个名词概括:对象。
万物皆对象。
生活中 Java中
类别/种类 类 - class
东西(具体的某个东西) 对象 - Object
属性:有什么参数 成员变量
行为:能干什么 成员方法
生活中:类别和东西的关系
类别是东西的抽象 //界门纲目科属种
东西是类别的实体
Java中:类和对象的关系
类是对象的抽象
对象是类的实体
类的特点:
类是具有相同属性和行为的一类事物的集合/抽象。
类是对象的数据类型
eg:int 1
人 张三
面向对象
面向对象是一种思想,一种解决问题的思路
面向过程:只关注解决问题的过程,而不关注多个解决方法之间的关系等
面向对象:在寻找解决方案前,先找对象(能解决我问题的对象),让对象来帮我拿出解决方案
面向过程:关注的是解决问题的具体思路
面向对象:关注的是能解决该类问题的对象
2. 类的定义之成员变量和成员方法
事物都有固有的属性,在Java中称之为成员变量,定义在类里面方法外面(局部变量定义在方法里面)
事物都有一些行为,在Java中称之为成员方法,成员方法没有static关键字修饰
类定义的格式:
public class 类名{
成员变量;
数据类型 成员变量名1;
数据类型 成员变量名2;
成员方法(没有static关键修饰的方法,其他与之前方法的定义格式都一样):
public 返回值类型 成员方法名1(){……}
public 返回值类型 成员方法名2(){……}
}
大驼峰(类):第一个单词首字母大写,后面的每个单词首也字母大写
小驼峰(方法、变量):第一个单词首字母小写,后面的每个单词首也字母大写
3. 对象/类的使用
需要定义一个测试类,测试类中有main方法(程序的入口),
在main方法中通过创建被测试类的对象来使用其成员变量和成员方法。
对象创建格式:
类名 变量名/对象名 = new 类名();
Scanner sc = new Scanner(System.in);
Random r = new Random();
Phone p = new Phone();
成员的使用方法:
对象名.成员(成员变量和成员方法)
sc.nextInt(); --调用Scanner的成员方法
r.nextInt(); --调用Random的成员方法
Phone p = new Phone();
p.brand = "华为"; //成员变量的使用
4. 对象的内存图
直接打印对象,打印的是对象的地址值
System.out.println(s); //com.itheima_03.Student@f6d7a8
[I@a9d2c4
[ 数组
[[ 二维数组
I 数组中元素类型(如果是引用数据类型,前面会加一个L,然后类型是完整的类型名<包含包名和类型>)
9d2c4 内存中地址值(16进制的hash值)
com.itheima_03.Student@f6d7a8
com.itheima_03.Student 完整的类型名(完整的类名<包名和类名>)
f6d7a8 内存中地址值(16进制的hash值)
对象的引用 存在栈内存中,其值是所指向对象的地址值(对象引用就是指向该对象的变量)
对象本身 存在堆内存中,对象中成员变量的值有默认初始化值
int 0
String null
main方法执行的时候首先进栈,main方法中调用的其他方法,被调用的时候进栈,调用结束后就弹栈(结束)。
多个对象的成员方法相同,但是成员变量却独立拥有。
结论:
多个引用指向同一个对象,通过任何一个引用修改对象内容/值,其他引用对应内容或值会同时发生改变。
引用个数 对象个数
情况一 1 1 一个引用指向一个对象,通过引用可以修改/使用对象
情况二 2 2 两个引用分别指向了自己的对象,通过每个引用只能
修改自己指向的对象,不会影响另外一个对象
情况三 2 1 两个引用指向了同一个对象,可以理解成为
该对象起了两个名字,任意一个名字就可以直接修改/使用对象。
对象被修改后,通过任意一个名字读取该对象,结果值都是修改过的。
5. 成员变量和局部变量的区别
成员变量:定义在类中方法外的变量
局部变量:定义在方法内或者方法声明上的变量
区别: 成员变量 局部变量
定义位置 见上
内存中位置 堆内存中 栈内存中
初始化值 有默认初始化值 没有默认初始化值,必须先定义、赋值后,才能使用
生命周期 随着对象的创建而创建 随着方法的调用(进栈)而创建
随着对象的消失而消失 随着方法的调用结束(弹栈)而消失
成员的定义没有顺序,因为执行顺序由调用的顺序决定。
6. private
是一个访问权限修饰符
能修饰成员(成员变量和成员方法)
作用:保护成员不被外界直接访问。被private修饰的成员只能在本类中被直接访问
其他类中想要使用该程序员,就需要通过制定的方法来使用
设置值:public void set变量(形式参数){} 通过该方法设置成员变量的值
获取值:public 返回值类型 get变量() 通过该方法可以获取成员变量的值
为了安全起见,我们可以在set方法中(setter)进行判断限定
但是,一般不建议这样做:
javabean - 实体类 实体类一般只包含基本的成员变量和变量的getter/setter,
这里的setter和getter最好是标准的,没有任何修改的。
-30的年龄是属于业务逻辑问题,就业务逻辑层做判断排除,实体类一般用作实例化对象并且存储该对象的数据
编码思想:
高内聚,低耦合
一个方法只干一件事
age 设置age --setAge(int a) == s.name = 10
获取age值 --int getAge() == s.name
实体类外获取|设置实体类成员变量的方式
第一种(成员变量的访问权限修饰符不能是private)
设置 s.name = 值
获取 s.name
第二种(成员变量被private修饰后,因为被private修饰后,外界不能直接访问该成员)
设置s.setName(值)
获取 s.getName()
这种方式是java推荐的,建议重点掌握
第三种(非标准类成分,只能获取不能设置)
show()
根据自己的思路展示成员变量的值
注:在实体类内部,可以随意访问成员变量/方法,不受任何限制
使用idea编辑器时,使用getter \setter方法可以使用编辑器快捷键:ALT+insert
7. this关键字
this用于指代成员变量
当方法中局部变量和成员变量不重名时,不需要使用this
当方法中局部变量和成员变量重名时,需要在成员变量前面添加this关键字。解决的是局部变量隐藏成员变量的问题,没有该问题也可以使用this,但是没有意义。
this代表的是当前对象
谁调用当前方法,当前方法内的this只得就是谁。
8. 封装
面向对象三大特征:封装、继承、多态
封装的原则:
将成员变量私有化,避免外部程序直接访问,可以通过指定的公共方法访问(getter、setter)
封装的好处:
成员变量不能被直接访问,提高了代码的安全性
使用方法进行操作,提高了代码的复用性
9. 构造方法
构造方法是一个特殊的方法
自己定义的类,要想其他人能用,要创建对象,就必须创建构造方法。
没有参数的构造方法一般称为无参构造
public Student(){}
有参数的构造方法一般称为有参构造
public Student(String name, int age){
this.name = name;
this.age = age;
}
格式:
访问权限修饰符 类名(参数 列表){}
一般方法定义格式:访问权限修饰符 (其他修饰符) 返回值类型 方法名(参数列表){}
功能:
在创建对象的时候对对象进行初始化操作
什么时间被调用
在创建对象的时候被调用
构造方法无返回值类型,方法名与类名相同。
10. 构造方法使用注意事项
a. 如果没有手动书写构造方法,系统会默认提供一个无参构造。
b. 但凡是手动写了任意一个构造方法,系统将不再提供默认无参构造。
c. 构造方法之间可以重载
d. 系统根据提供的参数列表决定调用某一个构造方法,没有对应的构造方法则会报错
推荐书写方式:
不管在任何时候,先手动书写一个无参构造
11. 面试题
什么是面向对象?
面向对象是Java里面的一个非常优秀的编程思想,区别于面向过程的思想,面向对象的思想更符合生活的思考方式。
面向对象不只关注与解决问题是细节,更多的是关注能够解决问题的对象,以及对象的属性、行为。这种方式更贴近实际,对于维护大型项目或者复杂逻辑非常有用。
面向对象有方便、高效的优势,比方说:父亲让儿子削苹果的例子。
面向对象有三大特征:
封装、继承、多态
分开阐述三大特征
11. 怎么定位源码
按住Ctrl + 鼠标左键单击(在想查看源码的地方)
|
|