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() 根据自己的思路展示成员变量的值 注:在实体类内部,可以随意访问成员变量/方法,不受任何限制 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 + 鼠标左键单击(在想查看源码的地方) |