Java基础-面向对象

一、Java中的成员变量和局部变量

定义:成员变量直接定义在类中;局部变量定义在方法中,参数上,语句中。

范围:成员变量在这个类中有效;局部变量只在自己所属的大括号内有效,大括号结束,局部变量失去作用域。

生命周期:成员变量存在于堆内存中,随着对象的产生而存在、消失而消失;局部变量存在于栈内存中,随着所属区域的运行而存在,结束而释放。

二、类的构造函数

构造函数:用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数的一种。所有对象创建时,都需要初始化才可以用。

一个类在定义时,如果没有定义过构造函数,那么该类中会自动生成一个空参数的构造函数,为了方便该类创建对象,完成初始化。如果该类中自定义了构造函数,那么默认的构造函数就没有了。

特点:

    • 该函数的名称和所在类的名称相同
    • 不需要定义返回值类型
    • 该函数没有具体的返回值

三、面向对象的三大特征

1、继承

继承是面向对象程序设计能够提高软件开发效率的重要原因之一;

继承是具有传递性的;

继承来的属性和方法是隐式的,也就是在本类里面是看不见的;

一个类只能有一个父类,也就是类只能是单继承;

一个接口可以有多个父类,也就是接口可以是多继承。

2、封装

对象数据和操作该对象的指令都是对象自身的一部分,能够实现尽可能对外部隐藏数据;

实际项目开发中,使用封装最多的就是实体类,常常和JavaBean(类必须是具体的和公共的,并且有无需参数的构造器)一起使用;

那么,实体类通常包含:私有的成员变量、五参数的构造函数、有参数的构造函数、setter和getters方法、重写tostring方法、重写hashCode和equals方法。

3、多态

多态就是对象拥有多种形态:应用多态和方法多态。

引用多态:父类的引用可以指向本类对象、父类的引用可以指向子类的对象

方法多态:创建本类对象时,调用的方法为本类的方法;创建子类对象时,调用的方法为子类重写的方法或者继承的方法。

存在多态的必要条件:继承、重写

多态的作用是消除类型之间的耦合关系

在实际项目开发中,A类继承B类,如果在A类中不重写B类中的方法时,输出的仍旧是B类方法里面的信息;如果在A类中重写B类的方法的时候,输出的是A类方法里面的信息。

四、Java中抽象类

定义:在不断抽取过程中,将共性内容中的方法生命抽取,但是方法不一样,没有抽取,这样抽取到的方法,并不具体,需要被指定关键字abstract锁标示,生命为抽象方法。

抽象方法所在的类一定要标示为抽象类,也就是说该类需要被abstract关键字锁修饰

特点:抽象方法只能定义在抽象类中,抽象类和抽象方法必须由abstract关键字修饰(可以描述类和方法,不可以描述变量)。

抽象方法只定义方法生命,并不定义方法实现。

抽象类不可以被创建对象(不可以实例化)

只有通过子类继承抽象类并覆盖抽象类中的所有抽象方法后,该类才可以实例化。否则,该子类还是一个抽象类。

注意:

抽象类中是否有构造函数?有,用于给子类对象进行初始化抽象类是否可以定义非抽象类?可以。其实,抽象类和一般的类没有太大的区别,都是在描述事物,只不过抽象类在描述事物时,有些功能不具体。所以抽象类和一般类在定义上,都是需要定义属性和行为的。只不过,比一般类多了一个抽象函数。而且比一般类少了一个创建对象的部分抽象关键字abstract和哪些不可以共存final,private,static抽象类可不可以不定义抽象方法?可以。抽象方法目的仅仅为了不让该类创建对象

五、Java中抽象类和接口的区别

1、抽象类只能被继承,而且只能单继承;接口需要被实现。而且是多实现

2、抽象类中可以定义抽象方法和非抽象方法,子类可以直接继承使用;接口中方法只有方法体没有方法的实现,需要子类实现。

3、抽象类使用的是  is-a关系;接口使用的是 like-a关系

4、抽象类的陈孤雁修饰符可以自定义;接口中的成员修饰符是固定的,全部是public的

六、static、final、this、supper关键字总结

1、final关键字

final关键字主要用在三个地方:变量、方法、类

    • 对于一个final变量,如果是进本数据类型的变量,则其数值一旦在初始化后便不能更改;如果是引用类型的变量,则在其初始化之后不能再让其指向另一个对象。
    • 当用final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会被隐式的指定为final方法
    • 使用final方法的原因有两个:第一个原因就是把方法锁定,以防止任何类继承修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用,但是如果方法过于庞大,可能看不到内嵌调用带来的额任何性能的提升(现在的Java版本已经不需要使用final放阿飞进行这些优化了)。类中所有的private方法都隐式的指定为final。

2、static关键字

static关键字主要有以下四种使用场景

  • 修饰成员变量和成员方法

被static修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用。被static声明的成员变量属于静态成员变量,静态变量存放在Java内存区域的方法区。调用格式:类名.静态变量名;;类名.静态方法名()。

  • 静态代码块

静态代码块定义在类中方法外,静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。该类不管创建多少对象,静态代码块只执行一次。

  • 静态内部类(static修饰类的话只能修饰内部类)

静态内部类与非静态内部类之间存在一个最大的区别:非静态内部类在编译完成之后会隐含地保存一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。没有这个引用就意味着:1、它的创建时不需要依赖外围类的创建。2、它不能使用任何外围类的非static成员变量和方法。

  • 静态导包(用来导入类中的静态资源,1.5之后的新特性)

格式为:import static

这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中的静态成员,可以直接使用类中静态成员变量和成员方法。

3、this关键字

this关键字用于引用类的当前实例。例如:

class Manager{
    Employees[] employees;
    void manageEmployees(){
        int totalEmp=this.employees.length;
        System.err.println("total emploees:"+totalEmp);
        this.report();
    }
        
    void report(){}
}

在上面的示例中,this关键字用于两个地方:

this.employees.length;访问Manager的当前实例的变量

this.report();调用Manager的当前实例的方法。

此关键字是可选的,这意味着如果使用上面的示例在不使用此关键字的情况下表现相同。但是,使用此关键字可能会使代码更易读或易懂。

4、supper关键字

supper关键字用于子类访问父类的变量和方法。例如:

public class Super {
    
    protected int num;
    
    protected void showNUmber(){
        System.err.println("number="+num);
    }
    
}

public class sub extends Super{
    void bar(){
    super.num=10;
    super.showNUmber();
    }
}

在上面的例子中,sub类访问父类成员变量number并调用其父类super的showNumber()方法。

使用this和super要注意的问题:

super调用父类中的其他构造方法时,调用时要放在构造函数的首行。this调用奔雷中的其他构造方法是,也要放在首行。

this。super不能用在static方法中

简单解释一下:

被static修饰的成员属于类,不属于单个这个类的某个对象,被所有对象共享。而this代表对本类对象的引用,指向本类对象;而super代表父类对象的引用,指向父类对象。所以,this和super是属于对象范畴的东西,而静态方法数属于类范畴的东西。

posted @ 2020-07-27 16:02  mark-xiang  阅读(234)  评论(0编辑  收藏  举报