对象:一切皆为对象。
对象包括两部分内容:属性(名词形容词),行为(动词)。
对象和对象之间是有关系的。 派生(子类与父类的关系),关联,依赖。
类:对同一类别的众多对象的一种抽象。
类,还是用来生成对象的一种模板,对象是类的一种具体化的表现。
面向对象的三大特性:封装,继承,多态。
一:类的定义:
class 类名{
访问修饰符 成员变量的定义;
访问修饰符 成员函数(方法)的定义;
}
例1:
public class Student{
public String name;
public void score(){
System.out.println(name+"的成绩是97分");
}
}
例2:
public class Student {
private String name;
public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
}
void score(){
System.out.println(name+"的成绩是97分");
}
}
二:访问修饰符:(4种)
默认的(只能在当前包中被调用);
protecetd (可以被同类继承中的所有类调用)
private,私有。(只能被当前所在的花括号内的代码访问到,除了这个花括号就访问不到了);
public ,公共的(可以被所有的累访问到)
三:类的创建:类的实例化:用类来创建对象。
类名 变量名 = new 类名();
例如(同上面的函数):Student s = new student();
四.构造函数:
a.必须与类名相同
b.不能有返回类型。
c.自动被执行。对象new出来的时间自动被执行。
d.一般都是public
例1.因为成员变量是public公用的,所以当我把类实例化之后,我就可以用s.name=“张三”给name赋值,这样在输出时就会输出 张三的成绩是97分
例2.以为成员变量是private私有的,所以当我把类实例化之后,我是没有办法用s.来调用其变量的,但是我可以在Student类里面创建一个setName方法和getName方法,但是这两个方法都必须是实例的,不能是static静态的也不能是private私有的,修饰符必须是可以访问的到的所以我们可以设置成public的。这样我们可以用s.setName和s.getName来进行赋值和取值。
五.类的主方法
主方法是累的入口点,他定义了程序从何处开始:主方法提供对程序流向的控制,Java编译器通过主方法来执行程序。主方法语句如下:
public static void main(String[] args){
方法体
}
主方法是静态的。要直接在主方法中调用其他方法,则该方法也必须静态的;
主方法没有返回值;
主方法的形参为数组。
从这里我们就可以看出来(static是静态成员的关键字,void没有返回类型,main是函数名,String[]形参的数据类型,agrs变量名);我们是可以更改的。不过这是java中规定的默认主函数,程序一经运行jvm便会自动寻找mian函数病自动调用生成对象。
六.构造函数与成员变量初始化的执行次序?
1.成员变量的初始化最先执行,其次在执行构造函数,所以如果在成员变量和构造函数中对同一变量进行赋值,那么构造函数中的赋值便会覆盖成员变量的赋值!
2.
a.成员变量的定义,如果不赋初始值,会使用默认值。而函数内的局部变量不赋值初始值会出问题。
b.成员变量可以被当前类的所有的成员函数都可以调用。而函数里面的变量只能在当前花括号中可以使用。
3.在给变量赋值时有以下几种赋值方式:
a.直接在成员变量初始化时给其赋值;
public class Book {
private String shuHao;
private String shuMing;
private String zouZhe;
private String chuBanShe;
private double dingJia;
}
b.在构造函数中给其赋值;
public class Book {
public Book(){
this.shuHao;
this.shuMing;
this.zouZhe;
this.chuBanShe;
this.dingJia;
}
}
当我把Book类实例化时,Book b=new Book();在我new的同时调用了Book();这个方法,所以构造函数是一经对象实例化时自动被执行。(如果在一个类中没有任何的构造函数时,编译器会在该类中自动创建一个不带参数的构造方法。)
注意:this关键字:当前对象。不是当前类。
c.在构造函数参数中定义,在new函数时进行赋值
public class Book {
public Book(String shuHao,String shuMing,String chuBanShe,double dingJia){
}
}
Book bo=new Book("0123355","西游记","山东出版社","100.0");
重载:
1.函数名相同,参数不同(数量,类型)。这两个函数就形成了重载。所谓的类型不同包括,同是两个String和一个int的构造函数,但是他们的排列位置不同(不是一一对应的那么它也是可以形成重载的)
2.重载只跟函数名和参数有关系。
3.重载了的函数,会自动跟据调用的实参来决定调用哪个函数。(当我在new时,会根据所填的相应的实际参数的数量和类型,自动调用对应的函数)
4.除了构造函数可以重载,普通成员函数也可以重载。(还是2.说的只要函数名相同,参数不同(数量,类型)那么就可以形成重载)
例:(构造函数)这些都是可以形成重载的
public Book2(){ this.shuMing="红楼梦"; this.shuHao=Math.random()*1000+""; this.zuoZhe="曹雪芹"; this.jiaGe=100; } public Book2(String sm,String sh,String zz,double jg){ this.shuMing=sm; this.shuHao=sh; this.zuoZhe=zz; this.jiaGe=jg; } public Book2(String sm,String sh,double jg){ this.shuMing=sm; this.shuHao=sh; this.jiaGe=jg; }
例:普通函数
public void YouHui(){ this.jiaGe=this.jiaGe*0.9; }
public void YouHui(double dz){ this.jiaGe=this.jiaGe*dz; }
public void YouHui(double dz,String sm){ this.shuMing=sm; this.jiaGe=this.jiaGe*dz; } 1. bo.YouHui(); System.out.println(bo.jiaGe+bo.shuMing); 2. bo.YouHui(0.4); System.out.println(bo.jiaGe+bo.shuMing); 3. bo.YouHui(0.4,"西游记"); System.out.println(bo.jiaGe+bo.shuMing);