一 类和对象的概念
1.对象
在Java中,对象具有属性和方法.属性为对象的一般特征(抽象描述),方法为对象的一些行为.(对象是由类创建出来的具体的事物)
例如用对象描述一个程序员
属性: 姓名 性别 年龄
方法(行为): 吃饭,睡觉,敲代码
2.类
java中最基本的单位就是类.类是一堆抽象事物的描述(模板).也可以说类是具有相同属性和方法(行为)的一组对象的集合.当然,类也具有属性和方法.
3.类与对象的关系
可以说类是一组具体事物的相同特征(属性)和行为(方法)的抽象描述,而对象即为类中的每一个具体事物.
二 面向对象概念以及好处
1.面向过程
说面向对象之前先大致理解下面向过程.见名知意,面向过程的重点就在过程中,比如说在过程中做什么,也可以说是事务的执行者
例如挑选一个电脑
这个过程中,我们就要挑他的CPU,主板,显示器等并执行.
2.面向对象
由名称也可看出其重点在对象.就如做什么事,我们考虑的是找谁做.由事务的执行者变成了指挥者.
就如上个买电脑的例子.买电脑,我们不需要挑电脑的软硬件,而是仅仅需要找一个懂电脑的人帮我们去买就可以了.
可以说面向对象是一个贴近与人的思维(懒人思维).
3.面向对象的好处:
①将复杂问题简单化
②从事务的执行者 转化为 事务的指挥者
③更贴近于人的思维(懒人思维)
三 创建一个类(为力量创建一个抽象类的具体对象)
例如创建一个学生类
class Student{ //属性书写位置(成员变量 实例变量) //书写位置:类中方法外 //行为(方法 函数) 跟函数一样 就static先不写 //书写位置:类中 String name; int age; String gender; //成员方法/实例方法 public void eat() { System.out.println("吃饭"); } public void sleep() { System.out.println("睡觉"); } public void play(String game) { System.out.println("打游戏" + game); } //介绍自己的方法(行为): public void sayHi() { System.out.println("姓名:" + name); System.out.println("年龄:" + age); System.out.println("性别:" + gender); } }
而创建类都是为了创建一个对象
public static void main(String[] args) { //创建一个学生类的对象出来 //类型名 对象名 = 初值; //成员变量会随对象一起进入堆中 //new 一次,就会在堆中开辟一块内存空间 //Student stu 对象的引用(保存的是对象的地址) Student stu = new Student(); //使用 对象名.属性名 进行赋值和取值 stu.name = "fas"; stu.name = "fa"; stu.age = 24; stu.gender = "男"; //调用成员方法 对象名.方法名 stu.eat(); stu.play("英雄联盟"); //那个对象调用该方法,打印的就是那个对象的属性 stu.sayHi(); //不new没有开辟一个新的空间,对同一个进行数据操作 Student stu1 = stu; stu1.name = "fasf"; stu.sayHi(); }
而上述所说的成员变量和局部变量可看这个例子
package com.lanou3g; /* * 车类: * 车名 排气量 颜色 * 开车 * 停车 */ class car{ //声明成员变量的时候 可以给初值 String name = "法拉利";//车名 String displacement = "8.0T";//排气量 String color = "红色";//车颜色 public void startcar(int a) {//方法上 //在方法中的变量,是局部变量 //在方法上的变量,是局部变量 int num = 0; //就近原则 String color = "红色"; System.out.println(color); System.out.println("开车"); } public void stopcar() { System.out.println("停车"); } public void sayHi() { System.out.println("名字:" + name); System.out.println("排气量:" + displacement); System.out.println("车颜色:" + color); } }
成员变量和局部变量的区别
1.书写位置
成员变量:类中方法外
局部变量:方法中或方法上
2.在内存中的表现
成员变量:堆内存
局部变量:栈内存
3.生命周期
成员变量:随着对象进入堆内存中创建,随着对象的销毁而销毁
局部变量:随着方法的调用入栈,随着方法的结束而销毁
4.作用域
成员变量:整个类中
局部变量:方法中
5.初始值
成员变量:跟堆内存一样,有默认初始值
局部变量:不给初值,直接编译报错
在创建对象的时候,如若创建不同包下下的同名类的对象,需要指定完整的包名来创建对象
而创建不同包下的不同名类的对象,
四 创建对象时参数的引用
public class Demo04 { //参数是基本数据类型 public static void fun1(int a) { System.out.println(a); a = 10; } //参数是引用数据类型 //要什么类型 就给什么类型 public static void fun2(Person p) { p.name = "文武"; p.age = 24; } public static void main(String[] args) { int a = 100; fun1(a); System.out.println(a); Person p1 = new Person(); p1.name = "雨竹"; p1.age = 28; fun2(p1); p1.sayHi(); } }
数据的操作过程为
所以打印出来的是
五 匿名对象
匿名对象(没有名字的对象):
1.在方法传参数的时候使用
2.只调用一下方法(不赋值的情况下)
public class Demo05 { public static void setNameAndAge(Person p, String name, int age) { p.name = name; p.age = age; p.sayHi(); } public static void main(String[] args) { //创建两个person对象 并赋值 //将重复代码 抽成一个方法 Person p1 = new Person(); p1.name = "wanglong"; p1.age = 16; p1.sayHi(); Person p2 = new Person(); setNameAndAge(p2, "menglong", 8); //使用匿名对象 当方法参数 //好处:减少代码量 使用方便 setNameAndAge(new Person(), "kun", 20); //匿名对象也是对象,也可以赋值属性,调用同样的方法 new Person().name = "xin";//xin 0 new Person().age = 30;// null 30 new Person().sayHi();// null 0 //new 在堆内存中开辟空间,所以打印了三个空间 //只调用方法可以使用匿名对象-----测试方法时,可能会使用 new Person().fun(); } }
所以其打印的结果为
六 封装
写方法就是封装的一种,相当于隐藏代码的实现和属性 不能随意修改
需要开放访问方式(方法) 获取 修改
好处:
1.提高代码的复用性
2.提高代码的安全性
关键字(权限修饰符)
private 私有的
被private修饰的属性 只能本类中访问
public class Demo06 { public static void main(String[] args) { Phone phone = new Phone(); //测试 set get方法 phone.setPhoneName("vivo"); phone.setColor("红色"); System.out.println(phone.getPhoneName()); System.out.println(phone.getColor()); phone.sayHi(); } } class Phone{ //java bean 对象(java 实体类创建出来的对象) //1.声明成员变量 都需要 私有化 //2.给每一个成员变量提供 set/get方法 //3.必须提供 无参的构造方法 private String phoneName; private String color; //对外开放 访问方式 //获取方法 get //命名规范 // 获取 get + 成员变量名(首字母大写) // 修改 set + 成员变量名(首字母大写) // 标准写法 set方法 没有返回值的 public String getPhoneName() { return phoneName; } public String getColor() { return color; } //修改方法(设置方法) set public void setPhoneName(String name) { phoneName = name; } public void setColor(String color) { //就近原则 //关键字 this 代表的诗 本类的对象 //this.成员变量 = 获取 本类的 成员变量 //this.成员变量 = "哈啊哈";给本类的成员变量赋值 //this.成员方法 调用本类的成员方法 //谁调用了这个方法,谁就是这个this this.color = color; } public void sayHi() { System.out.println(phoneName + " " + color); } }
打印结果
七 有无参数的构造方法
/* * 构造方法:对 对象的成员变量进行初始化 * 写法: * 1.没有返回值类型位置(连void都不写) * 2.构造方法方法名 要与 类名 完全一致 */ public class Demo07 { public static void main(String[] args) { //创建一个pen对象 //构造方法 是系统帮你调的 //只要你创建对象 系统就会帮你调用构造方法 //构造方法 只会执行一遍 Pen pen = new Pen(); pen.sayHi(); /* pen.setName("作弊笔"); pen.setColor("红色"); System.out.println(pen.getName()); System.out.println(pen.getColor());*/ //测试有参的构造方法 //传参数 系统就会去找你有参的构造方法调用 Pen pen2 = new Pen("钢笔", "绿色"); pen2.sayHi(); /* * 类中写什么? * 成员变量 * 无参构造方法 * 有参构造方法 * 成员方法 * set/get方法 */ } } class Pen{ /* * 类中的书写顺序 * 1.成员变量 * 2.构造方法 * 3.成员方法 * 4.set/get */ private String name; private String color; //构造方法(无参) public Pen() { //初始化成员变量(给成员拜变量赋值) this.name = "圆珠笔"; this.color = "绿色"; System.out.println("我是pen类的无参构造方法"); } //有参的构造方法(构造方法的重载) //为了再创建对象的同时 给成员变量赋值 public Pen(String name,String color) { this.name = name; this.color = color; System.out.println("我是有参的构造方法"); } //介绍自己的方法 public void sayHi() { //使用this可以区分 成员变量 和 局部变量 System.out.println(this.name + " " + this.color); } //set/get方法 public void setName(String na) { name = na; } public void setColor(String col) { color = col; } public String getName() { return name; } public String getColor() { return color; } }
打印结果为