Java面向对象
面向对象的概念:
封装性:将对象行为封装起来,不让外界知道具体实现细节。
继承性:主要描述的是类与类之间的关系。通过继承,可以在无需重新编写原有类的情况下,对原类的功能进行扩展。
多态性:指在程序中允许出现重名现象,它指在一个类中定义的属性和方法被其他类继承后,他们具有不同的数据类型或表现出不同的行为,这使得同一个属性和方法在不同的类中具有不同的语义。
类的定义:
类是对象的抽象,它用于描述一组对象的共同特征和行为,类中可以定义成员方法和变量,其中成员变量用于描述对象的特征,成员方法用于描述对象的行为。
Java中通过new关键字创建对象,P p=new P(); p仅仅存储的是P对象在内存中的位置。
构造函数:
1.必须满足的条件:1> 方法名与类名相同 2> 在方法名的前面没有返回值类型的说明 3> 在方法中不能使用return语句返回一个值
2.构造方法在创建实例时被自动调用
3.构造函数的重载:满足条件:构造方法的参数类型或参数的个数不同即可。
4.如果类中未定义构造方法,系统会自动为这个类创造一个默认的构造方法,默认构构造方法无参,在方法体中没有代码,即什么也不做。
5.构造方法通常使用public修饰,private修饰会报错【私有方法外部不能调用】,即无法访问构造方法。
This关键字:
定义:用于方法中访问对象的其他成员。
1.解决成员变量与局部变量的冲突。
2.通过this关键字调用成员方法。
3.构造方法是在实例化对象时被Java虚拟自动调用的,在程序中不能像调用其他成员方法那样去调用构造方法,但可以在一个构造函数中通过this(参数1,参数2....)的形式调用。
必须要满足两个条件【1.只能再构造方法中使用,2.必须在第一行且只能出现一次】
class C{ public C(){ this(1); } public C(int a){ } }
垃圾回收:
当一个对象成为垃圾后仍会占用内存空间,时间异常会导致内存不足。针对这种情况,Java引入了垃圾回收机制。
class C{ public C(){ this(1); } public C(int a){ } } C c=new C(); c=null
上面这个例子:当定义的对象指向null,那么之前定义的类对象将成为垃圾回收的对象。
Java引入的垃圾回收机制:
1.自动释放,垃圾堆积到一定程度时,Java虚拟机就会启动垃圾回收器将这些垃圾从内存中释放。
2.手动释放,通过调用System.gc()方法通知虚拟机立即进行垃圾回收,当一个对象在内存中释放时,它的finalize()方法会自动调用,可以通过它查看对象什么时候被释放的。
class C{ public void finalize(){ System.out.println("对象释放中。。。。。。。。。"); } } public class Test { public static void main(String[] args) throws InterruptedException { C c1=new C(); C c2=new C(); c1=null; c2=null; System.gc(); } }
Static关键字:
为什么要出现static关键字:
定义一个类,并没有实例化。只有通过new实例化,有时我们希望特定的数据在内存中只有一份,而且能够被一个类的所有实例对象所共享。
静态变量和静态方法:
1.定义静态变量,使用static关键字来修饰变量,通过类名.变量名 来访问。【static只能用于成员变量,用于局部变量是非法的】
注意:静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响
2.定义静态方法,方法前加上static关键字,通过类名.方法名 来访问。
注意:1.对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了.
2.在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用.
静态代码块【关键作用】:
使用一堆大括号包围起来的若干行代码被称为一个代码块,用static关键字修饰的代码块称为静态代码块。当类被加载时,静态代码块会被执行,由于类只加载一次,因此静态代码块只执行一次。通常用于成员变量的初始化。
static{ 代码块 }
类的继承:
一个类继承另一个类,需使用extends关键字。
Java中只支持单继承,一个类只能有一个直接父类,
重写父类方法:
子类自动继承父类定义的方法,在子类重写的方法需要和父类被重写的方法具有相同的方法名,参数列表和返回值。
注意:子类重写父类的方法时不能使用比父类更严格的访问权限,如父类public 子类就不能是private
Super关键字:
当子类重写父类的方法后,子类对象无法访问父类对象被重写的方法,Java提供了一个关键字super用于访问父类成员。
1.使用super调用父类的成员变量,成员方法。super.成员变量 super.成员方法。
2.使用super关键字,访问父类构造方法,super(参数1,参数2. 。。。)【必须位于子类的构造方法第一行且只能出现一次】
Final关键字:
final关键字可用于修饰类,变量,方法,它有 这是无法改变的,最终的含义
被final修饰的类,变量吗,方法有以下特性:
final修饰的类不能被继承。
final修饰的方法不能被子类重写
final修饰的变量(成员变量和局部变量)是常量,只能复赋值一次。
多态:
由于参数类型不同而导致执行结果各异的现象就是多态。
父类类型变量引用不同子类对象;
interface A { void run(); } class B implements A{ @Override public void run() { System.out.println("B run ......"); } } class C implements A{ @Override public void run() { System.out.println("C run ......"); } } public class Test { public static void main(String[] args) throws InterruptedException { A b=new B(); A c=new C(); start(b); start(c); } public static void start(A a){ a.run(); } }