继承
就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为
重写(Override)
方法重写 :子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。声明不变,重新实现
Java只支持单继承,不支持多继承。
abstract
使用 abstract 关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体。
继承抽象类的子类必须重写父类所有的抽象方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该父类的抽象方法,否则,从最初的父类到最终的子类都不能创建对象,失去意义。
抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。
理解:假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义。
抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的
理解:子类的构造方法中,有默认的super(),需要访问父类构造方法。
抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
理解:未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的类结构设计
扫描二维码关注公众号,回复: 11102630 查看本文章
抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类
final关键字
final: 不可改变。可以用于修饰类、方法和变量。
类:被修饰的类,不能被继承。
方法:被修饰的方法,不能被重写。
变量:被修饰的变量,不能被重新赋值。#权限修饰符 在Java中提供了四种访问权限,使用不同的访问权限修饰符修饰时,被修饰的内容会有不同的访问权限,
public:公共的。
protected:受保护的
default:默认的
private:私有的
Object对象类
java.lang.Object
类是所有类的父类(又叫根类,超类,基类),它里面写了所有子类应该具有的共同功能,为了让所有类都可以使用这些共同功能,所有类都直接或者间接的继承Object类(能够说出Object类的特点)
根据JDK源代码及Object类的API文档,Object类当中包含的方法有11个。主要学习其中的2个:
public String toString()
:(对象在内存中看不见摸不着,所以提供方法,)把对象变成带有地址值的字符串 在我们直接使用输出语句输出对象名的时候,其实通过该对象调用了其toString()方法。public boolean equals(Object obj)
:比较两个对象的地址值是否相等,相等返回true,否则返回false
Date类,总结:日期类,模拟日期形式的时间,可以调用getTime方法精确到毫秒,得到日期时间的时间毫秒值,其构造方法,无参数表示当前时间,有参数就有参照物时间加上方法传入时间,参照物时间为1970年1月1日0时0分0秒,中国要加多8个小时!
public Date()
:分配Date对象并初始化此对象,以表示分配它的当前时间(可以精确到毫秒)。public Date(long date)
:分配Date对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即1970年1月1日00:00:00 GMT)以来的时间,可以精确到毫秒。
巧记,构造方法,无参数表示当前时间,有参数就有参照物时间,1970年1月1日0时0分0秒。
import java.util.Date;
public class Demo01Date {
public static void main(String[] args) {
// 创建日期对象,输出当前的时间,能够使用日期类输出当前日期!!!
System.out.println(new Date()); // Tue Jan 16 14:37:35 CST 2018
//用println方法打印引用数据类型的变量名或者说对象名时,系统默认不写也是写,会调用toString方法!
System.out.println(new Date().toString()); // Tue Jan 16 14:37:35 CST 2018,跟上面是一样的
// 创建日期对象,把当前的毫秒值转成日期对象,结果为指定格式带有时期时间的字符串
System.out.println(new Date(0L)); // Thu Jan 01 08:00:00 CST 1970//
}
}
public long getTime()
把日期对象转换成对应的时间毫秒值,可以精确到毫秒,用这个得到时间方法
DateFormat类,日期格式化,把日期格式化为指定的字符串,由于它是抽象类,所以用的是它的子类SimpleDateFormat,通过构造方法传入格式,拿到对象名调用format方法把Date对象格式化为字符串,反过来就是解析,调用的是parse方法,巧记简单,simple
java.text.DateFormat
是日期/时间格式化子类的抽象类,我们通过这个类可以帮我们完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换。
- 格式化:按照指定的格式,把Date对象转换为String对象。
- 解析:反过来就是解析,即按照指定的格式,把String对象转换为Date对象。
import java.text.DateFormat;
import java.text.SimpleDateFormat;
public class Demo02SimpleDateFormat {
public static void main(String[] args) {
// 对应的日期格式如:2018-01-16 15:06:38
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
}
常用方法
DateFormat类的常用方法有:
public String format(Date date)
:格式化,就是把Date对象格式化为字符串,反过来就是解析public Date parse(String source)
:反过来就是解析,把字符串解析为Date对象
请使用日期时间相关的API,计算出一个人已经出生了多少天。
思路:
1.获取当前时间对应的毫秒值
2.获取自己出生日期字符串对应的毫秒值
3.两个时间相减(当前时间– 出生日期)
代码实现:
public static void function() throws Exception {
//不要记,简单,Simple
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
String birthday = "1988年04月10日";//字符串,变成时间Date类,解析p,格式化f,pf
Date d = sdf.parse(birthday);//变成时间毫秒值
long myTime = d.getTime();//出生时间毫秒值
//当前时间毫秒值减去出生时间毫秒值,就是我活到现在有多久时间毫秒值
long currentTime = new Date().getTime();
System.out.println((currentTime-myTime)/1000/60/60/24/365);//11003天,/365,年,岁30
}
System类
java.lang.System
类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作,在System类的API文档中,常用的方法有:
public static long currentTimeMillis()
:返回以毫秒为单位的当前时间。public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
:将数组中指定的数据拷贝到另一个数组中。
arraycopy方法
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
:将数组中指定的数据拷贝到另一个数组中。
数组的拷贝动作是系统级的,性能很高。System.arraycopy方法具有5个参数,含义分别为:
参数序号 | 参数名称 | 参数类型 | 参数含义 |
---|---|---|---|
1 | src | Object | 源数组 |
2 | srcPos | int | 源数组索引起始位置 |
3 | dest | Object | 目标数组 |
4 | destPos | int | 目标数组索引起始位置 |
5 | length | int | 复制元素个数 |
练习
将src数组中前3个元素,复制到dest数组的前3个位置上复制元素前:src数组元素[1,2,3,4,5],dest数组元素[6,7,8,9,10]复制元素后:src数组元素[1,2,3,4,5],dest数组元素[1,2,3,9,10]
import java.util.Arrays;
public class Demo11SystemArrayCopy {
public static void main(String[] args) {
int[] src = new int[]{1,2,3,4,5};
int[] dest = new int[]{6,7,8,9,10};
System.arraycopy( src, 0, dest, 0, 3);
/*代码运行后:两个数组中的元素发生了变化
src数组元素[1,2,3,4,5]
dest数组元素[1,2,3,9,10]
*/
}
}
StringBuilder类
在API中对String类有这样的描述:字符串是常量,它们的值在创建后不能被更改。
如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。为了解决这一问题,可使用java.lang.StringBuilder
类。**
构造方法
根据StringBuilder的API文档,常用构造方法有2个:
public StringBuilder()
:构造一个空的StringBuilder容器。public StringBuilder(String str)
:构造一个StringBuilder容器,并将字符串添加进去。
public class StringBuilderDemo {
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder();
System.out.println(sb1); // (空白)
// 使用带参构造
StringBuilder sb2 = new StringBuilder("itcast");
System.out.println(sb2); // itcast
}
}
常用方法,即能够说出使用StringBuilder类可以解决的问题
StringBuilder常用的方法有3个:
public StringBuilder append(...)
:添加任意类型数据的字符串形式,并返回当前对象自身。public String toString()
:将当前StringBuilder对象转换为String对象。public StringBuilder reverse()
:将当前StringBuilder对象里面的内容进行反转,如abc反转后变成cba
append方法
append方法具有多种重载形式,可以接收任意类型的参数。任何数据作为参数都会将对应的字符串内容添加到StringBuilder中。例如:
public class Demo02StringBuilder {
public static void main(String[] args) {
//创建对象
StringBuilder builder = new StringBuilder();
//public StringBuilder append(任意类型)
StringBuilder builder2 = builder.append("hello");
//对比一下
System.out.println("builder:"+builder);
System.out.println("builder2:"+builder2);
System.out.println(builder == builder2); //true
// 可以添加 任何类型
builder.append("hello");
builder.append("world");
builder.append(true);
builder.append(100);
// 在我们开发中,会遇到调用一个方法后,返回一个对象的情况。然后使用返回的对象继续调用方法。
// 这种时候,我们就可以把代码通过.连在一起,像条链子,叫链式编程,如append方法一样,代码如下
//链式编程
builder.append("hello").append("world").append(true).append(100);
System.out.println("builder:"+builder);
}
}
toString方法
通过toString方法,StringBuilder对象将会转换为不可变的String对象。