面向对象
面向对象三大特征
封装 (Encapsulation)
继承 (Inheritance)
多态 (Polymorphism)
**面向对象:**做某件事情不需要自己亲历亲为,只需指定特定的对象去完成即可。
一个思想:
万物皆对象!!!
类
什么是类?
具有相同点或者相同属性的事物的集合.
类是对一组有相同数据和相同操作的对象的定义,是对象的模板,其包含的方法和数据描述一组对象的共同行为和属性.类是在对象之上的抽象,对象则是类的具体化,是类的实例.类可以有子类,也可有其它类,形成类层级结构.
学生是一个类,而对象既是具体的每一个学生。
如果我现在说:学生类出来,有人会答应嘛?
但是如果我说:学生张三出来,那么张三就会知道在叫他。
属性: 描述该事物具有的信息。
行为:该事物能干什么。
注意:在Java中,类是最基本的单位,所有我们要学会用类描述事物。
事物 → 类
属性 → 成员变量
行为 → 成员方法
理解面向对象
题目:把大象装进冰箱
接下来让我们用面向对象的思想来分析一下:
1.都有哪些类?
类:大象类、冰箱类、OOPDemo
2.每个类中都有哪些行为(方法)
大象类:吃草、走路
冰箱类:开门、关门
OOPDemo:装大象的方法 main
3.类与类之间有怎么样的关系
public class ele{
public void eat(){
}
}
public class fri{
public void open(){}
public void close(){}
}
面向对象就是把现实问题抽象为对象,通过调用每个对象的属性或功能去解决问题。
对象
对象就是由数据(属性)和作用于数据的操作(行为)组成的封装体,描述客观事实的一个实体,是构成系统的基本单元.
创建对象的格式:
类名 对象名 = new 类名() ;
对象名.成员变量名 = 值; (跟成员变量类型一致); //成员变量:类中 ,方法外 成员方法(去掉static):和方法定义方法格式一样
对象名.方法名() ;调用方法,展示这个具体事物有什么功能
(在测试类里去创建)
//学生类
class Student{
//成员变量 类中,方法外
String name;//属性
int age;
String hobby;
//成员方法 类中 去掉static 普通方法是有static
public void study(){
system.out.println("好好学习")
}
}
封装
什么是封装?
封装就是将一个事物的属性私有化(对外界隐藏,private),保证数据的安全性
如果对外界想要访问或者修改值的话,就用对外提供成员访问的方法:setxxx(传参)/getxxx(),来对成员属性进行操作.
以后在描述或者书写事物的时候 全部私有化成员变量(属性)
private关键字的特点:
1)被private修饰的成员变量/成员方法(非静态),
只能在本类中访问,外界类不能访问!
2)虽然被私有修饰的成员变量以及成员方法(非静态)不能直接访问,但是
都可以间接的通过"public"公共访问访问!
进行封装:
①、将属性私有化,被private修饰,加入权限修饰符
②、提供public修饰的方法让别人来访问使用
③、即使外界可以通过方法来访问属性了,但是也不能随意访问,因为可以在方法中加入限制条件。
④、设置getter、setter方法,给别人提供访问的路径,idea快捷键:alt+insert键快速生成
/*
*封装演示
*/
public class Person {
/*
* 对属性的封装 一个人的姓名、性别和年龄都是这个人的私有属性
*/
private String name;
private String sex;
private int age;
/*
* setter()、getter()是该对象对外开放的接口
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
This的用法
采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突.
public void setAge(int age) {
if (age > 120) {
System.out.println("ERROR:error age input...."); // 提示错误信息
} else {
this.age = age;
}
}
public String getSexName() {
if ("0".equals(sex)) {
sexName = "女";
} else if ("1".equals(sex)) {
sexName = "男";
} else {
sexName = "人妖";
}
return sexName;
}
成员变量和局部变量
区别:
1)类中的书写位置不同
成员变量:在类中,方法外
局部变量:在方法定义中或者方法声明上
2)jvm内存位置不同
成员变量:在堆内存中
局部变量:在栈内存中
3)生命周期不同:
成员变量:随着对象的创建而存在,随着对象的创建完毕并且使用完
等待垃圾回收器回收(不会立即回收)而消失!
局部变量:随着方法调用而存在,随着方法调用结束而消失
4)初始化值不同:
成员变量:存在系统默认初始化,也可以显示初始化
局部变量:总之:在使用局部变量之前,必须赋值,不赋值不行!
//定义一个类Variable
class Variable{
//成员变量
int num ; //系统默认初始化就是0
public void show(String y){ //y
//int x = 100 ; //x 局部变量
int x ;
x = 100 ;
System.out.println(x+y) ;
}
}
//测试类
class VariableDemo{
public static void main(String[] args){
//访问show方法
//创建Variable类对象
Variable v = new Variable() ;
System.out.println(v.num) ;
v.num = 100 ;
System.out.println(v.num) ;
v.show("hello") ;
}
}
成员方法和构造方法
1.成员方法:
有返回值类型,最后需要return相应类型的值;
若返回值类型为void(无返回值),则可以不写return;
成员方法名和类名不能相同
//成员方法
public String getName() {//成员方法名和类名不能相同
return name;//有返回值
}
public void setName(String name) {
this.name = name;//无返回值
}
系统不会自动添加成员方法,需要什么成员方法根据特定的功能来写,主要是用于完成特定方法。
1.例如添加get和set方法
//成员方法
public String getName() {//成员方法名和类名不能相同
return name;//有返回值
}
public void setName(String name) {
this.name = name;//无返回值
}
2.例如添加动物关于吃的方法(吃只是随便例了一个动物的共有的方法)
普通成员方法是由创建好的对象调用,可以调用多次
public void eat(){
System.out.println("吃的方法");
}
PS:当类实例化一个对象时会自动调用构造方法,它和其他方法一样也可以重载。
2.构造方法:
一种特殊的方法,方法名和类名相同,没有返回值类型(没有return)
//无参构造方法
public Animal() {
}
如果没有写构造方法,系统会自动添加一个无参构造方法。
对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。
public class Test01 {
public static void main(String[] args) {
Animal animal = new Animal();//创建一个动物类对象时,有两个选择
}
}
在创建对象时被调用的,一个对象建立,只调用一次相应构造函数