类和对象
一、面向对象
所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个实体都是一个对象,它是一种具体的概念。对象有以下特点:
- 对象具有属性和行为。
- 对象具有变化的状态。
- 对象具有唯一性。
- 对象都是某个类别的实例。
- 一切皆为对象,真实世界中的所有事物都可以视为对象。
面向对象的三大特点:
- 封装:封装是将代码及其处理的数据绑定在一起的一种编程机制,该机制保证了程序和数据都不受外部干扰且不被误用。Java 提供了私有和公有的访问模式,类的公有接口代表外部的用户应该知道或可以知道的每件东西,私有的方法数据只能通过该类的成员代码来访问,这就可以确保不会发生不希望的事情。
- 继承:程序中的继承性是指子类拥有父类的全部特征和行为,这是类之间的一种关系。Java 只支持单继承。
- 多态:多态性体现在父类中定义的属性和方法被子类继承后,可以具有不同的属性或表现方式。
二、类的定义
类是 java中的一种重要的引用数据类型,也是组成 Java 程序的基本要素,因为所有的 Java 程序都是基于类的。本节介绍如何定义类。
类使用class关键字进行定义,名字首字母大写。包含属性和方法
package com.suzezhi.base;
public class Person {
//属性
private String name;
private int age;
private char sex;
//无参构造函数
public Person() {
}
//有参构造函数
public Person(String name, int age, char sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
//getter和setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//定义方法
public void run(){
System.out.println("运动");
}
}
三、对象的创建
对象是对类的实例化。对象具有状态和行为,变量用来表明对象的状态,方法表明对象所具有的行为。
对象创建的格式:类名 对象名=new 类名(参数)
;
例子:
public class Test{
public static void main(String[] args){
Person person=new Person();//创建一个person对象
//调用其方法
String name=person.getName();
}
}
四、继承与多态
1.封装
封装将类的某些信息隐藏在类内部,不允许外部程序直接访问,只能通过该类提供的方法来实现对隐藏信息的操作和访问。
特点:
- 只能通过规定的方法访问数据。
- 隐藏类的实例细节,方便修改和实现。
具体实现:
实现封装的具体步骤如下:
- 修改属性的可见性来限制对属性的访问,一般设为 private。
- 为每个属性创建一对赋值(setter)方法和取值(getter)方法,一般设为 public,用于属性的读写。
- 在赋值和取值方法中,加入属性控制语句(对属性值的合法性进行判断)。
package com.suzezhi.base;
public class Person {
//属性
private String name;
private int age;
private char sex;
//无参构造函数
public Person() {
}
//有参构造函数
public Person(String name, int age, char sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
//getter和setter
public int getAge() {
return age;
}
//setAge方法就是封装
public void setAge(int age) {
if(age>=250||age<0){
age=-1;//age为-1表示该年龄填写错误
}else{
this.age = age;
}
}
//定义方法
public void run(){
System.out.println("运动");
}
}
2.继承
java是单继承的,子类(派生类)通过关键字extends 来继承父类(基类)。
格式:
[修饰符] class 子类 extends 父类{}
//父类Person.java
public class People {
public String name; // 姓名
public int age; // 年龄
public String sex; // 性别
public String sn; // 身份证号
public People(String name, int age, String sex, String sn) {
this.name = name;
this.age = age;
this.sex = sex;
this.sn = sn;
}
public String toString() {
return "姓名:" + name + "\n年龄:" + age + "\n性别:" + sex + "\n身份证号:" + sn;
}
}
//子类Student.java
public class Student extends People {
private String stuNo; // 学号
private String department; // 所学专业
public Student(String name, int age, String sex, String sn, String stuno, String department) {
super(name, age, sex, sn); // 调用父类中的构造方法
this.stuNo = stuno;
this.department = department;
}
public String toString() {
return "姓名:" + name + "\n年龄:" + age + "\n性别:" + sex + "\n身份证号:" + sn + "\n学号:" + stuNo + "\n所学专业:" + department;
}
}
注意:如果在父类中存在有参的构造方法而并没有重载无参的构造方法,那么在子类中必须含有有参的构造方法,因为如果在子类中不含有构造方法,默认会调用父类中无参的构造方法,而在父类中并没有无参的构造方法,因此会出错。
由于子类不能继承父类的构造方法,因此,如果要调用父类的构造方法,可以使用 super 关键字。super 可以用来访问父类的构造方法、普通方法和属性。
3.多态
多态主要体现在方法的重载和重写上
重载:就是在同一个类中,方法名称相同,但是参数列表不同的方法。
public class Test{
public void run(){
System.out.print("跑步");
}
public void run(String name){
System.out.print(name+"在跑步");
}
}
重写:子类对父类或者接口等方法进行重新编辑,方法名要相同,修饰符级别要相等或更高。
//父类
public class Animal {
public String name; // 名字
public int age; // 年龄
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getInfo() {
return "我叫" + name + ",今年" + age + "岁了。";
}
}
//子类
public class Cat extends Animal {
private String hobby;
public Cat(String name, int age, String hobby) {
super(name, age);
this.hobby = hobby;
}
//这里就是对父类的getInfo方法进行重写
public String getInfo() {
return "喵!大家好!我叫" + this.name + ",我今年" + this.age + "岁了,我爱吃" + hobby + "。";
}
public static void main(String[] args) {
Animal animal = new Cat("小白", 2, "鱼");
System.out.println(animal.getInfo());
}
}
五、抽象类
抽象类的定义和使用规则如下:
- 抽象类和抽象方法都要使用 abstract 关键字声明。
- 如果一个方法被声明为抽象的,那么这个类也必须声明为抽象的。而一个抽象类中,可以有 0~n 个抽象方法,以及 0~n 个具体方法。
- 抽象类不能实例化,也就是不能使用 new 关键字创建对象。
抽象类例子:
public abstract class Shape {
public int width; // 几何图形的长
public int height; // 几何图形的宽
public Shape(int width, int height) {
this.width = width;
this.height = height;
}
public abstract double area(); // 定义抽象方法,计算面积
}
public class Square extends Shape {
public Square(int width, int height) {
super(width, height);
}
// 重写父类中的抽象方法,实现计算正方形面积的功能
@Override
public double area() {
return width * height;
}
}
六、接口
接口对于其声明、变量和方法都做了许多限制,这些限制作为接口的特征归纳如下:
- 具有 public 访问控制符的接口,允许任何类使用;没有指定 public 的接口,其访问将局限于所属的包。
- 方法的声明不需要其他修饰符,在接口中声明的方法,将隐式地声明为公有的(public)和抽象的(abstract)。
- 在 Java 接口中声明的变量其实都是常量,接口中的变量声明,将隐式地声明为 public、static 和 final,即常量,所以接口中定义的变量必须初始化。
- 接口没有构造函数。
- 一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类。
例子:
public interface IMath {
public int sum(); // 完成两个数的相加
public int maxNum(int a,int b); // 获取较大的数
}
实现接口:
public class MathClass implements IMath {
private int num1; // 第 1 个操作数
private int num2; // 第 2 个操作数
public MathClass(int num1,int num2) {
// 构造方法
this.num1 = num1;
this.num2 = num2;
}
// 实现接口中的求和方法
public int sum() {
return num1 + num2;
}
// 实现接口中的获取较大数的方法
public int maxNum(int a,int b) {
if(a >= b) {
return a;
} else {
return b;
}
}
}