一、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是属于对象范畴的东西,而静态方法数属于类范畴的东西。