JavaSE-06 [面向对象+封装]
第一章 面向对象思想
1.1 面向过程和面向对象
面向过程: 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了 面向对象: 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为 总结
都是解决问题的思维方式,都是代码的组织方式 解决简单问题可以使用面向过程 解决复杂问题,宏观上使用面向对象把握,微观处理上仍然使用面向过程处理
面向对象编程的三大特征(抽象)
封装:需要让用户知道的暴露出来,不需要用户知道的隐藏起来,这就是封装–“该露的露,该藏的藏” 继承:一方面,继承的本质是对某一批类的抽象,从而实现对现实世界更好的封装。另一方面,代码的重用 多态:为了提高处理问题的灵活性,原始的抽象的事务,可以出现多种不同的形态展现
1.2 类和对象
类: 类是一组相关属性和行为的集合,
可以看成是一类事物的模板,
使用事务特征和行为特征来描述该类事物
现实中,描述一类事物
属性:就是事物的状态信息
行为:就是事物的功能
对象:对象是一类事物的具体体现,对象是类的一个实例,
必然具备该事物的属性和行为
现实中,一类事物的一个实例,就是一个对象
关系:
1、类可以看做是一个模板,或者图纸,
系统根据类的定义来创造出对象
2、类是对一类事物的描述,是抽象的
3、对象是一类事物的实例,是具体的
1.3 类的定义
类是现实世界的一类事物
属性:事物的状态信息
行为:事物的功能和作用
Java中用Class描述事物也是如此
成员变量:对应事物的属性
成员方法:对应事物的行为
定义类:
就是定义类的成员,包括成员属性和成员方法
成员变量的位置:
定义在类中,方法外
成员方法的位置:
定义在类中,与之前的方法不一致的是,去掉了static
public class 类的名称{
}
public class Student {
String name;
int age;
String address;
public void study ( ) {
System . out. println ( "好好学习" ) ;
}
public void paly ( ) {
System . out. println ( "多运动多锻炼" ) ;
}
public void sleep ( ) {
System . out. println ( "中午午休" ) ;
}
}
1.4 对象的使用
一般情况下,一个类并不能直接使用,需要根据类创建一个对象才能使用
创建对象的步骤:
- 1 、导包:指出使用的类存放的位置, 如果在同包中,导包省略
- 2 、创建:类名称 对象名 = new 类名称( ) ;
- 3 、使用:两种情况
- 使用成员变量:对象名. 成员变量;
- 使用成员方法:对象名. 成员方法( ) ;
注意事项
- 如果成员变量没有赋值,那么就会出现默认值
- 整数类型的默认值是0 ,引用数据类型的默认值是null
* *
* 对象的使用:
* 一般情况下,一个类并不能直接使用,需要根据类创建一个对象,才能使用
* 创建对象步骤:
* 1 、导包:指出使用的类存放的位置, 如果在同包中,导包省略
* 2 、创建:类名称 对象名 = new 类名称( ) ;
* 3 、使用:两种情况
* 使用成员变量:对象名. 成员变量;
* 使用成员方法:对象名. 成员方法( ) ;
* 注意事项:如果成员变量没有赋值,那么就会出现默认值,
* 整数类型的默认值是0 ,引用数据类型的默认值是null
* /
public class StudentTest {
public static void main ( String [ ] args) {
Student stu1 = new Student ( ) ;
System . out. println ( stu1. name) ;
System . out. println ( stu1. age) ;
System . out. println ( stu1. address) ;
System . out. println ( "------------------------" ) ;
stu1. name= "Tom" ;
stu1. age= 33 ;
stu1. address= "北京" ;
System . out. println ( stu1. name) ;
System . out. println ( stu1. age) ;
System . out. println ( stu1. address) ;
stu1. study ( ) ;
stu1. paly ( ) ;
stu1. sleep ( ) ;
}
}
1.5 类与对象的练习
public class Computer {
String brand;
double price;
String color;
public void playGame ( ) {
System . out. println ( "电脑可以打游戏!" ) ;
}
public void lookMovie ( ) {
System . out. println ( "电脑可以看电影!" ) ;
}
public void chart ( ) {
System . out. println ( "电脑可以聊天!" ) ;
}
}
public class ComputerTest {
public static void main ( String [ ] args) {
Computer computer = new Computer ( ) ;
System . out. println ( computer. brand) ;
System . out. println ( computer. price) ;
System . out. println ( computer. color) ;
computer. brand = "华为" ;
computer. price = 5000.0 ;
computer. color = "pink" ;
System . out. println ( computer. brand) ;
System . out. println ( computer. price) ;
System . out. println ( computer. color) ;
computer. playGame ( ) ;
computer. lookMovie ( ) ;
computer. chart ( ) ;
}
}
1.6 对象内存图理解
- 对象内存图理解:
- 1 、先加载Computer 类信息`:属性与方法
- 2 、进行默认初始化,再显示初始化(double price = 5000.0 )
最后执行构造方法初始化`
- 3 、把堆中的地址赋给computer,computer就指向对象,
computer是对象的引用`,或者叫对象名
- 4 、当执行到方法时,就会开辟独立的空间(栈)`
- 5 、方法执行完毕/ 执行到return 就会返回到调用方法的地方`
- 6 、继续执行后续代码
- 7 、当main方法(栈)`执行完毕,程序退出
1.7 成员变量和局部变量
- 1、定义的位置不一样
- 局部变量:定义在方法的内部
- 成员变量:定义在类的内部,方法的外部
- 2、作用域不一样
- 局部变量:只有在方法中才能使用,出了方法不能使用
- 成员变量:在整个类中通用
- 3、默认值不一样
- 局部变量:没有默认值,必须手动赋值
- 成员变量:默认会有初始值
- 4、内存的位置不一样
- 局部变量:存储在栈内存
- 成员变量:存储在堆内存
- 5、生命周期不一样
- 局部变量:随着方法的进栈而诞生,随着方法的出栈而消失
- 成员变量:随着对象被创建而诞生,随着对象被垃圾回收器回收被销毁
public class VariableDemo01 {
String username;
public void sleep ( ) {
int num;
int num1 = 20 ;
System . out. println ( num1) ;
System . out. println ( username) ;
}
public void eat ( int num2) {
System . out. println ( num2) ;
}
}
第二章 封装
2.1 封装的定义
封装就是把属于同一类事物的共性放到一个类中,
将不需要对外提供的内容都隐藏起来、
把属性都隐藏,提供公共方法对其访问。
将变化隔离、便于使用、提高重用性、提高安全性
将不需要对外提供的内容都隐藏起来、
把属性都隐藏,提供公共方法对其访问
2.2 private关键字
private关键字:
1、private是用于对需要保护的成员变量进行修饰。
2、一旦使用private关键字,在本类当中仍可以随意访问,
但是在本类之外就不能访问。
3、如果想访问private关键字修饰的成员变量,
就需要定义一对setter/和getter方法
注意事项:
- 方法名:必须使用setXxx或者getXxx命名规则
- 对于getter来说,不能有参数,返回值类型和成员变量对应
- 对于setter来说,不能有返回值,参数类型和成员变量对应
- 对于基本数据类型的boolean型,setter方法同上,
但是获取的方法是使用isXxx()
public class Person {
String name;
private int age;
public void info ( ) {
System . out. println ( name+ ":" + age) ;
}
public void setAge ( int age) {
if ( 0 <= age && age>= 100 ) {
this . age = age;
} else {
System . out. println ( "输入的年龄错误" ) ;
}
}
public int getAge ( ) {
return age;
}
}
public class Demo01_Private {
public static void main ( String [ ] args) {
Person p = new Person ( ) ;
p. name = "张曼玉" ;
p. setAge ( - 22 ) ;
System . out. println ( p. getAge ( ) ) ;
}
2.3 this关键字
- 1、当方法的局部变量和类的成员变量名称相同时,
就遵循就近原则,优先使用局部变量
- 2、如果必须使用成员变量,则需要使用this关键字,
即:this.成员变量
- 3、this关键字:指向调用方法的对象,
即通过谁调用的方法,this就是谁
public class Student {
String name;
public void sayName1 ( String str) {
System . out. println ( name + "---" + str) ;
}
public void sayName2 ( String name) {
System . out. println ( name+ "===" + name) ;
}
public void sayName3 ( String name) {
System . out. println ( this . name+ "+++" + name) ;
System . out. println ( this ) ;
}
}
public class Demo01_This {
public static void main ( String [ ] args) {
Student s1 = new Student ( ) ;
s1. name = "巩俐" ;
s1. sayName1 ( "章子怡" ) ;
s1. sayName2 ( "关之琳" ) ;
s1. sayName3 ( "邱淑贞" ) ;
System . out. println ( s1) ;
}
}
2.4 构造方法
1、是用来专门创建对象的方法
2、当我们通过关键字new来创建对象时,
其实就是在调用构造方法
public 类名称( ) {
}
public 类名称( 参数类型 参数名, 参数类型 参数名) {
方法体;
}
1、构造方法的名称必须和类的名称一致,包含大小写一致
2、构造方法不需要写返回值类型,包括void
3、构造方法没有返回值
4、如果没有声明任何构造方法,
编译器会默认提供一个无参数的构造方法供使用
5、一旦编写任意构造方法,编译器将不提供无参构造方法
6、如果已经创建有参构造,那么无参构造默认不存在,
需要手动定义无参构造
public class User {
private String name;
private int age;
public User ( ) {
System . out. println ( "无参构造方法执行了" ) ;
}
public User ( String name, int age) {
this . name = name;
this . age = age;
System . out. println ( "有参构造方法执行了" ) ;
}
public String getName ( ) {
return name;
}
public void setName ( String name) {
this . name = name;
}
public int getAge ( ) {
return age;
}
public void setAge ( int age) {
this . age = age;
}
}
public class Demo01_ConstructorTest {
public static void main ( String [ ] args) {
User u1 = new User ( ) ;
u1. setName ( "周海媚" ) ;
u1. setAge ( 22 ) ;
System . out. println ( u1. getName ( ) ) ;
System . out. println ( u1. getAge ( ) ) ;
System . out. println ( "--------------------" ) ;
User u2 = new User ( "邵美琪" , 22 ) ;
System . out. println ( u2. getName ( ) ) ;
System . out. println ( u2. getAge ( ) ) ;
}
}
2.5 定义标准的类
- 1、所有的成员变量都需要使用private关键字修饰
- 2、为每一个成员变量编写一对setter和getter方法
- 3、编写一个无参数的构造方法
- 4、编写一个全参数的构造方法
- 5、这样标准的类,也叫作JavaBean(Java豆子)
public class Student {
private String username;
private int age;
private String address;
public Student ( ) {
}
public Student ( String username, int age, String address) {
this . username = username;
this . age = age;
this . address = address;
}
public String getUsername ( ) {
return username;
}
public void setUsername ( String username) {
this . username = username;
}
public int getAge ( ) {
return age;
}
public void setAge ( int age) {
this . age = age;
}
public String getAddress ( ) {
return address;
}
public void setAddress ( String address) {
this . address = address;
}
}
public class Demo01_StudentTest {
public static void main ( String [ ] args) {
Student s1 = new Student ( ) ;
s1. setUsername ( "古力娜扎" ) ;
s1. setAge ( 22 ) ;
s1. setAddress ( "新疆" ) ;
System . out. println ( "姓名是:" + s1. getUsername ( ) + ",年龄是:" + s1. getAge ( ) + ",籍贯是:" + s1. getAddress ( ) ) ;
System . out. println ( "-------------------------------" ) ;
Student s2 = new Student ( "迪丽热巴" , 18 , "新疆" ) ;
System . out. println ( "姓名是:" + s2. getUsername ( ) + ",年龄是:" + s2. getAge ( ) + ",籍贯是:" + s2. getAddress ( ) ) ;
s2. setAge ( 19 ) ;
System . out. println ( "姓名是:" + s2. getUsername ( ) + ",年龄是:" + s2. getAge ( ) + ",籍贯是:" + s2. getAddress ( ) ) ;
}
}