面向对象进阶

发布于:2024-07-06 ⋅ 阅读:(18) ⋅ 点赞:(0)

面向对象进阶

static(静态)

java中的一个修饰符,可以修饰成员方法,成员变量。

1719815273941

static内存图

1719814320103

1719814392822

工具类

1719814668176

注意点:

  • 类名见名之意
  • 私有化构造方法:构造方法一旦私有,在外界就不能创建这个方法的对象了。防止创建没有意义的对象。
  • 方法定义为静态(方便调用)
练习

1719815004472

static的注意事项

1719815368204

代码方面理解:

package com.example.demo;

public class Student {
//    1.私有化成员变量
     String name;
     Integer age;
     static String teacherName;

     //this:表示当前方法调用者的地址值。
    //这个this:是由虚拟机赋值的
     public void show1(Student this){
         System.out.println(this.name+","+this.age+","+teacherName);

//         调用其他方法
         this.show2();
         //非静态调用静态方法
         this.method();
     }

     public void show2(){
         System.out.println("show2");
     }

    /**
     * 静态方法里面没有this
     * 静态方法不能访问非静态
     */
    public static void method(){
//         System.out.println(this.name);
//         this.show1();
         System.out.println("静态方法");
     }
}
package com.example.demo;

public class Test {
    public static void main(String[] args) {
        Student.teacherName = "炭烤玛卡巴卡";

        Student s1 = new Student();
        s1.name = "lisi";
        s1.age = 23;
        s1.show1();

        System.out.println("=============");

        Student s2 = new Student();
        s2.age = 24;
        s2.name = "wuhu";
        s2.show1();
    }
}

内存方面理解:

1719817389053

1719817442035

1719817558221

重新认识main方法

1719817765823

继承

1719817991709

1719818037305

1719818119621

1719818388657

继承的特点

1719818941343

1719818996505

1719819084997

子类只能访问父类中非私有的成员变量。

练习

1719819125649

子类到底能继承父类中的哪些内容

1719819584540

1719819620687

内存图
构造方法

1719820398272

成员变量

private修饰父类成员变量(红色表示代码报错)。虽然父类的私有成员变量继承给了子类,但是不能直接使用。

1719820626088

成员方法

1719820894612

1719821106557

小结

1719821144998

内存分析工具

继承中:成员变量的访问特点

1719828760925

继承中:成员方法的访问特点

1719828894072

1719829024910

1719829109914

1719829225345

继承中:构造方法的特点

1719829334034

this、super使用总结

1719829737263

包、final、权限修饰符、代码块

包就是文件夹。用来管理各种不同功能的Java类,方便后期代码维护。

**包名的规则:**公司域名反写+包的作用,需要全部英文小写,见名之意。

使用其他类的规则

全类名:包名+类名

  • 使用同一个包中的类时,不需要导包。
  • 使用java.lang包中的类时,不需要导包。
  • 其他情况都需要导包。
  • 如果同时使用两个包中的同名类,需要用全类名

final(最终的)

  • final修饰方法:表明该方法是最终方法,不能被重写。
  • final修饰类:表明该类是最终类,不能被继承。
  • final修饰变量:该变量叫做常量,只能被赋值一次。
常量

实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性。

常量的命名规范:

  • 单个单词:全部大写
  • 多个单词:全部大写,单词之间用下划线隔开
细节

final修饰的变量是基本类型:那么变量存储的数据值不能发生改变。

final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,对象内部的属性值可以改变。

权限修饰符

  • 权限修饰符:是用来控制一个成员能够被访问的范围的。
  • 可以修饰成员变量,方法,构造方法,内部类

1719877447948

权限修饰符的使用规则:

实际开发中,一般只能private和public

  • 成员变量私有
  • 方法公开

特例:如果方法中的代码是抽取其他方法中共性代码,这个方法一般也私有。

代码块

局部代码块(已淘汰)

提前结束变量的生命周期

public class CodeBlockDemo1{
	public static void main(String[] args){
		{
			int a = 10;
		}//因为当代码执行到这里时,变量a就从内存中消失。
		System.out.println(a);//a报错
	}
}
构造代码块(不够灵活)
  • 写在成员位置的代码块
  • 作用:抽取构造方法中重复的代码
  • 执行时机:我们在创建本类对象的时候会先执行构造代码块再执行构造方法
  • 渐渐淘汰了:因为不太灵活
静态代码块(数据初始化)

格式:static{}

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

使用场景:在类加载的时候,做一些数据初始化的时候使用。

抽象类

抽象类的定义格式

如果一个类中存在抽象方法,那么该类就必须声明为抽象类

格式
public abstract class 类名{}
注意事项
  • 抽象类不能实例化(创建对象)

  • 抽象类中不一定有抽象方法,有抽象方法的一定是抽象类

  • 可以有构造方法(当创建子类对象时,给属性进行赋值)

  • 抽象类的子类

    ​ 1.要么重写抽象类中所有抽象方法

    ​ 2.要么是抽象类

抽象方法的定义格式

共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容是不一样的。所以,在父类中不能确定具体的方法体。该方法就可以定义为抽象方法。

格式
public abstract 返回值类型 方法名(参数列表)

1719881106442

接口

是一种规则,是对行为的抽象。

接口定义和使用

  • 用关键字interface来定义
public interface 接口名{}
  • 接口不能实例化

  • 接口和类之间是实现关系,通过implements关键字进行表示

public class 类名 implements 接口名{}
  • 接口的子类(实现类)

    要么重写接口中的所有抽象方法

    要么是抽象类

注意:

  • 接口和类的实现关系,可以单实现,也可多实现。
public class类名 implements 接口名1,接口名2{}
  • 实现类还可以再继承一个类的同时实现多个接口。
public class 类名 extends 父类 implements 接口1,接口2{}

接口里面成员的特点

成员变量
  • 只能是常量
  • 默认修饰符:public static final
构造方法
  • 没有
成员方法
  • 只能是抽象方法
  • 默认修饰符:public abstract
  • JDK7以前:接口中只能定义抽象方法
  • JDK8的新特性:接口中可以定义有方法体的方法
  • JDK9的新特性:接口中可以定义私有方法

接口和类之间的关系

类和类的关系

继承关系,只能单继承,不能多继承,但可以多层继承

类和接口的关系

实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口

如果实现多个接口就要重写所有接口里面的所有抽象方法

接口和接口的关系

继承关系,可以单继承,也可以多继承

如果实现类是实现最下面的子接口,那么就需要重写这个继承体系里的所有抽象方法

JDK8开始接口中新增的方法

默认方法

允许在接口中定义默认方法,需要使用关键字default修饰

作用:解决接口升级的问题

默认方法定义格式:

格式: public default 返回值类型 方法名(参数列表){}

范例: public default void show(){}

注意事项

  • 默认方法不是抽象方法,所以不强制重写。但是如果被重写,重写的时候去掉default关键字。
  • public可以省略,default不能省略
  • 如果实现了多个接口无,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写。
静态方法

允许在接口中定义静态方法,需要用static修饰

静态方法定义格式:

格式: public static 返回值类型 方法名 (参数列表){}
范例: public static void show(){}

注意事项

  • 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用。
  • public可以省略,static不能省略

JDK9新增的方法

私有方法定义格式:

//给默认方法服务:
格式1private 返回值类型 方法名(参数列表){}

范例1private void show(){}
//给静态方法服务
格式2private static 返回值类型 方法名(参数列表){}
范例2private static void method(){}

接口的应用

1719883990252

适配器设计模式

  • 设计模式:是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了课重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

    简单理解:设计模式就是各种套路。

  • 适配器设计模式:解决接口与接口实现类之间的矛盾问题。

1719884326025

多态

1719830381143

1719830471966

1719831483240

1719832115084

内部类

什么是内部类?

在一个类的里面,再定义一个类。

举例:在A类的内部定义B类,那么B类就被称为内部类。

1719884621286

类的五大成员:

属性、方法、构造方法、代码块、内部类

内部类的分类

成员内部类

写在成员位置的,属于外部类的成员。

代码如何书写
  • 成员内部类可以被一些修饰符所修饰,比如:private,默认,protected,public,static等
  • 在成员内部类里面JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量。
public class Car{
	String carName;
	int carAge;
	int carColor;
	class Engine{
		String engineName;
		int engineAge;
	}
}
创建内部类对象

方式一:当成员内部类被private修饰时,在外部内中编写方法,对外提供内部类的对象。

方式二:当成员内部类被非私有修饰时,直接创建格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;

Outer.Inner oi = new Outer().new Inner();
成员内部类如何获取外部类的成员变量
public class Outer {
	private int a = 10;
	
	class Inner{
		private int a = 20;
		
		public void show(){
			int a = 30;
			//sout(??);//10
			//sout(??);//20
			//sout(??);//30
            //当外部类与内部内成员变量重名时,在内部;类如何访问?
			sout(Outer.this.a);//10
            sout(this.a);//20
            sout(a);//30            
		}
	}
}

1719886641635

静态内部类

1719886910937

1719886985236

局部内部类

1719887028857

匿名内部类

本质上就是隐藏了名字的内部类

格式

new 类名或者接口名(){
	重写方法;
};

1719888189323


网站公告

今日签到

点亮在社区的每一天
去签到