Java面向对象

本文详细介绍了Java中的类与对象概念、Javabean的设计、封装原则、private和this关键字的应用、构造方法、抽象与继承机制、多态、对象转型以及final关键字的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、类与对象:

1、类和对象是什么?

类:是共同特征的描述(设计图);

对象:是真实存在的案例

2、如何得到对象?

public class 类名 {
    1、成员变量
    2、成员方法
}
类名 对象名 = new 类名();

3、拿到对象后能做什么?

对象.成员变量;

对象.成员方法(...)

二、定义类的补充注意事项:

用来描述一类事物的类,专业叫做:Javabean类

在Javabean类中,是不写main方法的

在以前,编写main方法的类,叫做测试类

我们可以在测试类中创建Javabean类的对象并进行赋值调用

Javabean类:

类名首字母建议大写,需要见名知意,驼峰模式

一个Java文件中可以定义做个class类,且只能一个类是public修饰,

而且public修饰的类名必须成为代码文件名

实际开发中建议还是一个文件定义一个class类

成员变量的完整定义格式是:修饰符 数据类型 变量名称 = 初始化值;

一般无需指定初始值,存在默认值

三、封装:

1、如何正确设计对象的属性和方法?

原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为

2、private关键字:

#是一个权限修饰符

#可以修饰成员(成员变量和成员方法)

#被private修饰的成员只能在本类中才能访问

public class GirlFriend {
    private int age;

    //set(赋值)
    public void setAge(int a) {
        if(a >= 18 && a <= 50) {
            age = a;
        } else {
            System.out.println("非法数据");
        }
    }

    //get(获取)
    public int getAge() {
        return age;
    }
}

// 针对于每一个私有化的成员变量,都要提供 get 和 set 方法

// set方法:给成员变量赋值

//get方法:对外提供成员变量的值

// 作用:给成员变量name进行赋值的
public void setName(String n) {
    name = n;
}

// 作用:对外提供name属性的
public String getName() {
    return name:
}

3、this 关键字:

public void setName(String name) {
    this.name = name;
}

就近原则:

System.out.println(age);

System.out.println(this.age);

this的作用?

可以区别成员变量和局部变量

this关键字的三种用法:

~ 在本类的成员方法中,访问本类的成员变量

~ 在本类的成员方法中,访问本类的另一个成员方法

~ 在本类的构造方法中,访问本类的另一个构造方法

4、构造方法:

### 创建对象的时候,虚拟机会自动调用构造方法,给成员变量进行初始化

5、标准的JavaBean类:

a. 类名需要见名知意

b. 成员变量使用private修饰

c. 提供至少两个构造方法

~ 无参构造方法

~ 带全部参数的构造方法

d. 成员方法

~ 提供每一个成员变量对应的setXxx() / getXxx()

~ 如果还有其他行为,也需要写上

四、继承 Inheritance:

在面向对象编程中,我们已经创建了一个类,现在又想创建一个与之相似的类,比如添加新方法或修改原来的方法,我们不必从头开始,我们可以从原来的类派生出新的类,我们将原来的类称为父类或者基类,派生出来的类叫做子类,子类则会继承父类的数据和方法。

// 定义父类的格式:(一个普通的类定义)
public class 父类名称 {
    // ...
}

// 定义子类的格式:
public class 子类名称 extends 父类名称 {
    // ... 
}

1、super关键字:

三种用法:

~ 在子类的成员方法中,访问父类的成员变量

~ 在子类的成员方法中,访问父类的成员方法

~ 在子类的成员方法中,访问父类的构造方法

Java继承的三个特点:

# Java语言是单继承的,一个类的直接父类只有唯一一个

# Java可以多级继承

# 一个子类的直接父类是唯一的,但是一个父类可以拥有很多个子类

五、抽象:

如果父类当中的方法不确定如何进行{}方法体实现,那么这就应该是一个抽象方法

抽象方法:就是加上 abstract 关键字,然后去掉大括号,直接分号结束

抽象类:抽象方法所在的类,必须是抽象类才行。在class之前加上abstract即可

public abstract class Animal {
    
    // 这是一个抽象方法,代表吃东西,但是不知道具体吃什么
    public abstract void eat();
}

 如何使用抽象类和抽象方法:

1、不能直接创建new抽象类对象

2、必须用一个子类来继承抽象父类

3、子类必须覆盖重写抽象父类中的所有抽象方法:

覆盖重写(实现):子类去掉抽象方法的abstract关键字,然后补上方法体大括号

4、创建子类对象进行使用

public class Cat extends Animal {

    public void eat() {
        System.out.println("猫吃鱼");
    }
}

public class DemoMain {

    public static void main(String[] args) {
        // Animal animal = new Animal();
        // 错误写法!不能直接创建抽象类对象
        
        Cat cat = new Cat();
        cat eat();

    }
}

六、接口:

接口就是多个类的公共规范

接口是一种引用数据类型,最重要的内容就是其中的抽象方法

如何定义一个接口的格式:

public interface  接口名称 {
    
    //接口内容
}

备注:换成了关键字interface之后,编译生成的字节码文件仍然是:.java --> .class

如果是Java 7,那么接口中可以包含的内容有:

1、常量

2、抽象方法

如果是Java 8,还可以额外包含有:

3、默认方法

4、静态方法

如果是Java 9,还可以额外包含有:

5、私有方法

接口小结:

在Java 9+版本中,接口的内容可以有:

1、成员变量其实是常量,格式:

public static final 数据类型 常量名称 = 数据值

//注意:
//     常量必须进行赋值,而且一旦赋值不能改变
//     常量名称完全大写,用下划线进行分隔

2、接口中最重要的就是抽象方法,格式:

public abstract 返回值类型 方法名称(参数列表);
// 注意:
//     实现类必须覆盖重写接口所有的抽象方法,除非实现类是抽象类

3、从Java 8开始,接口里允许定义默认方法,格式:

public default 返回值类型 方法名称(参数列表) { 方法体 }
// 注意:
//     默认方法也可以被覆盖重写

4、从Java 8开始,接口里允许定义静态方法,格式:

public static 返回值类型 方法名称(参数列表) { 方法体 }
// 注意:
//     应该通过接口名称进行调用,不能通过实现类对象调用接口静态方法

5、从Java 9开始,接口里允许定义私有方法,格式:

// 普通私有方法
private 返回值类型 方法名称(参数列表){ 方法体 }

// 静态私有方法
private static 返回值类型 方法名称(参数列表){ 方法体 }

// 注意:
//     private的方法只有接口自己才能调用,不能被实现类或别人使用

七、多态:

extends继承或者implements实现,是多态性的前提

代码中体现多态性,其实就是一句话:

父类引用指向子类对象

// 格式:
父类名称 对象名 = new 子类名称();

//或者:
接口名称 对象名 = new 实现类名称();
// 使用多态的写法
// 左侧父类的引用,指向了右侧子类的对象
Fu obj = new Zi();

访问成员变量的两种方式:

1、直接通过对象名称访问成员变量:

看等号左边是谁,优先用谁,没有则向上找

2、间接通过成员方法访问成员变量:

看该方法属于谁,优先用谁,没有则向上找

#成员变量不可以覆盖重写,成员方法可以

口诀:编译看左边,运行还看左边

成员方法的访问规则:

1、在多态的代码当中,看new的是谁,就优先用谁,没有则先上找

口诀:编译看左边,运行看右边

八、对象转型:

对象向上转型:

其实就是多态写法

父类名称 对象名 = new 子类名称();

含义:右侧创建了一个子类对象,把它当作父类来看待使用

注意事项:向上转型一定是安全的,类似于有自动类型转换

对象向下转型:

其实是一个还原转换

子类名称 对象名 = (子类名称) 父类名称

含义:将父类对象【还原】为本来的子类对象

注意事项:

必须保证对象本来创建的时候的类与将要向下转型的类一致,如果不一致就会报错

如何才能知道一个父类引用的对象,本来是什么子类?

对象 instanceof 类名称

这将会得到一个Boolean值结果,也就是判断前面的对象能不能当作后面类型的实例

九、final关键字:

final关键字代表最终、不可改变的

1、final关键字用来修饰一个类:

public final class 类名称 {
    // ...
}

当前这个类不能有任何子类

一个类如果是final的,那么其中所有的成员方法都无法进行覆盖重写

2、final关键字用来修饰一个方法:

final 返回值类型 方法名称(参数列表) {
    // ...
}

此方法无法再被更改或者覆盖重写

3、final关键字用来修饰一个局部变量:

final 数据类型 数据名称 = 数据值

此变量无法更改

4、final关键字用来修饰一个成员变量:

此变量照样无法改变

a、由于成员变量具有默认值,所以用了final之后必须手动赋值,不会再给默认值

b、对于final的成员变量,要么使用直接赋值,要么通过构造方法赋值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值