9.28-面向对象
核心思想
面向对象是一种常见的思想,符合人们的思考习惯
面向对象的出现将复杂的事情简单化
面向对象的出现将我们的身份由执行者变为了指挥者
面向对象需要关注两个重点
有没有这个对象
这个对象中具不具备这样的功能
面向对象开发(仅了解)
就是不断的创建对象,使用对象,指挥对象做事情,有对象就找这个对象做事情,没有对象就自己创建一个对象,使其拥有这样的功能;其他人也可以使用这个对象。
面向对象设计(仅了解)
其实就是管理和维护对象之间的关系
面向对象的特征(重点)
封装、继承、多态、抽象
类与对象之间的关系
用Java语言对现实生活的事物进行描述,需要通过类的形式来体现。
对于事物的描述通常只关注两个方面:一个是属性,一个是行为(功能/方法);只要明确该类事物的属性和行为定义在类中即可。
类(class)
某一类事物的描述(属性/行为)
对象
该类事物中一个实实在在的个体(实体/实例)
在Java中,通过new关键字来创建
成员变量和局部变量有什么区别
成员变量定义在类中,整个类都可以访问
变量定义在方法、语句、局部代码块中,只在所属区域是有效的
成员变量存储在堆内存的对象中;局部变量存储在栈内存的方法中
成员变量随着对像的创建而存在,随着对象的消失而消失;局部变量随着所属区域的执行而存在,随着所属区域的结束尔释放。
成员变量都有默认初始化值;局部变量没有默认初始化值
例子
package day01;
public class Car {
/**
* 描述小汽车
* 分析:
* 1.属性
* 轮胎数
* 颜色
* 2.行为
* 运行
*/
int num /*= 4*/;//轮胎数,显示初始化(但是默认初始化依旧存在)
String color;//颜色
//运行的功能
void run() {
// int num = 8;
System.out.println(num+","+color);
}
}
package day01;
public class CarDemo01 {//测试类
public static void main(String[] args) {
//在Java中创建一个Car的实例。通过new关键字
// Car c = new Car();//c也可以叫做引用变量
// c.num = 4;
// c.color = "red";
// c.run();
/*
* 要使用对象中的内容(属性/行为),可以通过
* 对象.成员的方式来完成调用
* 不管是属性还是行为都是这类事物的组成部分
* 都称之为成员,属性又叫做成员变量,行为又
* 叫做成员方法,定义类就是在定义该类的成员
*/
// Car c1 = new Car();
// Car c2 = new Car();
// c1.num = 5;
// c2.color = "blue";
// c1.run();
Car c1 = new Car();
Car c2 = c1;//一个对象可以被多个变量所引用
c1.num = 8;
c2.color = "green";
c1.run();
}
}
package day01;
public class CarDemo02 {
public static void main(String[] args) {
// Car c = new Car();
// c.run();
// new Car();//匿名对象
// new Car().num = 7;
// new Car().color = "yellow";
// new Car().run();
//需求:批量生产4个轮子红色的汽车
Car c1 = new Car();
// c1.num = 4;
// c1.color = "red";
Car c2 = new Car();
// c2.num = 4;
// c2.color = "red";
show(c1);
show(c2);
}
//汽车改装厂
public static void show(Car c) {//引用类型也叫作类类型
c.num = 4;
c.color = "red";
}
}
内存图



private关键字
权限修饰符,权限为私有;用于修饰成员;私有的内容只在本类中有效
例子
package day9_28;
public class PersonDemo {//测试类
public static void main(String[] args) {
Person p = new Person();
// p.age =23;
p.setAge(23);
p.speak();
}
}
/*
* 一个.java中可以书写多个类,但最多只能有一个public修饰的类;
*并且public修饰的类的类名要与.java的文件名一致
*/
class Person{//描述人类
private int age;//年龄属性
/*对属性的草错无非就是两种
* 一种是获取属性的值
* 一种是给属性设置值
*/
public void setAge(int a) {
if(a>0&&a<200) {
age = a;
}else {
System.out.println("不是人的年龄");
}
}
//说话的行为
void speak() {
System.out.println("age="+age);
}
}
封装思想
将属性私有化,对外提供公有的访问方式
注意,将属性私有化仅仅是封装思想的一种体现
构造方法(构造器constructor)
定义构造器的特点
构造器的名称要与类名一致(包括大小写)
不需要定义返回值类型
没有具体的返回值
构造器定义在类中
作用
给对象进行初始化(给对象中的属性进行赋值)
例子
package day9_28;
public class ConstructorDemo {
public static void main(String[] args) {
People p = new People();
p.speak();
People p1= new People("旺财");
p1.speak();
People p2=new People("哪吒", 3);
p2.speak();
/*
* 构造方法就是创建对象时调用的方法
* 作用:可以给对象进行初始化,使对象一旦创建就具备了一些内容
* 创建对象都必须经过构造器进行初始化
* 一个类中如果没有写任何的构造器,那么这个类中就会有一个默认的无参构造器
* 一旦手动添加了构造器,那么默认的无参构造器就不存在
*/
}
}
class People{//人类
private String name;//姓名属性
private int age;//年龄属性
//定义无参构造器
public People() {
name="baby";
age=1;
System.out.println("People Run!!");
}
//有参构造器(指定姓名)
public People(String n) {
name=n;
}
//有参构造器(指定姓名与年龄)
public People(String n,int a) {
name=n;
age=a;
}
public void setName(String n) {
name = n;
}
public void speak() {//说话
System.out.println(name+""+age);
}
}
注意
默认构造器的特点
一个类中多个构造器是以"重载"的形式来体现的
重载:同一个类中方法名相同,但是参数列表不同
this关键字
用法一
当一个类中,成员变量和局部变量重名时,可以使用关键字this去区分成员变量
package day9_28;
public class ThisDemo {
public static void main(String[] args) {
}
class People{//人类
private String name;//姓名属性
private int age;//年龄属性
//定义无参构造器
public People() {
this.name="baby";
this.age=1;
System.out.println("People Run!!");
}
//有参构造器(指定姓名)
public People(String name) {
this.name=name;
}
//有参构造器(指定姓名与年龄)
public People(String name,int age) {
this.name=name;
this.age=age;
}
public void setName(String name) {
this.name = name;
}
public void speak() {//说话
System.out.println(this.name+","+this.age);
}
}
}
用法二
this还可以在构造器中调用本类的其他构造器
作用
代表当前对象,也就是所在方法所属对象的引用。
简单来说,哪个对象调用了this所在的方法,this就代表哪个对象
例子-例子一接续
//定义方法,比较两个人的年龄是否相等
public boolean compare(Person p) {//this
// if(this.age==p.age) {
// return true;
// }else {
// return false;
// }
return this.age==p.age;
}
最后更新于