深入理解Java面向对象编程:类、对象与三大特性详解
[id_645078421]

面向对象简述 类
类是对现实生活中一类事物的抽象,这类事物具有共同的属性和行为。类要确定对象将会拥有哪些属性和行为。
属性:指事物的特征,例如--->人类(名字、性别、年龄)。
行为是指事物能够执行的操作,比如人类可以进行吃饭、睡觉以及打豆豆等操作。
对象
万物皆对象,客观存在的事物皆为对象。
创建对象的方式为:类名对象名 = new 类名();调用方法的方式为:对象.方法名()。
概述
Java 面向对象编程作为一种编程思想,具有三大特性,分别是封装、继承和多态。它把数据以及操作数据的方法封装在对象里面,这样对象就具备了相应的功能。也就是说,面向对象是通过对象来实现功能等,具体的细节由对象去完成。通俗来讲,这种思想就是当碰到一件事的时候,要思考“由谁来完成这件事”,而不是去考虑这件事该如何完成。这个“谁”指的是对象,我们无需知晓他完成此事的过程,只需一个结果。
你是个游戏爱好者,想要提升段位但技术不佳,所以决定找代打来帮忙上分。在这种情况下,你只需支付费用,让他人替你冲击分数,无需知晓他的操作方式,只要最终达到你的要求就行。
一、封装 封装概述
封装是面向对象编程语言对客观世界的模拟。在客观世界中,成员变量都隐藏在对象内部。在这个内部,我们会对数据进行隐藏和保密。同时,只留下一些接口供外部调用,而外界无法直接调用这些数据。
封装原则
类会将某些信息隐藏在其内部,外部程序不被允许直接访问这些信息。而是要通过该类所提供的方法,来对隐藏的信息进行操作和访问成员变量 private ,并且类会提供对应的 getXxx() 方法和 setXxx() 方法。
public class Person {
private String name;
private int age;
public Person() {
}
定义一个名为 Person 的类,该类包含两个参数,一个是字符串类型的 name,另一个是整数类型的 age。在类的构造函数中,通过接收这两个参数来初始化对象的属性。
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
这个方法用于设置对象的名称。它接受一个字符串类型的参数 name,并将其赋值给对象的内部名称属性。通过调用这个方法,可以改变对象的名称。
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
通过对这些参数的处理,程序可以根据不同的情况进行相应的操作。
Person p = new Person();
p.setName("乔乔");
p.setAge(21);
}
}
//输出结果:
我叫~乔乔今年21
四种权限修饰符
private 修饰的属性或方法是该类独有的,在其他任何类中都无法直接进行访问;default 修饰的属性或方法具备包访问的特性,同一包中的其他类能够对其进行访问;protected 修饰的属性或方法,在同一个包中的其他类可以访问,并且在不在同一个包中的子类中也可以访问;public 修饰的属性或方法,在外部类中都可以直接进行访问。
修饰符
同一个类中
同一个包中子类无关类
不同包的子类
不同包的无关类
private
√
默认
√
√
protected
√
√
√
public
√
√
√
√
private和this关键字
private 是一种权限修饰符,它能够修饰成员,这里的成员包括成员变量和成员方法。其作用在于保护成员,使其不会被其他类所使用。被 private 修饰的成员,只有在本类中才可以被访问。
如果其他类需要使用被 private 修饰的成员变量,那么就提供相应的操作。
提供一个“get变量名()”的方法,此方法用于获取成员变量的值,并且该方法是用 public 进行修饰的。
提供一种“set变量名(参数)”的方法,此方法是用来设置成员变量的值的,并且该方法是用 public 进行修饰的。
this关键字代表当前对象
修饰的变量是用来指代成员变量的,它的主要作用在于区分局部变量和成员变量的重名情况。
注意:
方法的形参若与成员变量同名,那么不带 this 修饰的变量所指代的是形参,而非成员变量。
方法的形参不会与成员变量同名。不带 this 修饰的变量所指代的是成员变量。
封装好处
用方法来控制成员变量的操作,这样能提高代码的安全性;将代码用方法进行封装,能够提高代码的复用性。
二、继承 继承概述
继承是类与类之间的一种关系。这种关系能让子类拥有父类的属性和方法,并且可以在子类中重新定义,还能追加属性和方法。在使用继承时,需要考虑类与类之间是否存在 is..a 的关系,不能盲目使用继承。例如,“狗类”继承“动物”,此时动物类就是狗类的父类、基类或超类,而狗类则是动物类的子类或派生类。
继承是通过 extends 来实现的,例如有一个 public 类 Dog,它继承自 Animal 类。
在 Java 中,类仅支持单继承这一方式,不支持多继承。然而,类可以进行多层继承。
继承利与弊 this&super的三种用法
关键字
访问成员变量
访问构造方法
访问成员方法
this
this成员变量
访问本类成员变量
this(...)
访问本类构造方法
this.成员方法(...)
访问本类成员方法
super
super成员变量
访问父类成员变量
super(...)
访问父类构造方法
super.成员方法(...)
访问父类成员方法
访问特点
子类方法中访问变量时遵循就近原则,这是继承中的变量访问特点。
在子类的局部范围进行查找;在子类的成员范围进行查找;在父类的成员范围进行查找;如果以上这些范围都没有找到相关内容,就发出错误提示。(不考虑更高级别的父类等情况)
public class Fu {
int num = 10;
}
public class Zi extends Fu {
int num = 20;
public void show(){
int num = 30;
System.out.println(num);
}
}
public class Demo1 {
public static void main(String[] args) {
Zi z = new Zi();
z.show(); // 输出show方法中的局部变量30
}
}
子类中的所有构造方法在默认情况下都会去访问父类中没有参数的构造方法。
原因:
子类会继承父类里的数据,并且有可能会运用父类的数据。因此,在子类进行初始化之前,必须要先把父类数据完成初始化。
每一个子类构造方法的第一条语句通常是 super() 。 子类构造方法的起始语句一般为 super() 。 子类构造方法的首个语句往往是 super() 。 子类构造方法的第一条语句常常是 super() 。 子类构造方法的开头语句通常会是 super() 。 子类构造方法的起始部分一般是 super() 。 子类构造方法的开头通常会有 super() 。 子类构造方法的起始之处一般是 super() 。 子类构造方法的起始位置通常是 super() 。
如果父类中不存在无参构造方法,而仅仅存在带参构造方法,那么该如何处理呢?
使用 super 关键字来显式地调用父类的带参构造方法。
2. 在父类中自己提供一个无参构造方法(推荐)
(三)继承中成员方法的访问特点:通过子类对象访问一个方法。
寻找子类成员的范围;寻找父类成员的范围;如果都未找到就报错。(不考虑父亲的父亲等情况)。
方法重写
子类出现了方法声明与父类完全相同的情况,即方法名一样,并且参数列表也必须一样。
应用场景:子类需要父类的功能,且功能主体子类有自己的特有内容时,能够重写父类中的方法。如此一来,既延续了父类的功能,又定义了子类特有的内容。
注意事项:
1. 私有方法不能被重写(父类私有成员子类是不能继承的)。
子类方法的访问权限不能比父类方法的访问权限更低。访问权限的顺序为 public 大于默认大于私有。
三、多态 多态概述
多态是什么呢?同一个对象,在不同的时刻会展现出不同的形态,也就是说多态就是对象的多种形态。
多态的前提包括:其一,要有继承实现的关系;其二,要有方法的重写;其三,要有父类引用指向子类对象。
多态利与弊 成员访问特点
成员变量:编译看父类,执行看父类
成员方法:编译看父类,执行看子类
原因:因为成员方法有重写,而成员变量没有
//动物类
public class Animal {
public int age = 8;
public void eat() {
System.out.println("动物吃东西");
}
}
//猫类
猫类继承自动物类。 猫类是动物类的一种子类。 猫类具有动物类的一些特征和行为。 猫类在动物类的基础上进行了特定的扩展和定义。 猫类与动物类存在着继承关系。 猫类通过继承动物类来获得一些基本的属性和方法。 猫类在动物类的框架下展现出独特的特性。 猫类是动物类的一个具体实现。 猫类在动物类的体系中占据着特定的位置。 猫类依靠继承动物类来构建自身的结构和功能。 猫类与动物类的继承关系决定了它的一些特性和行为。 猫类在继承动物类的过程中形成了自己的特点。 猫类是动物类的一个分支,继承了动物类的相关属性和行为。 猫类通过继承动物类来实现自身的生物属性和行为模式。 猫类在动物类的范畴内具有特定的地位和作用。 猫类依靠继承动物类来展现其独特的生物特征。 猫类与动物类的继承机制使得它具备了特定的能力和行为。 猫类在动物类的体系架构中具有特定的意义和价值。 猫类通过继承动物类来构建其生物体系和行为方式。 猫类在动物类的框架下实现了自身的生物进化和发展。 猫类与动物类的继承关系影响着它的生物特性和行为表现。 猫类在继承动物类的基础上形成了独特的生物形态和行为模式。 猫类是动物类的一个具体体现,继承了动物类的相关特质和行为。 猫类通过继承动物类来实现其在生物界中的特定角色和功能。 猫类在动物类的体系中具有特定的生物定位和作用。 猫类依靠继承动物类来展现其独特的生物特征和行为方式。 猫类与动物类的继承关系决定了它在生物领域中的特定地位和价值。 猫类在继承动物类的过程中形成了自己的生物体系和行为规范。 猫类是动物类的一个具体分支,继承了动物类的相关生物属性和行为模式。 猫类通过继承动物类来构建其在生物界中的独特地位和作用。 猫类在动物类的框架下实现了自身的生物进化和发展路径。 猫类与动物类的继承关系影响着它在生物领域中的表现和价值。 猫类在继承动物类的基础上形成了独特的生物特征和行为规范。
public int age = 4;
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
//测试类
public class AnimalDemo {
public static void main(String[] args) {
//有父类引用指向子类对象
Animal a = new Cat();
System.out.println(a.age);
a.eat();
}
}
//输出结果:
8
猫吃鱼
多态转型
向上转型指的是从子类到父类的转换,即父类引用指向子类对象,例如:Animal a = new Cat();
向下转型:从父类到子类,即将父类引用转为子类对象,具体形式为子类型对象名 = (子类型) 父类引用,例如 Cat c = (Cat)a;
补充(instanceof)
Java 有一个保留关键字叫 instanceof 。它左边是对象,右边是类,返回类型为 Boolean 类型。其具体作用是对左边的对象进行测试,看它是否是右边类或者该类的子类所创建的实例对象。如果是,就返回 true ;如果不是,就返回 false 。先要有继承关系,然后才能使用 instanceof 。当需要用到对象的强制类型转换时,就需要通过 instanceof 来进行判断。