前言
面向对象是我们编程的基础,也是我们要追求的目标。面向对象,首先就是将对象抽象出来,对象通过属性和方法来分别对应事物所具有的静态属性(成员变量)和动态属性(方法)。
具体内容
构造函数(方法)
constructor
构造函数,和类同名,没有返回值。初始化成员变量,不加void,如果有父函数,先调用父函数构造函数,再调用子函数的构造函数。父类中须有无参构造函数。
class Worker {
private String name;
Worker(String name) {
this.name = name;
}
public String getName(){
return name;
}
}
public class TakeCarePet {
public static void main(String[] args)
{
Worker w1 = new Worker("David");
System.out.println(w1.getName());
}
}
输出结果:David
重写/重载
overload
重载,放在一个类中。
1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int, float),但是不能为fun(int, int));
2、不能重载只有返回值不同的方法名。因为返回值区分不出来。
3、存在于父类和子类、同类中。
4、不能通过访问权限、返回类型、抛出的异常进行重载;
overwrite(override)
重写。如果子类对继承父类的方法不满意,可以重写,当调用方法时会优先调用子类的方法。
特点:
1、方法名、参数、返回值相同。
2、子类方法不能缩小父类方法的访问权限。
3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
4、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
5、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
关键字
this
1、this代表当前对象
this.属性:操作当前对象的属性
this.方法:调用当前对象的方法
2、封装对象的属性的时候,经常会使用this关键字。
实例程序:
class Animal {
public String name;
Animal(String name) {
this.name = name;
}
}
static
在一段程序中,适当加入一个Static的值,使其运算后自加一,可以当作计数器。
属于所有类;第一次使用时被初始化。
成员变量分布在datasegment中;
不需要new一个对象就可以访问。类名.成员变量就可以访问。
用static声明的方法为静态方法,在调用时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员。
静态方法不再是针对某个对象的调用,所以不能访问非静态成员。
静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。
实例程序:
public class Cat {
private static int sid = 0;
private String name;
int id;
Cat(String name) {
this.name = name;
id = sid++;
}
public void info(){
System.out.println
("My name is "+name+" No."+id);
}
public static void main(String arg[]){
//赋值方式
Cat.sid = 100;
Cat mimi = new Cat("mimi");
mimi.sid = 2000;
Cat pipi = new Cat("pipi");
mimi.info();
pipi.info();
}
}
Super 当前对象的父对象
super
在子类中使用。
子类的构造方法都会首先去执行父类的构造方法,默认访问无参构造方法
因为:每一个构造方法的第一行都有一条默认的super();语句
作用:用于子类访问父类数据的初始化,只有执行了父类的无参构造方法,才能访问父类的数据
注意:当父类没有无参构造方法时,子类的构造函数必须通过this和super关键字指定要访问的带参构造方法
格式:super(...)括号中的内容由带参构造方法的参数类型决定
this()——前提是:必须已经有一个子类用super访问了父类构造方法
实例程序:
class Animal {
public String name;
Animal(String name) {
this.name = name;
}
}
class Cat extends Animal {
public String eyesColor;
Cat(String name,String eyesColor) {
super(name);
this.eyesColor = eyesColor;
}
}
final
final修饰类,该类不可以被继承
final修饰方法,该方法不能被重写。
final修饰属性,该类的初始化属性必须有值或在构造方法中赋值(只能选其一)
final修饰变量,该变量的值只能赋一次值,即变为常量。
实例程序:
public class TestFinal {
public static void main(String[] args) {
T t = new T();
}
}
final class T {
final int i = 8;
public final void m() {
}
}
class TT extends T {
}
内存分配
内存中分四块:
堆:对象生成时(属性)。
栈:局部变量
Code segment:方法。
Data segment:静态常量
访问控制
抽象类
abstract
含有抽象方法的类是抽象类。抽象方法只需声明,不需实现。
抽象类必须被继承。
抽象方法必须被重写。
抽象类不能被实例化。
interface
implements
特殊的抽象类,
所有的成员变量都是public static final。
所有的方法都是抽象的public的。
子接口可以extens父接口,而不去实现父接口中的方法。
子类implements接口后,必须实现接口中的方法。
子类可以即extends父类,同时implements接口1,接口2
接口和接口之间可以相互继承,
类和接口之间只能implements。
一个类可以实现多个接口。
接口的本质:内存中,可以看见其对象的一部分方法。
感受
知识是总结出来的,学习是需要一步一个脚印走出来的。