java学习-day02

个人曾经学习java的一些记录,仅供参考

面向对象

面向对象的基本概念

什么是类

对象的抽象,分类,聚类,我们称之为类! 比如说人类、植物、动物。

什么是对象

对象是万物皆对象。比如一个人,一朵花,一头驴

类和对象的关系

类是创建对象的模板,就好比类是设计图,根据设计图我们可以生产出很多产品,二产品是对象。

对象的特性

包含属性、操作。以人为例:姓名、身高这些叫做属性也是就特征,吃饭、睡觉、逛街这些叫做操作(方 法)。 可以把名词当作是属性、动词是方法。

举例:
一个同学做自我介绍:我叫小明,性别男,今年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
在这里插入图片描述

综合

在这里插入图片描述

常见的错误写法:
在这里插入图片描述


在这里插入图片描述

方法重载的调用

在这里插入图片描述

补充说明:方法重载是面向对象一个很重要的特性,是多态的一种体现!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值