大纲:面向对象编程的基础知识和注意事项
- 类和对象
- 类
- 内存管理机制
- 继承
- 构造方法
- 向上造型
- 重写(与重载)
- 抽象类和抽象方法
- 静态(常量,静态方法)
- 内部类和外部类
具体如下:
- 类和对象
1,类的定义class:同一事物的统称,封装一类事物的属性和行为载体。通过类来生存对象,具有相同特性和行为的一类事物
对象object:
事物存在的实体:分静态特性(属性)int age,String name,String address 和动态部分(行为/方法)
对象是类的实例
符合某个定义所产生的实例
2,创建类和对象
public class Student {
public static void main (String[] arg) {
Student zd=new Student();
}
}
注意new对象,会给所有成员变量赋值默认值。
- 方法的签名和重载:
方法名+参数列表:void.show(int age){}
重载:同一类中,方法名相同,参数列表不同。
void show(int age){}与void show(int age,String name){}
注意与{} 返回值无关
主要便于用户的调用
- 成员方法(函数):
分为四种:没有返回值类型void,没有传入参数;没有返回值,有传入参数(参数类型 参数名);
有返回值()没有传入参数();有返回值,有传入参数。
- 构造方法(构造函数):
1,作用:给成员变量赋初始值
与类同名,没有返回值类型,连void都没有。new对象时自动调用这个构造方法。构造方法可以2,重载。
如Student (int age,String name){}
调用:Studeng ls=new Student(23,"fengjinjin");
- this 关键字
需要注意成员变量和局部变量同名时使用。
int age;
String name;
Student (int age,String name){
this.age=age;
this.name=name;
}
- 内存管理(以及内部机制,类加载)-面试重难点
堆:new出来的对象和成员变量都在堆中
栈:局部变量和方法中的参数
方法区:class 字节码文件,包括静态变量和所有方法
- 继承:extends
超类/父类(共同属性和行为)Seaobject,子类/派生类
派生类继承了超类的,就可以访问超类的行为方法和变量。反之不行。
如潜艇的width,height,x,y,speed变量都是一样共有行为
move 移动等也是共有行为,可以列在超类中。就可以代码复用。
class Seaobject{
int width;
int height;
int x;
int y;
int speed;
}
void move(){}
class obsersubmarine extends Seaobject{}
class mine extends Seaobject{}
派生类的构造方法,如果没有调用超类的构造方法,默认是super()调用。
super :指代当前对象的超类对象
- 向上造型
超类的引用指向派生类的对象。如 Seaobject sea=new Obsersubmarine();
引用类型是Seaobject,对象Obsersubmarine
- 重写 override/overriding
发生在父子类中,方法名相同,参数列表相同。重写方法被调用,看对象的类型。
void 和基本类型时候,必须相同;引用类型,必须小于或等于。
如:class Person{
student sayHi(){}
}
如下这种就是错误:class Teacher extends Person{
int sayHi(){}
}
比如student sayHi(){} 就是正确。
派生类方法抛出的异常小于或等于超类。
另外还有派生类访问权限大于或等于超类。
权限:public(公开的)>protected受保护>默认>private 私人,本类
派生类方法的返回值小于或者等于超类方法。
注意:抽象方法 abstrac,必须同步修改类class。加abstract ,就是抽象类。方法必须重写
- 重写跟重载的区别
重写是父子类的同名、同参。重载就是同类的同名,不同参数。
- final 最终的
跟修饰static final ,常量(必须大写DEAD) ,必须赋值=5,不能修改=8。final voidshow(){}修饰方法也不能重写。
final class Aoo{} 修饰类也不能被继承 extends
适用于一次赋值不变,多次被使用。
- static 静态变量
属于类,存在着方法区的,只有一份。
通过类. 来访问 。一般是共享的音乐视频等
静态方法:也是属于类,存在方法区中,只有一份。
通过类.来访问
class Student{
int age;
static String name;
void sayHi(){
System.out.println(age); //隐式this.age
System.out.println(Student.name)}
}
- 静态块
属于类,在类被加载期间自动执行,因为一个类只能被加载一次,所以只执行一次。
- 抽象方法,抽象类
abstract,class和方法前都必须加abstr,必须重写方法。
抽象方法的类也必须抽象abstract。
抽象类不能被new对象实例。
抽象类的意义:封装共有属性和行为。为派生类提供向上造型。为派生类制定规则,必须修改方法。
- 内部类,外部类
1,内部可以访问外部类。内部的也可以在外部类中创建new对象
class Aoo{
int a;
class Boo{
System.out.println(Aoo.a)}
}
里面有隐式的this Aoo.this.a
内部类都有独立的class字节码文件
2,匿名内部类
对象只被创建一次,可以使用。
匿名内部类不能修改外部局部变量的值,会默认final.