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方法(栈)`执行完毕,程序退出
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bIm2zNzs-1686187958346)(photo/JavaSE06_面向对象之封装.assest/1664705217813.png)]](https://img-blog.csdnimg.cn/667ffd6b56e74bf280159db7ebb658bd.png)
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());}
}