定义:把现实中的事物抽象成由一系列属性和行为组成的结构体,每个结构体都有属于自己的功能,在软件开发的过程中,通过对不同功能的结构体进行组合,完成整个软件功能。且结构体可复用。简单说:面向对象是对现实世界的一种抽象模仿。
相关语言:object-C(IOS开发)、java(单继承)、C++(多继承)、scala。另外C语言是面向过程的语言。
三大特征:封装、继承、多态。 ------------------------特征的解释:https://blog.csdn.net/mappp/article/details/51953896
面向对象的优点:稳定性、可扩展性、可复用性。
面向对象的原则:类的单一职能原则,单个类中的功能越多,交互耦合性越强,当业务需求改变时代码的可复用性就越差。
以类的方式组织代码,以对象的方式组织(封装)数据。
对象:现实生活中具体的事物
类:是对对象的抽象表达 -----------------------类是java编程中最基本的单位,他可以构成我们想要表达的所有事物。
class 类名{
数据类型 变量名 ------- 对象的属性:叫小红的猫的名字、毛色、年龄等属性
(public static)返回值类型 方法名{return;} ------- 对象的行为:小红抓老鼠、睡觉等行为
}
1.创建对象的方式:
类名 对象名 = new 类名( ); ---------------------- 对象实例化的同时调用构造方法,每new一次都会在堆内存中开辟空间
2.给对象赋值的方式:
1)通过调用有参构造方法初始化赋值;
2)调用无参构造方法初始化,再利用setter方法进行对象属性的赋值;
3)对于非私有属性可以直接利用 对象名.属性名 = 要赋的变量值 的方式赋值。
定义:没有名字的对象
Teacher t = new Teacher( ); -------------------- 这是有名字的对象
t . teach(); ---------------------------------------------- 使用对象调用方法
new Teacher( ); -------------------------------------- 这叫匿名对象
new Teacher().teach(); ----------------------------- 匿名对象调用方法
使用场景:1.方法只被调用一次的时候;2.作为参数传递的时候。
注意事项:调用多次不推荐使用匿名对象,因为创建多个对象,会不断开辟堆内存,浪费系统资源。
public class NoNameDemo{
public static void main(String[] args){
new Teacher().teach(); //适用于方法只调用一次的情况
test(new Teacher()); //作为匿名对象传参
}
public void test(Teacher t){
t.teach();
}
}
构造方法:访问权限 类名(数据类型 参数值 ){ 方法体;},在 对象实例化 的时候调用,很特殊的一类方法;
成员方法:访问权限 返回值类型 方法名(数据类型 参数值){方法体;return;},使用 对象名.方法名 进行调用;
静态方法:与成员方法相比多了 static关键字 修饰,使用 类名.方法名 进行调用;
成员变量:访问权限 数据类型 属性名;在方法体外部定义的变量,私有属性使用 对象名.getter方法 访问,非私有属性使用
对象名.成员属性 进行调用。存放在堆内存中,有初始值,随着对象的创建而创建,随着对象的消失而消失
静态变量:使用 static关键字 修饰的成员变量,使用 类名.属性名 的方式调用。存在方法区的静态区,有初始值,随着类的加载而 加载,随着类的消失而消失
局部变量:定义在 方法体内部或方法参数列表上 的变量,局部变量不赋初值不能使用。存放在栈内存中,没有初始值,随着方法的 调用而创建,随着方法的结束而消失。
注意事项:
1.定义在方法体外部的变量有初始值,定义在方法体内部的局部变量无初始值,即局部变量不赋初值不能使用;
2.如果我们不在类中创建构造方法,那么系统会为我们自动生成无参数的构造方法。但是如果我们在类中自己写了构造方法,那么系统则不再为我们生成;
3.静态方法中不能调用非静态属性/方法。eg:main方法即为静态方法
public class ObjectDemo{
//成员属性/变量
String name;
int age;
//静态属性/变量
static String country;
//构造方法
public ObjectDemo(){}
//成员方法
public void print1(){
System.out.println("国籍是:中国");
}
//静态成员方法
public static void print2(){
System.out.println("国籍是:大中国");
}
//main方法的测试类
public static void main(String[] args){
//局部变量:不赋初值不能使用
String str = "天生我才必有用,千万莫欺少年穷!";
System.out.println(str);
//因为main方法在本类中,因此可以直接 属性名 的方式调用静态变量
System.out.println(country); //引用数据类型的默认值是:null
//静态方法中不能调用非静态属性,需要使用 对象名.属性名 的方式调用
Object ob = new Object(); //实例化的同时调用构造方法
System.out.println(ob.age); //整型的默认值是0
//静态方法中不能调用非静态方法,需要使用 对象名.方法名 的方式调用
ob.print1(); //国籍是:中国
//因为main方法在本类中,因此可以直接 方法名 的方式调用静态方法
ob.print2(); //国籍是:大中国
}
}
静态代码块: static { } -----------------随着类的加载而执行一次
构造代码块: { } --------------------------每创建一个对象就会执行一次
局部代码块: 定义在方法中的 { } -----局部代码块执行完毕后会立马释放,很少使用。
三者的执行顺序:静态代码块 --> 构造代码块 --> 构造方法
public class StaticDemo {
//静态代码块
static {
System.out.println("[静态代码块]靠你一起挖");
}
//构造代码块
{
System.out.println("[构造代码块]你好");
}
//构造方法
public StaticDemo() {
System.out.println("[无参构造方法]:我们不一样");
}
public StaticDemo(int a) {
System.out.println("[传参构造方法]:我们一起唱");
}
//成员方法
public void method() {
System.out.println("[局部代码快]:月溅星河");
}
public static void main(String[] args) {
StaticDemo c1 = new StaticDemo();
StaticDemo c2 = new StaticDemo(5);
c1.method();
}
}
================================================================
[静态代码块]靠你一起挖
[构造代码块]你好
[无参构造方法]:我们不一样
[构造代码块]你好
[传参构造方法]:我们一起唱
[局部代码快]:月溅星河