一.对象和类
1.对象和类的定义
对象可以看成是静态属性(成员变量)和动态属性(方法)的封装体
类是用来创建同一类型对象的“模板”,在一个类中定义了该类对象所应具有的成员变量以及方法
2.对象和类是分不开的,必须先有类 才有对象
成员变量+方法=类 --new-> 对象
类是静态的概念,对象是new出来的,位于堆内存。同一个类的每个对象有不同的成员变量存储空间,同一类的每个对象共享该类的方法。
类的每个成员变量在不同的对象中都有不同的值,而方法只有一份,执行的时候才占用内存
约定俗成的命名规则:
类名的首字母大写
变量名和方法名的首字母小写
运用驼峰标识
二.构造方法
构造方法是定义在Java类中的一个用来初始化对象的函数,与类同盟切没有返回值(void也不可以),当没有指定构造函数时,编译器为类自动添加形如 类名(){} 的构造函数,若用户有定义构造方法,系统则不自动添加。
public class Person{
int id;
int age=20;
//下面就是自定义的构造方法
Person(int _id,int _age){
id=_id;
age=_age;
}
public static void main(String args[]){
Person p1=new Person(1,22);
}
}
使用 new +构造方法 创建一个新的对象
三.方法的重载(overload)
方法的重载指一个类中可以定义有相同名字、但参数不同的多个方法。调用时,根据不同的参数列表选择对应的方法。(方法名一样,参数一样,但返回值不一样,则不是重载)
与普通方法一样,构造方法也可以重载。
int max(int a,int b,int c)
int max (int a,int b)
四.this 关键字
在类的方法定义中使用的this关键字代表使用该方法的对象的引用
当必须指出当前使用方法的对象是谁时要使用this
有时使用this可以处理方法中成员变量和参数重名的情况
this 可以看着是一个变量,它的值是当期对象的引用
例
public class Leaf{
int i=0;
Leaf(int i){ this.i=i;}
Leaf increament(){
i++;
return this;
}
void print(){System.out.println("i="+i);}
public static void main(String args[]){
Leaf leaf=new Leaf(100);
leaf.increament().increament().print();
}
}
执行结果:i=102
五.static 关键字
在类中用static 声明的成员变量是静态成员变量,它为该类的公用变量,在第一次使用时初始化,对于该类的所有对象来说static成员变量只有一份。
用static声明的方法为静态方法,在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员。
可以通过对象应用或类名(不需要实例化)访问静态成员
六.类的继承
Java中使用extends关键字实现类的继承机制,语法为<modifier> class <name> [extends <superclass>]
通过继承,子类自动拥有了基类(superclass)的所有成员(成员变量和方法)
Java 只支持单继承,不允许多继承(一个子类只能有一个基类,一个基类可以派生出多个子类)
七.访问控制
Java 权限修饰符 public protedted private 置于类的成员定义前,用来限定其它对象对该类对象成员的访问权限
对应class的权限修饰只可以用public 和default
八.方法的重写
在子类中可以根据需要对从基类中继承来的方法进行重写。重写方法必须和被重写方法具有相同方法名称、参数列表和返回类型,重写方法不能使用比被重写方法更严格的访问权限
class Person{
private int age;
private String name;
public void setAge(int _age){
age=_age;
}
public void setName(String name){
this.name=name;
}
public int getAge(){
return age;
}
public String getName(){
return name;
}
public String info(){
return "Name="+name+"Age="+age;
}
}
class Student extends Person{
private String sex="male";
public void setSex(String _sex){
sex=_sex;
}
public String getSex(){
return sex;
}
// 下面这个方法就是对父类方法的重写
public String info(){
return "Name="+getName()+"Age="+getAge()+"sex="+sex;
}
}
public class OverWrite {
public static void main(String agrs[]){
Student s=new Student();
Person p=new Person();
p.setAge(18);
p.setName("Amy");
s.setSex("Female");
System.out.println(p.info());
System.out.println(s.info());
s.setAge(88);
System.out.println(p.info());
System.out.println(s.info());
}
}
九.super 关键字
在Java类中使用super调用父类
继承中的构造方法
1.子类的构造的过程中必须调用其基类的构造方法
2.子类可以在自己的构造方法中使用super(argument _list)调用基类的构造方法
使用this(argument_list)调用本类的另外的构造方法
如果调用super,必须写在子类构造方法的第一行
3.如果子类的构造方法中没有显示地调用基类构造方法,则系统默认调用基类无参数的构造方法
4.如果子类构造方法中既没有显示调用基类构造方法,而基类中又没有无参的构造方法,则编译出错
class FatherClass{
public int value;
public void f(){
value=100;
System.out.println("FatherClass.value="+value);
}
}
class childClass extends FatherClass{
public int value;
public void f(){
// 下面这句调用的是父类的
super.f();
value=200;
System.out.println("ChildClass.value="+value);
System.out.println(value);
System.out.println("FatherClas.value="+super.value);
}
}
public class TestSuper {
public static void main(String args[]){
childClass c=new childClass();
c.f();
}
}
十.Object 类
Object 类是所有Java类的根基类
如果在类的声明中未使用extend是关键字指明其基类,而默认基类为Object类
Object类中定义有public String toString()方法,其返回值是String类型,在进行String与其它类型数据的连接
操作时(如:System.out.println("info"+person)) 将自动调用该对象类的toString()方法
Object类中定义有public boolean equals(Object obj)方法
十一.对象转型(casting)
一个基类的引用类型变量可以指向其子类的对象
一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)
可以使用引用变量 instanceof类名 来判断该引用型变量所指向的对象是否属于该类或该类的子类
子类的对象可以当作基类的对象来使用称作向上转型(upcasting),反之成为i向下转型(downcasting)