面向对象

对象

  • 面向对象思想(Object Oriented Programming);
  • 一切客观存在的事物都是对象,万物皆对象。
  • 任何对象,一定具有自己的特征和行为。

程序中的对象

如何使用程序模拟现实世界,解决现实问题?

  • 首先,在程序当中,必须具有和现实中相同的对象,用以模拟现实世界。
  • 然后,使用程序中的对象代表现实中的对象,并执行操作,进而解决现实问题。
  • 现实中的对象多数来自于模板,程序中的对象也应该具有模板。

类的抽取

  • 在一组相同或类似的对象中,抽取出共性的特征和行为,保留所关注的部分。

package com.xu.first;

public class TestDog {

public static void main(String[] args) {
	// 创建一个对象,对象名为myDog
	Dog myDog = new Dog();
	// 属性赋值
	myDog.breed = "萨摩";
	myDog.age = 2;
	myDog.sex="公";
	myDog.furColor="白色";
	//获取属性值
	System.out.println(myDog.breed);
	System.out.println(myDog.age);
	System.out.println(myDog.sex);
	System.out.println(myDog.furColor);
	myDog.eat();
	myDog.sleep();
    
    package com.xu.first;
/**
 * 狗狗类
 * @author 【Bob】
 *
 */
public class Dog {
	//属性
	//品种
	String breed;
	//年龄
	int age;
	//性别
	String sex;
	//颜色
	String furColor;
	
	//方法
	//eat吃
	public void eat() {
		System.out.println("狗狗正在吃东西");
	}
	//sleep睡
	public void sleep() {
		System.out.println("狗狗正在睡觉呢");
	}

类与对象的关系

类:模板(一个) ——> 创建 对象:实例(多个)

  • 类:定义了对象应具有的特征和行为,类是对象的模板。
  • 对象:拥有多个特征和行为的实体,对象是类的实例。

实例变量

  • 思考:之前学习局部变量时,要求必须先赋值再使用,否则编译错误。对于实例变量而言,未赋值并不会编译错误,能否直接访问?

可以直接访问,实例变量的默认值:整数:0 小数:0.0 字符:\u0000 布尔:false 其它:full

实例变量与局部变量的区别

局部变量实例变量
定义位置方法或方法内的结构当中类的内部,方法的外部
默认值无默认值字面值(与数组相同)
使用范围从定义行到包含其结构结束本类有效
命名冲突不允许重名可与局部变量重名,局部变量优先

实例方法

对象的实例方法包含两部分:方法的声明和方法的实现。

  • 方法的声明:

    代表对象能做什么。

    组成:修饰符、返回值类型、方法名(形参列表)

  • 方法的实现:

    代表对象怎么做:即如何实现对应的功能。

    组成:{}

package com.xu.first;

public class Student02 {

	public static void main(String[] args) {
		//创建老师对象
		Teacher wang=new Teacher();
		wang.name="王老师";
		wang.age=35;
		wang.salary=50000;
		wang.sayHi();
		wang.know(50000);
		
	}
}
package com.xu.first;
/**
 * 老师类
 * 属性
 * name
 * age
 * salary
 * 方法
 * sayHi()
 * know(Student s);
 * @author 【徐先生】
 *
 */
public class Teacher {

	String name;//姓名
	int age;//年龄
	double salary;//工资
	
	public void sayHi() {
		System.out.println("同学们好,我是"+name+ "年龄:"+age);
	}
	public double know(double salary) {
		System.out.println("每月工资"+ salary);
		return salary;
	}
}

方法重载

  • 有些情况下,对象的同一种行为可能存在多种实现过程。

  • 例如:人对对象的吃行为,吃饭和吃药的过程就存在差异。

  • 重载(Overload):一个类中定义多个相同名称的方法。

  • 要求:

    方法名称相同。

    参数列表不同(类型,个数,顺序)。

    与访问修饰符,返回值类型无关。

  • 调用带有重载的方法时,需要根据传入的实参去找到与之匹配的方法。

  • 好处:屏蔽使用差异,灵活,方便。

package com.xu.first;
/**
 * 方法重载
 * ①方法名相同
 * ②参数列表不同(类型,个数,顺序)
 * ③和返回值,修饰符无关
 * @author 【徐先生】
 *
 */
public class Operation {

	public void show() {
		System.out.println("无参方法");
	}
	
	public void show(int num) {
		System.out.println("一个int类型参数:"+num);
	}
	
	public void show(String name) {
		System.out.println("一个String类型的参数"+name);
	}
	
	public void show(int num,String name) {
		System.out.println("两个参数String int"+name+"---"+num);
	}
}
package com.xu.first;

public class TestOperation {
	public static void main(String[] args) {
		//创建Operation
		Operation ope=new Operation();
		//调用方法
		ope.show();
		ope.show(100);
		ope.show("小张");
		ope.show(18,"小红");
		
	}
	
}

构造方法

  • 构造方法:类中的特殊方法,主要用于创建对象。

  • 特点:

    名称与类名完全相同。

    没有返回值类型。

    创建对象时,调用构造方法,不可通过句点调用。

  • 注意:如果没有在类中显示定义构造方法,则编译器默认提供无参构造方法。

package com.xu.two;

public class Student {

	// 属性
	// 姓名
	String name;
	// 年龄
	int age;
	// 性别
	char sex;
	// 分数
	double score;

	public Student() {
		System.out.println("无参构造方法执行");
		name = "xxxx";
		age = 28;
		sex='男';
		score=89;
	}

	public void say() {
		System.out.println("大家好,我是" + name + "年龄" + age + "性别" + sex + "分数" + score);

	}
}

构造方法重载

  • 构造方法也可重载,遵循重载规则。
package com.xu.two;

public class Student {

	// 属性
	// 姓名
	String name;
	// 年龄
	int age;
	// 性别
	char sex;
	// 分数
	double score;

	public Student() {
		System.out.println("无参构造方法执行");
		name = "xxxx";
		age = 28;
		sex='男';
		score=89;
	}
	
	public Student(String n,int a) {
		name=n;
		age=a;
		
	}
	public Student (String n,int a,char s,double sc) {
		name=n;
		age=a;
		sex=s;
		score=sc;
		
	}

	public void say() {
		System.out.println("大家好,我是" + name + "年龄" + age + "性别" + sex + "分数" + score);

	}
}

this关键字

  • 类是模板,可服务于此类的所有对象;
  • this是类中的默认引用,代表当前实例;当类服务于某个对象时,this则指向这个对象。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tNB1Ybl6-1616917220641)(C:\Users\【徐先生】\AppData\Roaming\Typora\typora-user-images\image-20210310223153929.png)]

this关键字

  • this第一种用法:调用实例属性,实例方法。如果成员变量和局部变量名相同,由于局部变量的优先级高,怎么访问实例变量?使用this

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GUiHVy1b-1616917220654)(C:\Users\【徐先生】\AppData\Roaming\Typora\typora-user-images\image-20210310235203502.png)]

  • this第二种用法:调用本类中的其他构造方法。如:this(),this(实参)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gMEdlWQW-1616917220657)(C:\Users\【徐先生】\AppData\Roaming\Typora\typora-user-images\image-20210311000801423.png)]

  • 减少代码的冗余

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rcoTtt0d-1616917220662)(C:\Users\【徐先生】\AppData\Roaming\Typora\typora-user-images\image-20210311002318877.png)]

封装

Encapsulation

  • 封装的必要性
public class TestEncapsulation{
    public static void main(String args){
        Student s1= new Student();
        s1.name="tom";
        s1.age = 20000;//在对象的外部,为对象的属性赋值,可能存在非法数据的录入。
        s1.sex = "male";
        s1.score = 100D;
    }
}
class Student{//如何在提供正常的对外访问渠道时,又能控制录入的数据为有效?
    String name;
    int age;
    String sex;
    double score;
}

什么是封装

  • 概念:尽可能隐藏对象内部的实现细节,控制对象的修改及访问的权限。
  • 访问修饰符:private (可将属性修饰为私有,仅本类可见)
public class Student {
	public static void main(String[] args) {
		Encapsulation e1 = new Encapsulation();

		e1.name = "张三";
		e1.setAge(130);
		e1.setSex("男");
		e1.score = 80.0;
		e1.sayHi();
package oop;
public class Encapsulation {
	String name;
	private int age;
	private String sex;
	double score;
	public void sayHi() {
		System.out.println("姓名"+this.name+"年龄"+this.age+"性别"+this.sex+"分数"+this.score);
	}
	//setAge()
	public void setAge(int age) {
		//判断
		if(age>0&&age<120) {
			this.age = age;
		}else {
			System.out.println("年龄不合法!");
		}
		}
	//getAge
	public int getAge() {
		return age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	
  • 赋值:setxxx() 使用方法参数实现赋值
  • 取值:getxxx() 使用方法返回值实现取值
  • get/set方法是外界访问对象私有属性的唯一通道,方法内部可以对数据进行检测和过滤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值