Java 中的包package package-private 相当于限定符中不写
接口 interface
覆写、覆盖、重写
例://线性表
//顺序表
注解 @Override 父类 做检查
继承的时候,只知道父亲 不知道爷爷
Java中所有对象都直接或间接的继承自一个类 Object/java.lang.Object
Java中的继承只能是单继承(c++是多继承)
有的类只能被用来继承,不能直接构造对象
class前面加abstract限定词 表示是抽象类
abstract可以修饰表示抽象方法
有的类不能被继承 抽象类(不能具体化)
======================19.8.14=
继承、接口、成员内部类、静态内部类
1.继承语法
class Baseclass{…}
class Derived extends Baseclass{…}
有访问控制权限来决定派生类是否可以访问基类的属性
package-private只要在一个包内 就可以访问
方法:
基类的方法,派生类可以直接使用(有权限的前提下)
派生类是可以覆写基类方法的(override)
1)方法名要一样
2)参数列表要一样
3)返回类型要一样或者是父类的返回类型的子类型
4)访问限定符不可以更严格 ex:public不能改成protected
对象初始化
1、父类对象(想象中)初始化一定发生在子类对象初始化之前
2、定义时初始化和构造代码块 同等地位
=19.8.15===
1.面向对象的语言
顶级(top level) public/不写
public class A{
成员级别 public/protected/不写/private
public void method{
方法级别
}
}
2.变量
1)基本数据类型: 数值(整型(byte short int long)、浮点型(float double))、字符(char)、布尔(boolean)
2)引用类型
数组类型 int[] a;
类类型 Node cur;
接口类型 interface IC{}
IC c;
java中从来没有 对象类型的变量
引用
引用是指向 /找到对象的一个线索
当引用的值是null 表示该引用没有指向任何对象
int[] a={1,2,3};
a是一个int[]的引用,指向一个int[] 的对象
class A{} class extends B{}
B是A的子类
1)A a=new A();
2)B b=new B();
3)A ab=new B(); ab是A的引用 指向B的对象
4)B ba=new A(); ba是B的引用 指向A的对象
4)是错误的 :小类型的引用无法指向大类型的对象
设计一个表现多态的数组型引用
Object[]array=new String[10];
变量有四种形式
1.形参 栈区 变量的生命周期: 变量所在的内存块的存活周期 运行时期(时间上的动态的)
2.局部变量 栈区
3.属性 堆区
4.静态属性 方法区
Java中内存的区域 栈区 堆区 方法区
方法调用的过程中 栈所起的作用
变量的定义语法;
[限定符] 变量的类型 变量的名称
属性 基本数据类型
静态属性 引用数据类型
1)在内存上为这个变量保留一块区域
2)在变量名关联到该区域
作用域 意思:空间上变量名和该区域生效的范围(空间上静态)
关于变量的赋值
定义一个类
class A extends 父类 implements接口{
属性 1、构造方法(默认无参构造方法)
静态属性
方法
静态方法
构造方法
内部类
静态内部类
}
1、方法签名:方法名称+参数列表
方法重载;方法名称相同,参数列表不同(overload)
2、覆写,发生在子类继承父类或者实现接口
1 方法名 和 形参列表相同
2 方法的返回的类型比父类的返回类型小
3 访问限定符 访问限定符只能比父类大
4 @override 注解
–>构造对象的语法:
Node node=new Node(1);
new 1)计9算对象所需空间的大小 2)申请空间 3)初始化
static 只能出现在成员级别
static 和对象进行解绑
1)静态属性
属性存在对象(堆)上 静态属性存在类(方法区)
静态方法不能够直接 调用普通方法/访问属性
class Outter{
class Inner{}
static class StaticInner{}
}
new Outter.StaticInner();
new Outter().new Inner();
==19.8.16=
super关键字
1.调用父类的构造方法
2.去访问被隐藏的父类的属性
去调用被覆写的父类的方法
关于类的加载和对象的(实例化)构造
1)类的加载load:从硬盘上找到 Node.class ,解析该文件内容,生成Node类,把Node类的信息存放到内存的方法区
2)什么情况下会触发类的加载,并且该类不在内存中
按需加载
a:实例化该类的一个对象 new Node(1);
b:使用类的静态属性或者静态方法 main.merge
c:用到子类必须要先有父类new CNode
3)其他规则
静态属性的初始化顺序:
按照代码的书写顺序,执行构造代码块和属性的初始化
执行类的构造方法
对象的构造/实例化 new Node
规则:
1 优先初始化父类的属性
2 按照下面的顺序执行初始化
(1)按照代码书写顺序,执行定义和构造代码块(先看定义)
(2)再去执行构造方法
abstract 关键字有什么作用:
1.修饰类 该类是抽象类(无法被实例化)等着被继承abstract class A{} 无法newA();
2.修饰方法 该方法是抽象方法(没有被实现的方法)abstract void method();
包含抽象方法的,必须是抽象类 抽象类不一定包含抽象方法
final 关键字:
1.修饰变量,该变量的值只能被初始化一次
2.修饰类,该类无法被继承
3.修饰方法,该方法无法被覆写
final类中不可以有abstract方法
final类final方法关系不大
…
interface 接口名 extends A,B,C{ //合同、契约
void method();
1.public
2.abstract
public abstract void method();
}
引用=>对象; 没有 引用指向引用,对象指向对象
1 引用只能指向对象,或者什么都不指向
2 数组引用 、类类型引用、接口类型的引用
3 对象: 数组对象 非抽象类类型的对象
I i=new A(); interface I {}
P p=new A(); class P{}
A a=new A(); class A extends P implements I