C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
JAVA是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
面向过程注重的是过程,在整个过程中所涉及的行为,就是功能。
面向对象注重的是对象,也就是参与过程所涉及到的主体。是通过逻辑将一个个功能实现连接起来
1.面向对象是思考问题的一种思考方式,是一种思想。 2.类就是一类对象的统称。对象就是这一类具体化的一个实例。 3.面向对象的好处:将复杂的事情变简单了,只要面对一个对象就行。
面向对象设计把握一个重要的经验:谁拥有数据,谁对外提供操作这些数据(私有)的方法! (被动的一方是数据的拥有者,主动的一方是执行者) 开发时:找对象,建对象,用对象,并维护对象之间的关系。
面向对象就是用代码(类)来描述客观世界的事物的一种方式. 一个类主要包含一个事物的属性和行为
以上转载于:https://blog.csdn.net/DarkAndGrey/article/details/121039002
类就是一类对象的统称。对象就是这一类具体化的一个实例。
简单的例子:我们做月饼的模子就是一个类,而通过这个模子可以做出月饼,那么在这个例子当中,类就是那个模子,而月饼就是那个对象,所以月饼就是一个实体。一个模子可以实例化无数个对象。
总的来说:类相当于一个模板,对象是由模板产生的样本。一个类,可以产生无数的对象。
声明一个类就是创建一个新的数据类型,而类在 Java 中属于引用类型, Java 使用关键字 class 来声明类。
基本语法
// 创建类class {field;//成员属性,也叫字段,成员变量method;//成员方法
}// 实例化对象 <对象名> = new ();
class为定义类的关键字,ClassName为类的名字,{}中为类的主体(类体)。
类中的元素称为:成员属性(成员变量)。类中的函数称为:成员方法。
例如:创建一个学生类
//创建一个学生类
class Student{//学生有的属性String name; //姓名int age; //年龄int hight; //身高//方法(又称 成员方法) 可以解析为 学生的行为public void eat(){System.out.println(name + " 正在吃饭!");}public void sleep(){System.out.println(name + " 正在睡觉!");}
}
和之前写的方法不同, 此处写的方法不带 static 关键字. 后面我们会详细解释 static 是干啥的
// 创建类class {field;//成员属性,也叫字段,成员变量method;//成员方法
}// 实例化对象 <对象名> = new ();
用类类型创建对象的过程,称为类的实例化
//创建一个学生类
class Student{//学生有的属性String name; //姓名int age; //年龄int hight; //身高//方法,这个方法指的是能完成的功能,行为public void eat(){System.out.println(name + " 正在吃饭!");}public void sleep(){System.out.println(name + " 正在睡觉!");}
}
public class TestDome {public static void main(String[] args) {Student student1 = new Student();}
}
一个类可以实例化多个对象
//创建一个学生类
class Student{//学生有的属性String name; //姓名int age; //年龄int hight; //身高//方法,这个方法指的是能完成的功能,行为public void eat(){System.out.println(name + " 正在吃饭!");}public void sleep(){System.out.println(name + " 正在睡觉!");}
}
public class TestDome {public static void main(String[] args) {Student student1 = new Student();Student student2 = new Student();Student student3 = new Student();Student student4 = new Student();
}
//创建一个学生类
class Student{//学生有的属性String name; //姓名int age; //年龄int hight; //身高//方法,这个方法指的是能完成的功能,行为public void eat(){System.out.println(name + " 正在吃饭!");}public void sleep(){System.out.println(name + " 正在睡觉!");}
}
public class TestDome {public static void main(String[] args) {Student student = new Student();//访问属性System.out.println(student.name);System.out.println(student.age);System.out.println(student.hight);//访问方法student.eat();student.sleep();//还可以给 属性赋值student.name = "张三";student.age = 18;System.out.println(student.name);System.out.println(student.age);}
}
可以看见上面的属性没有初始化的时候是有默认值的
类的成员可以包含以下:字段、方法、代码块、内部类和接口等
定义在类的内部,方法的外部定义的变量. 这样的变量我们称为 “字段” 或 “属性” 或 “成员变量”(三种称呼都可以, 一般不会严格区分)
//创建一个学生类
class Student{//字段,属性,成员变量String name; //姓名int age; //年龄int hight; //身高//方法,这个方法指的是能完成的功能,行为public void eat(){System.out.println(name + " 正在吃饭!");}public void sleep(){System.out.println(name + " 正在睡觉!");}
}
注意事项
使用 . 访问对象的字段.
“访问” 既包含读, 也包含写.
对于一个对象的字段如果没有显式设置初始值, 那么会被设置一个默认的初值
成员变量又可分为两类: 普通成员变量,静态成员变量
静态成员变量就是由static修饰的变量
class Person{//普通成员变量public String name; //姓名public int age; //年龄//静态成员变量public static int cont;
}
首先看一段代码:
class Person{//普通成员变量public String name; //姓名public int age; //年龄//静态成员变量public static int cont;//方法,这个方法指的是能完成的功能,行为public void eat(){System.out.println(name + " 正在吃饭!");}public void sleep(){System.out.println(name + " 正在睡觉!");}
}public class TestDome {public static void main(String[] args) {Person person1 = new Person();person1.age++;System.out.println(person1.age);System.out.println("=========");Person person2 = new Person();person2.age++;System.out.println(person2.age);}
}
此时再看代码:
class Person{//普通成员变量public String name; //姓名public int age; //年龄//静态成员变量public static int cont;//方法,这个方法指的是能完成的功能,行为public void eat(){System.out.println(name + " 正在吃饭!");}public void sleep(){System.out.println(name + " 正在睡觉!");}
}public class TestDome {public static void main(String[] args) {Person person1 = new Person();person1.age++;person1.cont++;System.out.println(person1.age);System.out.println("cont = " + person1.cont);System.out.println("=========");Person person2 = new Person();person2.age++;person2.cont++;System.out.println(person2.age);System.out.println("cont = " + person2.cont);}
}
静态成员变量/方法,就是类变量,它只属于类,不属于对象,可以通过 类名.静态成员变量/方法 的方式来访问
class Person{//普通成员变量public String name; //姓名public int age; //年龄//静态成员变量public static int cont;//方法,这个方法指的是能完成的功能,行为public void eat(){System.out.println(name + " 正在吃饭!");}public void sleep(){System.out.println(name + " 正在睡觉!");}public static void func(){System.out.println("static :: func");}}public class TestDome {public static void main(String[] args) {Person.cont = 10;System.out.println(Person.cont);Person.func();}
}
普通方法里面不能定义静态成员变量
但是能调用静态成员方法
无论是 普通成员方法还是静态成员方法,都不能在其内部创建一个被static修饰的变量
因为 被static修饰了的变量,该变量就属于类了(类变量/静态变量)。
而你把一个(类变量/静态成员变量)写在方法里,就意味着属于方法(是一个局部变量,不再是 类变量了),而不属于类
所以冲突了,不合适,导致编译器报错
1、static定义的变量,类变量,属于类的
2、eat方法的调用,需要对应的引用来调用。
3、静态方法是不需要对象的,直接就可以用类来调用,如果静态方法里面有静态变量,那这个变量就是属于方法的,不是属于类的了,这就有冲突了
4、当然如果在普通方法里面定义静态变量,那这个变量也属于方法,而不属于类了
5、静态的变量是不能在方法中定义的
6、静态的方法不能调用普通方法
7、静态的方法能调用静态方法
8、普通方法可以调用普通方法
9、普通方法可以调用静态方法
main 函数为什么是静态的?
首先 main 函数 是不是静态都可以!!!
这个东西取决于 JVM 的规则。
main 之所以 是 静态的,是因为 在设计 JVM的时候,就这么设计的
所以 main 只有被static 修饰的时候,JVM才认为它是main函数
答:不一定
class Person{public String name = "author";public void eat(){staticFunc();System.out.println(name+"正在吃饭.");}public static void staticFunc(){System.out.println("static::func()");}
}public class TestDome {Person person = new Person();public static void main(String[] args) {TestDome classAndObject = new TestDome();}
}
1、修饰属性
修饰属性,Java静态属性和类相关, 和具体的实例无关. 换句话说, 同一个类的不同实例共用同一个静态属性2、修饰方法
如果在任何方法上应用 static 关键字,此方法称为静态方法。
静态方法属于类,而不属于类的对象。
可以直接调用静态方法,而无需创建类的实例。
静态方法可以访问静态数据成员,并可以更改静态数据成员的值。
静态方法和实例无关, 而是和类相关. 因此这导致了两个情况:
静态方法不能直接使用非静态数据成员或调用非静态方法(非静态数据成员和方法都是和实例相关的).
this和super两个关键字不能在静态上下文中使用(this 是当前实例的引用, super是当前实例父类实例的引用, 也是和当前实例相关).
我们曾经写的方法为了简单, 都统一加上了 static. 但实际上一个方法具体要不要带 static, 都需要是情形而定. main 方法为 static 方法
class Person {public int age;//实例变量 存放在对象内public String name;//实例变量public String sex;//实例变量public static int count;//类变量也叫静态变量,编译时已经产生,属于类本身,且只有一份。存放在方法区public final int SIZE = 10;//被final修饰的叫常量,也属于对象。 被final修饰,后续不可更改public static final int COUNT = 99;//静态的常量,属于类本身,只有一份 被final修饰,后续不可更改//实例成员函数public void eat() {int a = 10;//局部变量System.out.println("eat()!");}//实例成员函数public void sleep() {System.out.println("sleep()!");}//静态成员函数public static void staticTest(){
//不能访问非静态成员
//sex = "man"; errorSystem.out.println("StaticTest()");}
}public class TestDome {public static void main(String[] args) {//产生对象 实例化对象Person person = new Person();//person为对象的引用System.out.println(person.age);//默认值为0System.out.println(person.name);//默认值为null//System.out.println(person.count);//会有警告!//正确访问方式:System.out.println(Person.count);System.out.println(Person.COUNT);Person.staticTest();//总结:所有被static所修饰的方法或者属性,全部不依赖于对象。person.eat();person.sleep();}
}
null 在 Java 中为 “空引用”, 表示不引用任何对象. 类似于 C 语言中的空指针. 如果对 null 进行 . 操作就会引发异常.
class Person{public String name = "author";public void eat(){staticFunc();System.out.println(name+"正在吃饭.");}public static void staticFunc(){System.out.println("static::func()");}
}public class TestDome {public static void main(String[] args) {Person person = null;System.out.println(person.name);}
}
什么叫封装?
class Person{public String name = "author";public void eat(){staticFunc();System.out.println(name+"正在吃饭.");}public static void staticFunc(){System.out.println("static::func()");}public String toString(){return "张三";}
}public class TestDome {public static void main(String[] args) {Person person = new Person();System.out.println(person);}
}
class Person{private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void eat(){staticFunc();System.out.println(name+"正在吃饭.");}public static void staticFunc(){System.out.println("static::func()");}
}public class TestDome {public static void main(String[] args) {Person person = new Person();//给属性赋值person.setAge(18);person.setName("张三");System.out.println(person.getAge());System.out.println(person.getName());}
}
class Person{public String name;public int age;public Person(){//这就是构造方法}public void eat(){System.out.println("姓名:" + name);}}
new 执行过程(对象如何产生)
语法规则
注意事项
class Person{public String name;public int age;public Person(){//没有一个参数的构造方法构造方法System.out.println("没有参数的构造方法构造方法");}public Person(int age){//带有一个参数的构造方法构造方法System.out.println("带有一个参数的构造方法构造方法");}public Person(int age, String name){//带有两个参数的构造方法构造方法System.out.println("带有两个参数的构造方法构造方法");}public void eat(){System.out.println("姓名:" + name);}}public class TestDome {public static void main(String[] args) {Person person1 = new Person();Person person2 = new Person(18);Person person3 = new Person(18,"张三");}
}
this表示当前对象引用(注意不是当前对象). 可以借助 this 来访问对象的字段和方法
this关键字的用法
1、this.data 调用当前对象的属性
2、this.func() 调用当前对象的方法
3、this() 调用对象的其他构造方法
class Person{public String name;public int age;public Person(){//没有一个参数的构造方法构造方法System.out.println("没有参数的构造方法构造方法");}public Person(int age){//带有一个参数的构造方法构造方法//this调用属性this.age = age;System.out.println("带有一个参数的构造方法构造方法");}public Person(int age, String name){this.age = age;this.name = name;this.eat();//带有两个参数的构造方法构造方法System.out.println("带有两个参数的构造方法构造方法");}public void eat(){System.out.println("姓名:" + name);}
}public class TestDome {public static void main(String[] args) {Person person = new Person(18, "张三");}
}
class Person{public String name;public int age;public Person(){//没有一个参数的构造方法构造方法System.out.println("没有参数的构造方法构造方法");}public Person(int age){//带有一个参数的构造方法构造方法//this调用属性this(18,"张三");this.age = age;System.out.println("带有一个参数的构造方法构造方法");}public Person(int age, String name){this.age = age;this.name = name;this.eat();//带有两个参数的构造方法构造方法System.out.println("带有两个参数的构造方法构造方法");}public void eat(){System.out.println("姓名:" + name);}
}
public class TestDome {public static void main(String[] args) {Person person = new Person(18);}
}
使用 {} 定义的一段代码.
根据代码块定义的位置以及关键字,又可分为以下四种:
class Person{public String name;public int age;{System.out.println("实例代码块");}static {System.out.println("静态代码块");}public Person(){//没有一个参数的构造方法构造方法System.out.println("没有参数的构造方法构造方法");}public Person(int age){//带有一个参数的构造方法构造方法//this调用属性this.age = age;System.out.println("带有一个参数的构造方法构造方法");}public Person(int age, String name){this.age = age;this.name = name;this.eat();//带有两个参数的构造方法构造方法System.out.println("带有两个参数的构造方法构造方法");}public void eat(){{System.out.println("普通代码块");}System.out.println("姓名:" + name);}
}public class TestDome {public static void main(String[] args) {Person person1 = new Person();System.out.println("==============");Person person2 = new Person();}
}
匿名只是表示没有名字的对象.
class PersonA{public String name;public void eat(){System.out.println(name + "正在吃饭");}
}public class TestDome {public static void main(String[] args) {System.out.println(new PersonA().name);new PersonA().eat();System.out.println(new PersonA());System.out.println("================");// 正确写法PersonA persona = new PersonA();System.out.println(persona.name);persona.eat();System.out.println(persona);}
}