day_13

目录

1.  Abstract

1.1  是什么

1.2  使用语法

2.  Interface

2.1  是什么

2.2  使用方法

3.  Object

3.1  概述

3.2  toString

3.3  equals

3.4  Finalize


1.  Abstract

1.1  是什么

是修饰符, 表示抽象的,  用来修饰抽象类和抽象方法

1.2  使用语法

abstract修饰的类是抽象类, 并且抽象类不能创建对象, 而且抽象类一般主要是用于被继承.

   子类如果继承了抽象类, 那么需要实现所有的抽象方法, 否则该子类就需要使用abstract修饰

      普通类继承抽象类需要实现所有的抽象方法

      抽象类继承抽象类, 需要实现0~N个抽象方法

abstract修饰的方法时抽象方法

子类继承父类的方法时,可以用abstract修饰父类中的方法,使其变成抽象方法(该方法没有方法体), 

只定义功能,不定义实现, 用于让不同子类去实现(覆写),  子类中若没有覆写抽象方法则会报错.

抽象方法必须在抽象类中,  而抽象类中可以没有抽象方法

抽象类可以被看做是特殊的类, 类可以做的他都能做, 只不过不能创建对象,  只有抽象方法而已.

注: abstract(用于被继承) 和 final(不能被继承)不能同时出现

public class Abstract_02 {
public static void main(String[] args) {
	//抽象类不能创建对象
	//Sup a = new Sup();
}
}
//报错The class A can be either abstract or final, not both
//abstract 和 final不能同时出现
//abstract final class A{}
abstract class A {
    public A(){
  }
    public abstract void m1();
}

2.  Interface

2.1  是什么

Interface : 定义接口的关键字

JDK1.8 之前,接口是完全抽象的,只允许出现抽象方法和常量(psf)

1.8 开始, 可以出现静态方法和默认方法(等同看成成员方法)

接口中, 没有变量只有常量(可以有局部变量), 并且psf可以省略, 接口中, 权限默认是公共的(public)

并且抽象方法abstract可以省略

接口不能创建对象, 没有构造方法, 但是能发生多态   语法:  父接口  变量 = new 子类();

2.2  使用方法

类和接口之前不再是继承关系(extend), 而是实现关系(implement), 并且是多个实现关系

多个实现用 , 逗号隔开

    一个普通的类实现接口, 需要实现(覆写)所有的抽象方法

    一个抽象类实现接口, 需要实现0~N个抽象方法

接口和接口是直接继承关系, 并且是多继承, 用 , 逗号隔开

    继承和实现同时出现的话先写继承后写实现

如果接口和抽象类都能实现某个功能, 优先使用接口

    因为类和接口是多实现的关系,如果使用接口这样会保留类继承,拓展性更强

注: 接口最好接小接口, 不要将带有没用功能的大接口接入方法, 导致代码冗杂

public class Interface_01 {
	public static void main(String[] args) {
		D.m4();
	}
}

interface D {
	// 公共的常量
	int age = 2;
	public static final int aa = 1;
	public static int aa1 = 1;
	public int aa2 = 1;

	// 公共的抽象方法
	void m1();

	public void m2();

	public abstract void m3(int age);

	// 静态方法
	public static void m4() {
		System.out.println("静态方法");
	}

	// 默认方法,就是成员方法,需要创建子类对象进行调用
	default void m5() {
		int a = 2;
		System.out.println("默认方法");
	}
}

interface B {
}

interface C extends D, B {
}

// 继承和实现可以同时出现,也可以不同时出现
// 如果同时出现,则需要先写继承,后写实现
class Sub_1 extends Object implements D, B, C {
	@Override
	public void m1() {
	}
	public void m2() {
	}
	@Override
	public void m3(int age) {
	}
}

3.  Object

3.1  概述

是java提供的根类, 所有类都直接或间接继承Object

java.lang.Object;  在java.lang包下,  这个包是核心包,  用该包下所有的类都不需要导入,  可以直接使用

3.2  toString

toString: 该方法代表了该对象的字符串形式的描述方式

输出一个引用类型的时候,会自动调用该对象的toString方法, 默认的toString方法时打印内存地址

如果打印不要内存地址,或者需要以特定格式打印输出,则需要我们自己覆写该方法

public String toString(){
   return "里面是需要的格式";
}

@Override
	public String toString() {
		return "我叫" + name + ",我今年" + age + "岁了";
	}
//等同于
System.out.println("我叫" + user.getName() + ",我今年" + user.getAge()
				+ "岁了");

3.3  equals

equals方法的设计目的: 比较两个对象是否相等. 但是默认的equals比较的是内存地址

    == : 比较基本类型是比较的值的大小, 比较引用类型,比较的是内存地址

如果我们要比较某些属性值的话, 需要我们根据需求覆写(重写)

//重新定义equals的方法	
	public boolean equals(Object obj) {
			// 判断是不是同一个对象
			if (this == obj) {
				return true;
			}
			// 判断是否是相同类型,不同类 没有可比性
			if (obj instanceof User) {
				User u2 = (User) obj;
				if (this.no == u2.no && this.name.equals(u2.name)) {
					return true;
				}
			}
			return false;
		}

3.4  Finalize

JVM: 跨平台, 多线程, 面向对象, 自动垃圾回收

面向对象: 封装,继承,抽象,多态

垃圾: 没有任何引用指向该对象的时候, 则该对象为垃圾数据

         就是堆内存中有个对象,但是谁也找不到它

    垃圾在被回收的时候,会自动调用该对象的finalize方法, 是在对象生命周期要结束的时候被调用, 所有它适合做一些关闭资源等操作

finalize是没有回收功能的,只是要被回收之前被自动调用, 我们也可以手动调用finalize方法 ,但就是方法调用而已

  

#include <iostream> #include <cstdio> #include <cstring> using namespace std; const char* Haab_month_name[] = {"pop", "no", "zip", "zotz", "tzec", "xul", "yoxkin", "mol", "chen", "yax", "zac", "ceh", "mac", "kankin", "muan", "pax", "koyab", "cumhu", "uayet"}; int Tzolkin_day_number[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1, 2, 3, 4, 5, 6, 7}; const char *Tzolkin_day_name[] = {"imix", "ik", "akbal", "kan", "chicchan", "cimi", "manik", "lamat", "muluk", "ok", "chuen", "eb", "ben", "ix", "mem", "cib", "caban", "eznab", "canac", "ahau"}; struct Date { int day; int month; int year; }; // 把哈布历转换成天数 int haab_to_days(int day, const char* month, int year) { int total_days = day + (year * 365); int month_index; for (month_index = 0; month_index < 19; ++month_index) { if (strcmp(Haab_month_name[month_index], month) == 0) { break; } } total_days += month_index * 20; return total_days; } // 把天数转换成托尔金历 void days_to_tzolkin(int total_days, int* day_number, const char** day_name) { int tzolkin_day_count = total_days % 13; int tzolkin_day_index = tzolkin_day_count - 1; if (tzolkin_day_index < 0) tzolkin_day_index = 12; int tzolkin_day_number = Tzolkin_day_number[tzolkin_day_index]; const char *tzolkin_day_name = Tzolkin_day_name[(total_days % 20)]; *day_number = tzolkin_day_number; *day_name = tzolkin_day_name; } int main() { int N; cin >> N; cout << N << endl; for (int i = 0; i < N; ++i) { Date date; char dot; scanf("%d%c%d%s%d", &date.day, &dot, &date.month, Haab_month_name, &date.year); int total_days = haab_to_days(date.day, Haab_month_name, date.year); int tzolkin_day_number; const char *tzolkin_day_name; days_to_tzolkin(total_days, &tzolkin_day_number, &tzolkin_day_name); printf("%d %s %d\n", tzolkin_day_number, tzolkin_day_name, date.year); } return 0; }
06-06
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值