Java基础面向对象——继承

3.2 继承

  • 一种类与类之间的关系

  • 使用已经存在的类的定义作为基础建立新类

  • 新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类

!注意一个子类只能继承一个父类,且之类只能继承父类非私有成员

代码实现

父类

package 面向对象;
​
public class Animal {
    //公共的属性和方法
    private String name; //昵称
    private int month; //月份
    private String species; //品种
​
    public void eat(){
        System.out.println(this.getName()+"在吃东西");
    }
    public Animal() {
    }
​
    public String getName() {
        return name;
    }
​
    @Override
    public String toString() {
        return "Animal{" +
                "name='" + name + '\'' +
                ", month=" + month +
                ", species='" + species + '\'' +
                '}';
    }
​
​
    public void setName(String name) {
        this.name = name;
    }
​
    public int getMonth() {
        return month;
    }
​
    public void setMonth(int month) {
        this.month = month;
    }
​
    public String getSpecies() {
        return species;
    }
​
    public void setSpecies(String species) {
        this.species = species;
    }
​
    public Animal(String name, int month, String species) {
        this.name = name;
        this.month = month;
        this.species = species;
    }
}

monkey子类

package 面向对象;
​
public class Monkey extends Animal {
    private double weight; //体重
​
    public Monkey() {
    }
​
    public Monkey(double weight) {
        this.weight = weight;
    }
​
    public Monkey(String name, int month, String species, double weight) {
        super(name, month, species);
        this.weight = weight;
    }
    public void run(){
        System.out.println(this.getName()+"是一只"+this.getSpecies()+",他在快乐的奔跑");
    }
}

dog子类

package 面向对象;
​
public class Dog extends Animal {
    private String sex; //性别
    public void sleep(){
        System.out.println(this.getName()+"现在"+this.getMonth()+"月大的,他在睡觉");
    }
    public Dog() {
    }
​
    public Dog(String sex) {
        this.sex = sex;
    }
​
    public Dog(String name, int month, String species, String sex) {
        super(name, month, species);
        this.sex = sex;
    }
​
    @Override
    public String toString() {
        return "Dog{" +
                "sex='" + sex + '\'' +
                '}';
    }
​
    public String getSex() {
        return sex;
    }
​
    public void setSex(String sex) {
        this.sex = sex;
    }
​
    public Dog(String name, int month, String species) {
        super(name, month, species);
    }
}

!父类不能调用子类的方法

!子类不能调用父类的私有方法

  • 继承的特点

    • 1,利于代码复用

    • 2,缩短开发周期

3.2.1 方法重写

语法规则

  • 在子类中定义

  • 方法名

  • 参数类型,顺序,个数

方法重写和方法重载的区别

  • 方法重写

    • 在满足继承关系的子类中

    • 方法名,参数个数,顺序,类型与父类,返回值相同

    • 访问修饰符的限定范围大于等于父类方法

  • 方法重载

    • 在同一个类中

    • 方法名相同

    • 参数个数,顺序,类型不同

    • 返回值和访问修饰符任意

3.2.3 访问修饰符

  • 公有的:public

  • 私有的:private

  • 受保护的:protected

  • 默认

3.2.4 实例化顺序

父类的静态变量
父类的静态块
子类的静态变量
子类的静态块
父类的非静态变量
父类的非静态块
父类构造方法
子类的非静态变量
子类的非静态块
子类的构造方法

3.2.5 super关键字

• 子类的构造的过程中必须调用其父类的构造方法

• 如果子类的构造方法中没有显示调用父类的构造方法,则系统 系默认调用父类无参的构造方法

• 如果子类构造方法中既没有显式调用父类的构造方法,而父类 又没有无参的构造方法,则编译出错

• 使用super调用父类指定构造方法,必须在子类的构造方法的 第一行

3.2.6 object类

  • object类所有类的父类

  • 一个类没有使用extends关键字明确标识继承关系则默认继承object类(包括数组)

  • Java 中的每个类都可以使用object中定义的方法

object类常用方法

方法说明
toString()返回当前对象本身的有关信息
equals()比较两个对象是否是同一个对象
hashCode()返回该对象的哈希代码值
getClass()获取当前对象所属的类信息,返回class对象

3.2.7 final关键字

1,修饰类表示不允许被继承

2,修饰方法表示不允许被子类重写

-final修饰的方法可以被继承

-不能修饰构造方法

3,修饰变量表示不允许修改

  • 方法内部的局部变量 》在使用之前被初始化赋值即可

  • 类中成员变量 》 只能在定义时或者构造代码块,构造方法中进行初始化设置

  • 基本数据类型的变量 》 初始赋值之后不能更改

  • 引用类型的变量 》 初始化之后不能再指向另一个对象,但指向的对象的内容是可变的

4,可配合static使用 当作不可修改的全局变量

5,使用 final修饰可以提高性能但会降低可扩展性

3.2.8 单例模式

设计模式

  • 设计模式(Design pattern)是一套被反复使用,多数人知晓的经过分类编目的,代码设计经验的总结。

  • 设计模式是软件开发人员再软件开发过程中面临的一般问题的解决方案

设计模式的种类

  • 面向对象的设计模式很多,但大家认为这23个模式是其他模式的基础

单例模式要点:

    1. 某个类只能有一个实例

    2. 必须自行创建实例

    3. 必须自行向整个系统提供这个实例

单例模式实现:

    1. 只提供私有的构造方法

    2. 含有一个该类的静态私有对象

    3. 提供一个静态的共有方法用于创建,获取静态私有对象

代码实现方式:

  1. 饿汉式

  2. 懒汉式

饿汉式

代码实现

package 单例模式;
//饿汉式:创建对象实例的时候直接初始化
// 空间换时间
public class SingletonOne {
    // 1. 创建类中私有构造
    private SingletonOne(){
​
    }
    // 2. 创建该类型的私有静态实例
    private static SingletonOne instance = new SingletonOne();
​
    // 3. 创建公有静态方法返回静态实例对象
    public static SingletonOne getInstance(){
        return instance;
    }
}

懒汉式

代码实现

package 单例模式;
//懒汉式
public class SingletonTwo {
    // 1 创建私有的构造方法
    private SingletonTwo(){
​
    }
​
    //2 创建静态的该类实例对象
    private static SingletonTwo singletonTwo;
​
    //3 创建开放的静态方法提供实例对象
    public static SingletonTwo getInstance(){
        if (singletonTwo==null){
            singletonTwo=new SingletonTwo();
        }
        return singletonTwo;
    }
}

饿汉式对比懒汉式

  • 饿汉式

    • 在类加载时就创建实例,第一次加载速度块

    • 饿汉式:空间换时间

  • l懒汉式

    • 懒汉式第一次使用时进行实例化,第一次加载慢

    • 懒汉式:时间换空间

  • 饿汉式线程安全;懒汉式存在线程风险 解决方案:

  • 1、同步锁 2、静态内部类 3、双重校验锁 4、枚举

单例模式的优点:

  1. 在内存中只有一个对象,节省内存空间

  2. 避免频繁的创建销毁对象,提高性能

  3. 避免对共享资源的多重占用

缺点

  1. 扩展比较困难

  2. 如果实例化后的对象长期不利用,系统将默认为垃圾进行回收, 造成对象状态丢失

适用场景

  1. 创建对象时占用资源过多,但同时又需要用到该类对象

  2. 对系统内资源要求统一读写,如读写配置信息

  3. 当多个实例存在可能引起程序逻辑错误,如号码生成器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java面向对象的三大特性是封装、继承和多态。封装是指将实现细节从接口中隐藏起来,使客户端无需关心实现细节,只需要调用接口即可。继承是指子类可以继承父类的属性和方法,使子类可以共享父类的属性和方法,从而实现代码的复用。多态是指同一操作作用于不同的对象,可以有不同的解释,从而实现不同的功能。 ### 回答2: Java面向对象的三大特性是封装、继承和多态。 封装是指将数据和对该数据的操作方法封装在一个类中,通过访问权限修饰符对数据进行限制,从而隐藏数据的具体实现细节,仅对外提供必要的接口,保证数据的安全性和一致性。通过封装可以提高代码的复用性和可维护性,降低耦合性。 继承是一种基于现有类创建新类的机制,通过使用已有类的属性和方法,实现代码的重用。在Java中,通过使用extends关键字可以实现类的继承,子类可以继承父类的公共属性和方法,并且可以在继承基础上进行扩展和重写。继承可以提高代码的可复用性和可扩展性,减少代码的冗余和重复。 多态是指同一类型的对象在不同的情况下表现出不同的行为。在Java中,通过继承和方法重写的方式实现多态。父类类型的引用变量可以引用子类类型的对象,从而可以根据不同的对象类型调用相应的方法。通过多态机制,可以提高代码的灵活性和可扩展性,增加代码的可读性。 这三个特性相互配合,可以使得Java面向对象的程序具有高内聚、低耦合的特点。封装保证了数据的隐藏和安全性,继承提供了代码的重用和扩展性,而多态则实现不同对象类型的统一处理。面向对象的三大特性是Java中重要的编程思想,对于代码的设计和开发具有重要意义。 ### 回答3: Java面向对象的三个特性分别是封装、继承和多态。 首先,封装是指将数据和方法封装在一个类中,对外只暴露必要的接口,隐藏了其具体的实现细节。通过封装,可以提高代码的可维护性和安全性,同时也减少了代码的耦合性,提高了代码的复用性。 其次,继承是指一个对象可以直接拥有另一个对象的属性和方法。通过继承,一个类可以继承另一个类的属性和方法,从而减少了代码的重复性,提高了代码的复用性。同时,继承也能够实现多态,允许将子类的对象赋值给父类的变量,实现了类之间的替换和扩展。 最后,多态是指一个对象可以具有多种形态。在Java中,多态通过程序的运行时动态绑定实现。多态有助于提高代码的灵活性和可扩展性。通过多态,可以编写通用的代码,使得程序可以处理不同类型的对象,从而提高了代码的可复用性和可维护性。 总的来说,Java面向对象的三大特性——封装、继承和多态,分别通过对数据和方法的封装、层次化结构的继承和运行时动态绑定的多态实现了代码的封装性、代码的复用性和代码的灵活性。这些特性使得Java成为一种非常强大的面向对象编程语言。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值