对象
- 面向对象思想(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则指向这个对象。
this关键字
- this第一种用法:调用实例属性,实例方法。如果成员变量和局部变量名相同,由于局部变量的优先级高,怎么访问实例变量?使用this
- this第二种用法:调用本类中的其他构造方法。如:this(),this(实参)
- 减少代码的冗余
封装
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方法是外界访问对象私有属性的唯一通道,方法内部可以对数据进行检测和过滤。