JavaSE语法(部分)
继承
继承中变量的访问特点
在子类方法中访问一个变量/成员方法
子类局部范围找
子类成员范围找
父类成员范围找
如果没有就报错(不考虑父亲的父亲)
super
this:代表本类对象的引用
super:代表父类存储空间的标示(可以理解为父类对象引用)
this和super访问特点
继承中构造方法的访问特点
子类中所有的构造方法默认都会访问父类中无参的构造方法
因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化前,一定会完成父类的数据初始化。
每一个子类构造方法的第一条语句,默认都是super()
如果父类中没有无参构造方法,只有有参构造方法
通过使用super关键字去显示地调用父类的带参构造方法
在父类中自己提供一个无参构造方法
推荐 自己给出无参构造方法
方法重写注意事项
私有方法不能被重写(父类私有成员子类是不能继承的)
子类方法访问权限不能更低(public>protected>friendly>private)
final
final修饰指的是基本类型的数据值不能发生改变
final修饰指的是引用类型的地址值不能发生改变,但是地址里面的内容是可以发生改变的。
final修饰的类不能被继承
static
static修饰的特点
被类的所有对象共享
static的访问特点
非静态的成员方法
能访问静态的成员变量
能访问非静态的成员变量
能访问静态的成员方法
能访问非静态的成员方法
静态的成员方法
能访问静态的成员变量
能访问静态的成员方法
总结:静态成员方法只能访问静态成员
多态
多态中成员访问特点
成员变量: 编译看左边,执行看左边
成员方法: 编译看左边,执行看右边
多态的好处和弊端
好处:提高程序的拓展性
具体表现在定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作。
弊端:不能使用子类的特有功能。父类的方法可以重写使用到子类中。
多态存在的三个条件
1、有继承关系
2、子类重写父类方法或者实现关系(接口)
3、父类引用指向子类对象
对于第二点:以下三种类型的方法没有办法表现出多态的特性(因为不能被重写)
1、static方法,因为被static修饰的方法是属于类的,而不是属于实例的。
2、final方法,因为被final修饰的方法无法被子类重写。
3、private方法和protected方法,前者是因为被private修饰的方法对子类不可见,后者是因为尽管被protected修饰的方法可以被子类见到,也可以被子类重写,但是它是无法被外部所引用的,一个不能被外部引用的方法,怎么能谈多态呢。
多态实现的原则
1、向上转型是自动的。Father f = new Childen()是自动的,不需要强转。
2、向下转型要强转。Children c = (Children)new Father(),让父亲知道它要转成具体的哪个子类。
3、父亲引用指向子类对象,子类重写了父亲的方法,调用父亲的方法,实际就是调用子类重写父亲的该方法。也就是成员方法的调用原则:编译看左边,执行看右边。
何时使用向下转型?
1)一定是发生多态: Object obj = new Student();
2)一定是想要去访问(调用)子类对象的特有属性或方法。
Stringstr = ((Student)obj).getSchool();
抽象类
在java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
抽象类特点
抽象类和抽象方法都必须使用abstract关键字修饰
抽象类而中不一定有抽象方法,有抽象方法的类一定是抽象类。
抽象类不能实例化。但可以参照多态的方式,通过子类对象实例化,叫做抽象类多态。
抽象类的子类
要么重写抽象类中的所有抽象方法
要么本身就是一个抽象类。
抽象类的成员特点
成员变量:可以是变量,也可以是常量
构造方法:
有构造方法,但是不能实例化
其作用是用于子类访问父类数据的初始化
成员方法:
可以有抽象方法:限定子类必须完成某些动作
也可以有非抽象方法,提高代码的复用性。
接口
接口的特点
用interface关键字修饰
类的实现用implements表示
接口不能实例化
但可以参照多态的方式,通过实现类对象实例化 ,叫做接口多态。
接口的实现类
要么重写接口中所有抽象方法
要么本身是抽象类
接口的成员特点
成员变量
只能是常量
默认修饰符public static final
构造方法
接口没有构造方法,因为接口主要是对行为进行抽象,是没有具体存在。
一个类如果没有父类,默认继承自Object类。
成员方法
只能是抽象方法
默认修饰符:public abstract
类和接口的关系
类和类的关系
继承关系,只能单继承,但是可以多层继承
类和接口的关系
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
接口和接口的关系
继承关系,可以单继承,也可以多继承
抽象类和接口的区别
成员区别
抽象类 变量,常量,构造方法,抽象方法,非抽象方法
接口 常量,抽象方法
关系区别
类与类 继承,单继承
类与接口 实现,可以单实现,也可以多实现
接口与接口 继承,单继承,多继承
设计理念区别
抽象类 对类抽象,包括属性、行为
接口 对行为抽象,主要是行为
抽象类是对事物的抽象,而接口是对行为的抽象
内部类
类名作为形参和返回值
方法的形参是类名,其实需要的是该类的对象
方法的返回值是类名,其实返回的是该类的对象
抽象类名作为形参和返回值
方法的形参是抽象类名,其实需要的是该抽象类的子类对象
方法的返回值是抽象类名,其实返回的是该抽象类的子类对象
接口名作为形参和返回值
方法的形参是接口名,其实需要的是该接口的实现类对象
方法的返回值是接口名,其实返回的是该接口的实现类对象
内部类
内部类访问特点:
内部类可以直接访问外部类的成员,包括私有
外部类要访问丙部类的成员,必须创建对象
成员内部类
成员内部类外界创建对象使用方式:
格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
范例:Outer.Inner oi = new Outer().new Inner();
局部内部类
是在方法中定义的类,所以外界无法直接使用,需要在方法内部创建对象并使用,该类可以直接访问外部类的成员,也可以访问方法内的局部变量。
匿名内部类
格式:
new 类名或接口名() {
重写方法;
};
本质是一个继承了该类或者实现了该接口的子类匿名对象。
Math类常用方法
public static int abs(int a) 返回参数的绝对值
public static double ceil(double a) 返回大于或等于参数的最小double值,等于一个整数
public static double floor(double a) 返回小于或等于参数的最大double值,等于一个整数
public static int round(float a) 按照四舍五入返回最接近参数的int
public static int max(int a,int b)返回两个int值中的较大值
public static int min(int a,int b)返回两个int值中的较小值
public static double pow(double a,double b)返回a的b次幂的值
public static double random()返回值为double的正值,[0.0,1.0)
System类常用方法
public static void exit(int status) 返回当前时间(以毫秒为单位)
public static long currentTimeMillis() 终止当前运行的Java虚拟机,非零表示异常终止
Object类
Object是类层次结构的根,每个类都可以将Object作为超类。所有类都直接或者间接的继承自该类
构造方法: public Object()
回想面向对象中,为什么说子类的构造方法默认访问的是父类的无参构造方法?
因为它们的顶级父类只有无参构造方法
Arrays类
public static String toString(int[]a) 返回指定数组的内容的字符串表示形式
public static void sort(int[a]) 按照数字顺序排列指定的数组
包装类
Int转String
方法一: String s = "" + (int)number;
方法二: String s = String.valueOf(number);
String转Int
方法一:
String s = "100";
Integer i = Integer.valueOf(s);
int x = i.intValue();
// String -> Integer -> int
方法二:
int x = Integer.parseInt(s);
Date类
public Date() 分配一个 Date对象,并初始化,以便它代表它被分配的时间,精确到毫秒
public Date(Long date) 分配一个Date对象,并将其初始化为表示从标准基准时间起指定的毫秒数
public long getTime() 获取的是日期对象从1970年1月1日O0:00:00到现在的毫秒值
public void setTime(long time) 设置时间,给的是毫秒值
SimpleDateFormat类
public SimpleDateFormat() 构造一个SimpleDateFormat,使用默认模式和日期格式
public SimpleDateFormat(String pattern) 构造一个SimpleDateFormat使用给定的模式和默认的日期格式
从Date到String
public final String format(Date date):将日期格式化成日期/时间字符串
从String到Date
public Date parse(String source):从给定字符串的开始解析文本以生成日期
Calendar类
Calendar提供了一个类方法getlnstance用于获取Calendar对象,其日历字段已使用当前日期和时间初始化:
Calendar rightNow = Calendar.getlnstance();
此时的Calendar对象rightNow是具体格式化的。
常用方法
public int get(int field) 返回给定日历字段的值
public abstract void add(int field, int amount) 根据日历的规则,将指定的时间量添加或减去给定的日历字段
public final void set(int year,int month,int date) 设置当前日历的年月日