Java 面向对象进阶(一)

简介: Java 面向对象进阶

一、学习语法步骤

fcfcc177623e443d0f4bc3c674ebd3c.png

二、static静态关键字

1、static是什么?

static是静态的意思,可以用来修饰成员变量、成员方法

static修饰成员变量之后称为静态成员变量(类变量),修饰成员方法之后称为静态方法(类方法)

static修饰后的成员变量,可以被类的所有对象共享(访问、修改)

public class User {
    static String name; //静态成员变量
    int age; //实例成员变量
}

fc88cff3007e0e18255eda717037064.png

public class HelloWorld {
    public static void main(String[] args) {
        User user = new User();
        user.age = 30;
        user.name = "张老师";  //不推荐 对象.实例成员变量
        User.name = "李老师"; //静态变量可以直接被  类名.静态成员变量 使用  推荐此方法
//        User.age = 35;   //报错的
        User u1  = new User();
        u1.name = "张老师";
        User u2 = new User();
        u2.name = "李老师";
        System.out.println(u1.name);
        System.out.println(u2.name);   //static修饰  内存中只加载一次,只有一份 所以u1和u2的值是相同的
    }
}

静态成员变量:表示在线人数等需要被类的所有对象共享信息时

实例成员变量:属于每个对象,每个对象信息不同时

static注意事项:

静态方法只能访问静态成员,不可以直接访问实例成员

实例方法可以访问静态成员,也可以访问实例成员

静态方法中不可以出现this关键字

三、static工具类

1、工具类优点

内部是静态方法,每个方法可以实现一种功能

方便调用,提高代码复用

2、工具类要求

推荐构造器私有化处理

工具类不需要创建对象

四、static代码块

定义:用{}括起来称为代码块

1、静态代码块

格式:

static{}

特点:需要static关键字修饰,随着类的加载而加载,并且自动触发、只执行一次

场景:类加载时初始化静态数据

2、构造代码块

格式:

{}

特点:每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并在构造器执行前执行

场景:初始化实例资源

五、static单例模式

1、什么是设计模式(Design pattern)?

定义:一个问题N中解法,最优的解法被人们称之为设计模式,设计模式大概有20多种

学设计模式重点:

1)这种模式用来解决什么问题

2)遇到问题,该模式是怎么写的,如何解决这个问题

2、什么是单例模式?

可以保证系统中,应用该模式的这个类永远只有一个实例,即一个类永远只能创建一个对象。

1)饿汉单例实现步骤?

定义一个类,把构造器私有

定义一个静态变量存储一个对象

/**
 * 定义一个单例类
 */
public class Single {
    //定义一个静态变量存储一个对象:属于类,与类一次加载一次
    public static Single single = new Single();
    //单例必须有私有构造器
    private Single(){
        System.out.println("Single");
    }
}

2)懒汉单例实现步骤?

需要改对象时,才创建一个对象(延迟加载对象)

定义一个类,把构造器私有

顶一个静态变量存储一个对象

提供一个返回单例对象的方法

/**
 * 定义一个单例类
 */
class SingleInstance {
    //定义一个静态变量存储一个对象:属于类,与类一次加载一次
    public static SingleInstance single; //默认值null
    //单例必须有私有构造器
    private SingleInstance(){
        System.out.println("Single");
    }
    //必须有一个返回单例对象的方法
    public static SingleInstance getSingle() {
        return single;
    }
}

六、面向对象之继承

1、什么是继承?

用extend关键字,让一个类和另一个类建立成父子关系

Object称之为父类(基类或超类),继承Object的称之为子类(派生类)

作用:当子类继承父类后,可以直接使用父类的公共属性和方法

好处:

可以提供代码复用性

继承格式:子类 extend 父类

ca7da935968e5c6af3de6117fac6ea1.png


public class SingleInstance extends Object{
    public static void main(String[] args) {
        System.out.println("SingleInstance是子类,Object是父类");
    }
}

2、继承设计规范

设计规范

子类相同特征(属性、方法)在父类中定义,子类特有属性和方法定义在自己的类中

eea06b541101c381a7f2fd780933a10.png

public class Person {
    private String name;
    private int age;
    public void eat(){
        System.out.println("人天生就会吃");
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public class Teacher extends Person{
    private String ClassName;
    public void teacherCourse(){
        System.out.println("老师必须要会授课");
    }
    public String getClassName() {
        return ClassName;
    }
    public void setClassName(String className) {
        ClassName = className;
    }
    @Override
    public String toString() {
        return "Teacher{" +
                "ClassName='" + ClassName + '\'' +
                '}';
    }
}
public class User {
    public static void main(String[] args) {
        Teacher tc = new Teacher();
        tc.setName("张老师");
        tc.setAge(35);
        tc.setClassName("数学课");
        System.out.println(tc.getName());
        System.out.println(tc.getAge());
        System.out.println(tc.getClassName());
        tc.teacherCourse();
        tc.eat();
    }
}

3、继承特点

子类可以继承父类的属性和方法,不能继承父类构造器

Java是单继承模式:一个子类只能继承一个父类

Java不支持多继承,支持多层继承,A继承B,C继承B

Java所有类都是Object的子类

子类可以继承父类私有成员,但是不能直接访问

4、继承后成员变量和方法访问特点

就近原则:

在子类方法中访问成员(成员变量、成员方法)

先子类局范围找

然后子类成员范围找

然后父类成员范围找,如果父类没有找到则报错


子父类中成员重名,子类优先,必须在父类找

用super关键字,指定访问父类成员

格式:super.父类成员变量/方法

5、方法重写

定义:

在继承中,子父类出现同命名方法声明,称子类此方法重写

场景

子类需要父类功能,父类该功能不能完全满足子类需求时

@Override重写注解

@Override是放在方法重写上面作为校验

加上该注解,编译阶段有错误会提示

建议重写方法都加是@Override

注意事项和要求

重写方法名称、形参列表必须与被重写方法名称、形参列表一致

私有方法不能被重写

子类重写父类时,访问权限必须大于或者等于父类(缺省

子类不能重写父类静态方法,如重写会报错

6、子类构造器特点

特点

子类所有构造器默认都会优先访问父类中无参构造器,在访问自己

原因

子类初始化时,可能会用到父类的数据,如父类没有初始化完成,子类无法使用父类数据

调用父类构造器?

子类构造器第一句,super()默认

7、访问父类带参构造器

super() 调用父类带参构造器

初始化继承自父类数据

父类没有无参构造器,只有有参构造器

子类构造器用super(),手动调用父类带参构造器 ----子类默认调用父类无参构造器

8、this,super使用

this 本类对象引用

super 父类存储空间标识

a3f3b92c14a98a0a06097ed1604889f.png

注意点:

子类通过this() 去调用本类其它构造器,本类其它构造器会通过super()手动调用父类构造器,最终调用父类构造器

this()、super()必须放在构造器第一行,二者不能同时出现在同一个构造器中



相关文章
|
16天前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
10 2
|
2月前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
2月前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
33 4
|
2月前
|
Java
接口和抽象类【Java面向对象知识回顾②】
本文讨论了Java中抽象类和接口的概念与区别。抽象类是不能被实例化的类,可以包含抽象和非抽象方法,常用作其他类的基类。接口是一种纯抽象类型,只包含抽象方法和常量,不能被实例化,且实现接口的类必须实现接口中定义的所有方法。文章还比较了抽象类和接口在实现方式、方法类型、成员变量、构造方法和访问修饰符等方面的不同,并探讨了它们的使用场景。
接口和抽象类【Java面向对象知识回顾②】
|
1月前
|
存储 Java 程序员
Java基础-面向对象
Java基础-面向对象
15 0
|
2月前
|
安全 Java Go
面向对象程序设计语言:Java
Java语言语法和C语言和C++语言很接近,很容易学习和使用,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的特性,Java语言不使用指针,而是引用,并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧
55 2
|
2月前
|
Java 开发者
Java 面向对象
Java 是一种面向对象的编程语言,通过对象与类的概念组织代码和数据。面向对象编程的核心包括类、对象、继承、多态、封装和抽象。类是对象的蓝图,定义了属性和行为;对象则是类的实例。继承允许子类继承父类的属性和方法,增强代码复用性;多态则支持通过相同接口调用不同类型对象的行为,包括方法重载和重写。封装通过公共方法隐藏对象细节,提高安全性;抽象则对对象特征进行提炼,通过抽象类和接口实现。理解这些概念有助于设计高效、可维护的 Java 应用程序。
|
3月前
|
Java 开发者 C++
|
2月前
|
Java 开发者
Java编程之旅:探索面向对象的力量
【9月更文挑战第16天】在编程的世界中,Java以其强大的面向对象编程特性而闻名。本文将带你走进Java的世界,一起探索类与对象的奥秘,学习如何通过封装、继承和多态性构建健壮的软件系统。无论你是初学者还是有经验的开发者,本文都旨在提供实用的代码示例,帮助你提升Java技能。准备好开始这段旅程了吗?让我们启程吧!
|
3月前
|
存储 Java 数据库连接
Java编程之旅:从基础到高级,探索面向对象的力量
【8月更文挑战第31天】本文是一篇深入浅出的Java编程指南,旨在通过生动的例子和实际代码演示,带领读者从Java的基础语法起步,逐步深入到面向对象的核心概念,最后探讨如何在实际项目中应用这些知识。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的见解和实用的技巧。