一、面向对象的第一条主线:类的内部成员
类
public abstract class Person{}
修饰类的关键字
四种权限修饰符的两种:缺省、pulbic
因为类在包下此时只有两个作用域,包内和项目内
private修饰类无任何意义
protected修饰类本质是为了保证子类的访问,此时也无任何意义
abstract、final
static修饰类无意义,static是指类加载时的静态属性或方法或代码块
abstract修饰类即类应当为抽象类,不能有具体的实例。
final即表明类应该是最后一代,不能有基础性。
1.属性
public static final int(String[] args)
1.1修饰属性的关键字
①四种权限修饰符:全都可用(保证封装性)
public即项目内,protected即不同包下的子类,缺省即同包内,private即类内
②static、final
static修饰属性表明该属性为静态属性,即属性在类加载时即可加载,且所有类的对象公用一个static
abstract修饰属性没有意义,继承类无需重写属性,属性继承类中重新定义即可
final修饰属性表明该属性在初始化后不可修改
static final 表明全局常量
③this、super
this表明本类的对象调用该属性
super表明父类的对象调用该属性
Person.this.属性表明外部类调用该属性,this.表明内部类调用该属性
1.2属性变量和局部变量的异同
①成员变量定义在类中,而局部变量可以是形参,方法内,构造器内。
②成员变量定义时可以有权限,而局部变量不可以有权限
③成员变量有默认值,而局部变量没有默认值
即成员变量是放在堆中的,而局部变量是放在栈中的
④共同点:成员变量和局部变量都需要先定义再赋值,都有其作用域。
1.3属性的赋值过程
①默认赋值
int num;成员变量有其初始值 0
②显式赋值------代码块赋值
两者顺序看代码先后,显式赋值在前即先显式赋值
③构造器赋值
④对象.属性或者对象.方法赋值
2.方法
public static/final/abstract void main()
2.1方法的修饰符
①四种权限修饰符(全都可用,保证封装线)
②static、final、abstract
static方法即是在类加载而加载,可以通过类.方法和对象.方法来调用
final方法即是方法不可被重写
abstract方法即是抽象方法,该方法的类一定是抽象类,且后面继承的子类必须重写该方法,否则该子类也是抽象类
③this、super
this表明该对象的方法
super表明父类的方法
Person.this.方法表明外部类的该方法,this.表明内部类调用该方法
2.2方法的重载和参数的值传递机制
①方法的重载格式
重名 + 参数个数或者形参类型不同 构成重载
②方法重载的规定
注意String… strs的写法与String[] strs的参数传递是一样的,即如果两个函数的参数是上述这两个,构不成重载,第一个可以和第二个一样通过strs[1]来访问数组
String… strs出现之后必须声明在末尾,如若出现String a, string… strs则可以判断第一个给a,后面的全给strs,如果出现在开始,则不知道a是没写还是声明。即形参中只能出现一个可变个数形参
重载是静态绑定,即在编译时就已经确定对象调用的是哪一个方法
③值传递机制
参数是基本数据类型,此时实参给形参的是真实的数据值。
参数是引用数据类型,此时实参给形参的是存储的地址值。
2.3方法的重写
①方法重写格式
名字 参数列表都相同即构成重写
②方法重写的规定
权限修饰符 static/abstract/final 数据类型 名字(参数)
权限修饰符:子类的权限修饰符不能小于父类的权限修饰符。
其中父类为private,子类无法重写方法,因为子类看不到父类的private方法。子类的权限修饰符若小于父类权限修饰符,即子类的方法只可在包内使用,而父类可在工程内使用,产生歧义。
static修饰符:只有非static的方法才有重写
static方法在类加载时已经固定,实现了静态绑定,无法再动态绑定。
abstract和final:abstract必须重写,final无法重写(无子类继承或者定义无法重写)
数据类型:返回值数据类型为基本数据类型或void则保持数据类型即可,若为类的类型,则可以返回类或者类的子类。
即返回类或者类的子类表明为多态。(向上转换)
名字参数必须都相同。
3.构造器
3.1修饰构造器的关键字
①四种权限类型
② static/abstract/final以及返回值修饰构造器无意义
③this,super
this,super本身即代表了本类的构造器以及父类的构造器。
3.2默认构造器,构造器,父类构造器
①默认构造器
默认构造器系统提供,若自己写了构造器,则系统不再提供默认构造器
②构造器的执行顺序
无显式定义构造器,系统会提供默认构造器,且在默认构造器中自动调用super()即父类的构造器
若子类显式的调用父类构造器,必须this和super二选一且放在首行。即子类若用this最终会调用super构造器
this构造器现在本类中寻找构造器,找到构造器后再向父类找构造器,再向父类的父类找构造器。即若有n个构造器,可能有n-1个this构造器,但一定有一个会调用super构造器
注意:在父类中显示声明一个有形参的构造器,则在子类中默认构造器报错,无super(),若在子类中显式的定义构造器,则需显式的提供super(args)的构造器
4.代码块
4.1修饰代码块的关键字
①权限修饰符(都不可用)
无需用权限修饰符,因为该代码时随着类创建结构到堆中时自动执行的,即与类的权限相同
②static
static修饰代码块即表明代码块执行的时间,静态代码块,则类加载时执行一次,只能调用静态方法或者静态属性。若为非静态代码块,则对象的加载到堆中执行一次,可以调用静态结构或者非静态结构
final和abstract都可以修饰类,即代码块跟着类走即可。
4.2 内存解析代码块顺序(见后面总结)
①类的执行顺序
默认,显式=代码块,构造器,对象.属性
②代码块父子的执行顺序
由父及子,静态现行
5.内部类
5.1内部类的关键字
①四种权限修饰符(都可使用)
作为外部类的属性来说
②static、final、abstract
作为外部类的属性来说,可以用static表示静态结构,类加载而加载
作为类来说,可以是final和abstract即可以无子类继承和定义抽象类
③this、super
作为内部类中的方法,可以使用this.method代表内部类对象调用方法,作为外部类的成员,可以使用Person.this.method调用外部类的方法
5.2成员内部类和局部内部类
①成员内部类分为静态和非静态
②局部内部类分为方法内,构造器内,代码块内
5.3需要关注的三个问题
①如何实例化内部类
class Person{class dog{} static class cat{}}
静态猫:Person.cat() 非静态狗 P.new dog()
②如何区分成员内部类和外部类的属性
name 内部类方法的形参
this.name 内部类的属性
Person.this.name 外部类的属性
③内部类的使用
内部类只在外部类中使用