面向过程:注重的是某件事情过程中的每一个步骤的实现。
面向对象:把面向过程中的每一个步骤交给一个对象去管理,只需要去用这个对象即可。
类的语法:访问限定修饰符+class+类名(大驼峰) 访问限定修饰符可省略,一般面向对象不使用public来定义类。
类就相当于一个房子模板,通过这个模板可以建造很多的房子,而类(模板)可以产生很多对象(相当于实体),这个过程,就叫实例化。
每个类都由两部分组成,分别为属性和行为。
实现面向对象:开发的时候,找对象,创建对象,使用对象。
在main方法是static类型的,而在static类型中只能调用static类型的方法,如果要调用其他类的方法,则需要new一个对象,通过这个对象去调用方法,如:
public class Demo01{
public static void main(String[] args){
Person per = new Person();//实例化,现在Person中的lit是真正存在了
per.eat();//此时lit这个人调用eat方法,输出lit吃饭
per.sleep();
}
}
class Person{
//用class来定义类,Person为类名,此处建立一个叫Person的类
//1.属性 成员变量
public String name = "lit";
public int age = 18;
public String sex = "男";
//这里都是普通成员变量
public static int qqq = 0;//qqq为静态成员变量
//2.行为 成员方法
public void eat(){
//此处为普通成员方法
int aaa = 0;//局部变量
System.out.println(name+"吃饭!");
}
public void sleep(){
System.out.println(name+"睡觉!");
}
public static void zzz(){
//此处为静态成员方法
}
}
当用Person定义变量且new Person()后,用Person类型定义的变量就为一个对象,就可以利用这个对象去调用Person类里的方法,如:per.eat()。但是上面的代码每次new一个Person类型的变量时,属性都不变,则需:
public class Demo01{
public static void main(String[] args){
Person per = new Person();//实例化,创建对象
System.out.println(per.name);
System.out.println(per.age);
System.out.println(per.sex);
per.name = "lit";//引用.成员变量
per.age = 18;
per.sex = "男";
System.out.println(per.name);
System.out.println(per.age);
System.out.println(per.sex);
per.show();
}
}
class Person{
public String name;
public int age;
public String sex;
public void show(){
System.out.println("姓名:"+name+",年龄:"+age+",性别:"+sex);
}
}
成员变量如果没有初始化,那么它的值就为所对应类型的默认值。
静态成员方法与静态成员变量需要用类名来调用,如:
public class Demo01{
public static void main(String[] args){
Person per = new Person();
Person.qqq();//输出qqq方法被调用了
System.out.println(Person.count);//输出1
System.out.println(per.count);//合法,但不合理不推荐这么调用
}
}
class Person{
public static int count = 1;
public static void qqq(){
System.out.println("qqq方法被调用了");
}
}
静态成员变量及静态成员方法不依赖与对象
public static void main(String[] args){
Person per = null;
Person.qqq();//输出qqq方法被调用了
per.qqq();
System.out.println(per.age);
//空指针异常 普通成员变量会依赖对象 每个对象都有自己的属性和值 但是静态成员变量中,变量是跟对象没关系的,所以建议类名.静态变量/方法
}
}
class Person{
public int age = 10;
public static void qqq(){
System.out.println("qqq方法被调用了");
}
}
在这里,类就相当于一个班级,而对象就相当于班级里的人,而获奖可以理解为一个属性或方法,如果班级获奖了,那么获奖这个属性是班级的,也就是这个属性是类的,也就是静态成员属性,我们说班级里的人获奖了,可以是可以,合法不合理。但是如果班级里某人获奖了,此时为普通成员变量,只跟某个成员有关,我们就不能说班级获奖了,不合法也不合理。
同理,在静态成员方法中可以修改静态成员属性的值,可以调用静态成员方法。但是如果要调用普通成员方法,必须new一个对象,通过对象.方法/属性才可已调用。在普通成员方法里可以直接调用静态成员属性/方法。
public int name ;//普通成员变量,对象的属性,存储在对象内。
public static int count;//类变量也叫静态变量,属于类本身
public final SIZE;//常量,也属于对象。
public static final COUNT;//静态常量,属于类本身。
final修饰的常量一定要大写。常量顶以后不能修改。
OOP思想:ObjectOrientedProgramming,就是面向对象的编程,OOD就是面向对象的设计,OOA就是面向对象的分析。
OOP的特征:继承、封装、多态。
什么是封装:使用关键字private来修饰成员变量或者成员方法,然后同意提供对应的get、set方法。这样做的好处是:类的调用者的使用类的成本大大降低。
public class Demo01{
public static void main(String[] args) {
Student stu = new Student();
stu.setName("lit");
stu.setAge(18);
stu.setSex("男");
stu.eat();
System.out.println(stu.getName());
System.out.println(stu.getAge());
System.out.println(stu.getSex());
stu.toString()
}
}
class Student{
private String name;
private int age;
private String sex;
public void eat(){
System.out.println(name+"eat");
}
public String getName() {
//ALT + INS 快捷键选择getter and setter
return name;
}
public void setName(String name) {
//此处的局部变量若跟普通成员变量的变量名一样的话,则写为name=name;但是会被默认为两个name都为局部变量,所以引入this工具
//在构造方法里this()只能在第一行使用表示的是对当前对象的引用。
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
// ALT+INS 快捷键选ToString
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
this的使用:this.data:访问成员变量,this.func():调用成员方法,this():调用构造方法 ,this虽然可以访问静态成员变量/方法,但是还是建议用类名去访问,而在静态方法内部,不能用this
构造方法就是没有返回值的一个方法,且方法名和类名相同。
每个类会有一个默认的不带参数的构造方法,当一个类提供了其他的构造方法,那么编译器将不会帮我们自动生成不带有参数的构造方法。
实例化一个对象分为两步,为对象分配内存、调用合适的构造方法。这就意味着构造方法不止一个。
构造方法完成之后,你才真正有了一个对象。
而this就代表当前对象的引用
public static void main(String[] args){
Person per1 = new Person();//调用不带有参数的构造方法
Person per2 = new Person("lit");//调用带有参数的构造方法
}
}
class Person{
public String name = "lit";
public int age = 10;
public Person(){
//不带有参数的构造方法
this(caocao);//调用带有一个参数的构造方法,此时this()只能放在第一行。
}
public Person(String name){
//带有参数的构造方法
this.name = name;//把传过来的参数给普通成员变量
}
}
本地代码块:
实例代码块:也叫构造代码块,一般初始化实例数据成员,每new一个对象就执行一次
静态代码块:只能初始化静态数据成员,只会执行一次
执行顺序:先执行静态的,再执行实例的,若有多个静态或实例,则按顺序来
public static void main(String[] args){
Person per1 = new Person();
System.out.println(per1.age);
System.out.println(Person.count);
System.out.println("--------------------------");
Person per2 = new Person();
System.out.println(per2.age);
System.out.println(Person.count);
}
}
class Person{
{
//实例代码块
age = 20;
System.out.println("11111111");
}
static {
//静态代码块
count = 2;
System.out.println("22222222");
}
public String name = "lit";
public int age = 10;
public static int count =1
static {
couynt = 3;
System.out.println("33333333");
}
{
age = 30;
System.out.println("44444444");
}
}
如果某个对象只需调用一次,则可以使用匿名对象。
new Person().eat();//之后找不到这个对象,因为没有对象名。