java学习-day02
- 面向对象
- 面向对象的基本概念
- 面向对象vs面向过程
- 参数传递
- 基本数据类型传递
- 引用数据类型传递
- String的参数传递
- 构造函数
- 构造函数重载
- 构造函数重载的应用:类的属性初始化
- 构造函数补充:
- this关键字的使用
- this调用属性
- this调用构造函数
- 变量的作用域
- 封装
- 1、为什么要封装
- 2、如何实现封装
- 3、被封装的数据如何使用?
- 方法重载
- 回归
- 方法重载
- 方法重载的调用
面向对象
面向对象的基本概念
什么是类
对象的抽象,分类,聚类,我们称之为类! 比如说人类、植物、动物。
什么是对象
对象是万物皆对象。比如一个人,一朵花,一头驴
类和对象的关系
类是创建对象的模板,就好比类是设计图,根据设计图我们可以生产出很多产品,二产品是对象。
对象的特性
包含属性、操作。以人为例:姓名、身高这些叫做属性也是就特征,吃饭、睡觉、逛街这些叫做操作(方 法)。 可以把名词当作是属性、动词是方法。
举例:
一个同学做自我介绍:我叫小明,性别男,今年18岁,无女朋友
人
姓名:小明
年龄:18
是否有女朋友:无
一个自我介绍的功能
代码实现
class Person
{
String name="小明";
int age = 18;
boolean hasGrilFriend = false;
public void show() {
// TO DO 自我介绍的实现
System.out.println(name+"\t"+age);
}
}
1、如何创建对象 : 通过new关键字
2、如何调用属性: 对象名.属性名
3、如何调用方法:对象名.方法名([参数列表])
public static void main(String [], args) {
// 通过new创建了一个p1对象
Person p1 = new Person();
p1.show();
// 通过new创建了一个p2对象
Person p2 = new Person();
p2.name = "小王";
p2.age = 20;
p2.hasGrilFriend = true;
p2.show();
}
面向对象编程,就是吧关注点放在对象上,对象有什么属性,对象能做什么 等等。
面向对象vs面向过程
需求
小明需要一台电脑
面向过程
通过面向过程的方式来处理,那么小明则需要自己去买主板、CPU等配件。回来自己组装一台电脑。
面向对象
小明找到了一个卖电脑的,告诉他需要什么样配置的电脑!至于说电脑的组装细节小明不需要关心,只要最终拿到向要的配置电脑就可以了。
面向对象的过程中使用者不必知道其中的细节。
而java语言作为面向对象语言,因为JDK给我们提供了强大的开发工具包,很多开发中的功能可以直接从java的JDK中调用。
参数传递
基本数据类型传递
基本数据类型的传递,传递的是值。String作为一个特殊的引用数据类型,其传递方式和基本数据类型一样
引用数据类型传递
引用数据类型的传递,传递的是内存地址,传递的是引用,改变的是指向
String的参数传递
备注:字符串是一个特殊的引用数据类型,他在参数的传递过程是依赖于基本数据类型的规则。
构造函数
构造函数的概念
构造函数重载
构造函数重载的应用:类的属性初始化
构建一个User.java
编写Test.java测试
测试结果
构造函数补充:
一个被创建的时候会有一个默认的无参的构造函数。如果一个类中的构造函数被显示的写出来,那么这个类的无参的构造函数将不再存在。如果需要使用的话必须将无参的构造函数也写出来。
解决问题:
this关键字的使用
1、通过this调用属性的方法
2、this调用构造函数,this只能在构造函数中调用构造函数,必须是第一行
this调用属性
调用
测试结果
this调用构造函数
测试类
测试结果
变量的作用域
变量的分类、划分:
按照作用域划分:全局变量、局部变量
按照类型:成员变量(实例变量) 、局部变量
成员变量、实例变量
我们将new出来的一个对象叫做一个类的成员、也可以叫做一个类的实例
例子:
例子:
统计在线用户:我们需要定义一个变量来接受用户的数量
第一种方式
public class Test {
public void increase(int count){
count = count+1;
}
public void decrease(int count){
count = count-1;
}
public static void main(String[] args) {
Test t = new Test();
//定义一个用户上下线的变量来接受用户的数量
int count = 0;
//假设输入Y 表示用户上线 输入N 表示下线
Scanner sc = new Scanner(System.in);
String input = null;
while (true){
input = sc.next();
if(input.equals("Y")){
t.increase(count);
}
if(input.equals("N")){
t.decrease(count);
}
System.out.println("在线用户:"+count);
}
}
}
从上面代码的输出结果,我们发现是有问题的。因为count是基本数据类型increase、decrease的改变并没有对count生效
改造代码:使用一个对象来封装这个count、将count定义为这个对象的成员变量
public class Counter {
int count;
}
public class Test {
public void increase(Counter count){
count.count++;
}
public void decrease(Counter count){
count.count--;
}
public static void main(String[] args) {
Test t = new Test();
//定义一个用户上下线的变量来接受用户的数量
Counter count = new Counter();
count.count=0;
//假设输入Y 表示用户上线 输入N 表示下线
Scanner sc = new Scanner(System.in);
String input = null;
while (true){
input = sc.next();
if(input.equals("Y")){
t.increase(count);
}
if(input.equals("N")){
t.decrease(count);
}
System.out.println("在线用户:"+count.count);
}
}
}
封装
1、为什么要封装
封装的目的是保护数据,将设计者和使用这分开!
2、如何实现封装
一个类中的属性和方法如果不想被外部直接调用,可以通过private关键字来修饰。封装的实现就是通过private关键字。
通过封装的手段来保护数据、
3、被封装的数据如何使用?
第一种:构造函数传参
第二中:set/get方法(桥)
好处:可以任意组合,弱耦合
public class User {
private String name;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public User(int age) {
this.age = age;
}
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 Test {
public static void main(String[] args) {
User user = new User();
user.setName("jack");
user.setAge(20);
System.out.println(user.getName() + "\t" + user.getAge());
}
}
方法重载
回归
构造方法重载:方法名和类名相同、没有返回值叫做构造方法。构造方法可以有多个,多个构造方法之间参数列表不同(参数的个数、顺序、类型),叫做构造方法重载。
方法重载
在同一个类中、方法名相同、参数列表不同(参数的个数、顺序、类型),于返回值无关。叫做方法重载。
场景1
场景2
场景3
场景4
综合
常见的错误写法:
方法重载的调用
补充说明:方法重载是面向对象一个很重要的特性,是多态的一种体现!