面对对象
如何理解面向对象?
面向过程:强调的是功能行为。
面向对象:将功能封装进对象,情调对象说具备的功能。
面向对象是基于面向过程的。
类和对象的关系
现实生活中的对象:张三李四
想要描述:提取对象中共性内容,对具体的抽象。
描述时:这些对象的共性有:姓名,年龄,性别,学习java功能。
映射到java中,描述就是class定义的类,具体对象就是堆内存中用new建立的实体。
类:对现实生活中事物的描述。
对象:实实在在存在的类的个体。
匿名对象:
匿名对象使用方法一:当对对象方法只调用一次时,可以用匿名对象来完成,这样比较简化。
匿名对象使用方法二:可以将匿名对象作为实际参数进行传递。
面向对象三大特征:封装,继承,多态
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
优点:
将变化隔离
便于使用
提高重用性
提高安全性
封装原则:
将不需要对外提供的内容都隐藏起来
把属性都隐藏,提供公共方法对其访问
继承:
1.提高代码复用性
2.让类与类之间产生关系,有了这个关系,才有了多态的特性
3.打破流封装性。
注意:不能为了获取其他类的功能,简化代码而继承
必须是类与类之间有所属关系才可以用继承。
java中支持单继承,即一个子类只能有一个直接父类。
java不支持多继承,但支持多层继承。
super关键字:子类与父类成员变量重名时,super.变量名代表父类成员变量。
this关键字:本类成员与局部变量重名时,this.变量名代表本类成员。
父类的数据是存储在子类对象中的。当父类与子类存在重名函数时,子类函数会覆盖父类函数。
注意:此时子类函数的权限必须大于或等于父类函数,而且两者必须均为静态或非静态函数。
子类构造函数:
子类的构造函数中存在一个隐式语句super();默认先调用父类构造函数进行初始化,在运行子类特有的构造方法。
因为子类继承了父类,获取了父类的属性,所以在使用父类属性前,必须先对父类进行初始化。
如果父类存在多个构造函数,而且没有定义空参数的构造函数,那么子类构造函数在定义时必须明确调用父类的哪个构造函数。
final关键字
1.final是一个修饰符,可以修饰类,方法,变量。
2.final修饰的类不可以被继承。
3.final修饰的方法不可以被覆盖。
4.final修饰的变量是一个常量,只能被赋值一次。
以下代码简单演示一个继承实现方式和特点
class Fu { int a=66; int num = 77; Fu () { super(); //调用最底层object. show(); //因为函数同名,优先调用Zi类的show函数,此时num为默认初始值0. return; } void show() { System.out.println("fu show"); } } class Zi extends Fu { int num = 8; //先运行Zi的构造函数Zi()中的super(),再运行此项。 Zi() { super(); //此步骤最先运行,通过super初始化Fu时,num并未显示初始化,此时num为默认初始值0. show(); //此时输出zi show ...8. return; } void show() { System.out.println("zi show ..."+num+";"+"fu shou ..."+super.num); System.out.println("a show ..."+a); //调取父类变量 } } class ExtendsDemo { public static void main(String[] args) { Zi z = new Zi(); System.out.println(); z.show(); } }
运行结果
static 关键字:
static 修饰成员变量:
特有的使用方式: 可以直接通过类名来访问.
特点:
随着类的加载而加载,存储在共享区(方法区)
静态变量和普通成员变量的区别:
普通成员变量:随着对象的创建存储于堆内存,随着对象的消失而消失(变垃圾被回收)
每一个对象在堆内存中都存储的有自己特有的成员变量.
静态变量:随着类的加载而加载,存储于共享区, 内存只有1份. 可以被所有对象所共享
static 修饰成员方法:静态方法
特有的使用方式:可以直接通过类名来调用.
注意:
静态方法不能访问非静态成员变量.
静态方法只能访问静态变量
本程序演示 this static 关键字
class Person { static String country = "CN"; //静态变量 或 类变量 实例变量 private String name; //成员变量 private int age; Person(String name) { this.name=name; } Person(String name , int age) { this(name) ; // this代表当前对象(Person)进行初始化,因为只有一个参数,所以自动调用上面的Person构造函数。 this.age = age; } public void speak() { System.out.println(country+":"+this.name+":"+this.age); } public boolean compare(Person p) //判断本对象与p对象是否age相同 { return this.age==p.age; } } //加 this. 输出 001;0 不加输出 null:0 class ThisDemo { public static void main(String[] args) { Person p1 = new Person("001",20); Person p2 = new Person("002",25); p1.speak(); p2.speak(); System.out.println(p1.compare(p2)); System.out.println(Person.country); //静态数据可以直接用类名调用 } }