大数据预科班8
复习
- 面向对象的特征:封装、继承、多态
- 封装--体现形式:函数、属性私有化----复用性、安全性
- 继承--extends,支持单继承---复用性、安全性、结构
- 多态--重载、向上造型、重写(两等两小一等)
- 权限修饰符:public、protected、默认、private;使用范围,从什么时候开始
- super--在子类代表父类对象的引用,可以通过super来调用父类中的方法和属性;super语句,子类的每个构造函数会直接或间接有super语句,所以在创建子类时先会创建父类。
Static
- 可修饰:变量、方法、代码块、内部类
- 静态变量
static String hobby;
这个变量称为静态变量或类变量,类加载时在方法区中的静态区并赋予初值,由于静态变量是先于对象而存在的,
可以通过对象来调用,也可通过类名直接调用,
由于该类创建的所有对象存储的是静态属性在静态区中的地址值,所有静态属性是被所有对象所共享的。
静态属性尽量少用--共享导致不安全
1.静态变量可以定义在方法中吗? --不可以,静态变量是在类加载的时候加载并初始化,方法随类加载而加载到方法区,但没有执行,在方法被调用的时候执行
2.可以在构造函数中定义静态变量吗? --不可以,因为构造函数在创建对象时才被调用
3.可以在构造代码块中初始化静态变量吗 --可以(静态先加载,构造代码块后执行)
4.this调静态变量? --可以
静态方法
- static可以修饰方法称之为静态方法或者类方法。随着类的加载而加载到方法区的静态区--只是存储在静态区
- 静态区的元素不归属与某个对象,而是归属于类;静态方法属于类;比对象先存在
- 例子:System.arraycopy();Arrays.toString();
1.System.out.println();不是静态方法//out是对象
2.静态方法中可以定义静态变量吗?--不可以,静态方法加载到静态区只是存储在静态区,并没有执行,被调用到时才会到栈内存才执行,方法执行才分配空间。
3.静态方法可以直接调用本类中的非静态方法吗?--不行(非静态方法和属性通过对象来调用,静态的先于对象存在)
4.主函数可以使用this吗?--不可以(static方法中不能用this)
5.静态函数可以重载吗?--可以(重载:方法名一致,参数不一致,不要求修饰符和返回值)
6.静态方法可以重写吗?--不可以(验证:@Overrid 上造型调用)
7.父子类可以存在方法签名完全一致的静态方法吗?--可以
8.父子类存在方法签名一致的时候,要么两者都是静态要么两者都是非静态。 - 重写和重载--多态针对的是对象,从对象的层面来看的;静态是从类层面来看的 - 多态针对的是方法而言的
静态代码块
class Demo{
static{
}
}
- 在类内用static{}圈住的代码
- 类加载的时候执行,且只执行一次
- 实际上静态代码块是随着类的加载而加载到静态区,在类创建对象获得执行方法执行一次
- 终其一生只执行一次
- 本类执行顺序(静态代码块-》构造代码块-》构造函数)
- 父子类执行顺序()
**静态优于对象而存在**
**父类优于子类而存在**
1. 创建子类前,先创建父类
2. 加载父类
3. 执行父类静态代码块
4. 执行子类静态代码块
5. 父类构造代码块
6. 父类的构造方法
7. 子类构造代码块
8. 子类构造方法
代码块与变量的定义上下位置:标记
例1:
int i=5;
{
i=6;
}
结果i=6
例2:
{
i=3;
}
int i=1;
编译不报错,执行结果为i=1
例3:
{
i=1;
i+=1;
}
int i=1;
编译报错
final
- 修饰变量,表示这个变量的值不可更改--常量
- final修饰的值
package com.peng.demo;
public class DE1 {
final int i;
}
编译出错
package com.peng.demo;
public class DE1 {
final int i;
{
i = 9;
}
}
编译通过
- 在java中说的常量往往指的是静态常量(length、in、out,NaN非数字)
- 注:函数调用时参数的性质可能会变
- 对于基本类型来说,不可变;对于引用数据来说,地址不可变,数据可能变了。
- 修饰函数--表示此方法为最终方法(该方法不能被重写,可以重载)
- 静态方法可以用final修饰
- final修饰类,表示这是一个最终类--这个类不能被继承(eg:String类,System类)
抽象类
- 将一些名称一致,细节不同的行为提取到父类中定义为抽象方法,抽象方法所在的类就是抽象类
- 抽象类不能创建对象,并且子类继承它必须实现其抽象函数,或者也定义为一个抽象类
- 任何一个类都有构造函数,不管能不能创建对象
- 抽象类中一定有抽象函数吗? 不一定
- 抽象类可以有静态函数
- 抽象类中可以定义普通方法
- 把类中的公共方法提取,并且不用写方法体
- 不能直接创建对象(可以使用匿名内部类【类】)
abstract class Pet{
abstract void eat();
}
class Dog extends Pet{
void eat(){
}
}
- 具体的类继承抽象类时,必须实现抽象类中的抽象方法,否则声明成抽象类
- 抽象类与普通类区别:抽象类可以有抽象方法;抽象类不能创建对象。
- 抽象方法可以和普通方法重载
- 抽象方法不可用static修饰--因为静态方法不能被重写,抽象方法必然被重写
- 抽象方法不能用final修饰
- 抽象方法可以用默认修饰吗?--可以
- 抽象方法可以用private修饰?--不可用
子类继承不到父类的
- private属性、方法
- 构造方法
- 代码块(连名字都没有,哈哈)
接口
- 所有方法都是抽象方法
- interface声明一个接口
- 规范作用(理解为模板)
interface a{
public static final int PI=3.14;
public abstract void add(int a):
}
- 通过implements让类与接口产生联系,然后重写抽象方法
- 接口不能创建对象--接口的多态(向上造型)
- 接口中没有构造函数(interface cannot constructs)
- 接口不是类
- 接口能定义属性public static final 类型 变量 =值;
- 接口定义的方法public abstract,不可以用其他来修饰
java支持单继承,多实现(用,隔开),但是有冲突
package com.peng.demo;
public class DE1 implements a, b {
/*冲突
@Override
public int a() {
return 0;
}
*/
}
interface a {
int a();
}
interface b {
String a();
}
- 接口和接口可以继承,而且还是多继承(接口中的方法为抽象方法,没有方法体)