-
JAVA对象的知识点
类的实例化结果就是对象,而对一类对象的抽象就是类.类描述了一组有相同特性(属性)和相同行为(方法)的对象。
public class Person { // 属性 String name; int age; // 方法 public void sayHello() { System.out.println("Hello, my name is " + name); } } Person person1 = new Person();//创建对象 person1.name = "Alice"; person1.age = 25; person1.sayHello();
过程:使用new关键字创建了一个Person类的对象,并将其赋值给person1变量;
创建了对象就可以使用点号访问对象的属性和方法;
JAVA的八种基本数据类型:byte,short,int,long, float,double,boolen,char
八种基本数据类型不是对象;所有对象都继承自Object顶层父类
为了解决基本类型不是对象所带来的裂痕,JAVA给每一个基本数据类型都创建了对应的包装类型;
byte | short | int | long | boolean | float | double | char |
---|---|---|---|---|---|---|---|
Byte | Short | Integer | Long | Boolean | Float | Double | Character |
Integer a = 8;//装箱:基本数据类型赋值给包装类型 int b = a;//拆箱:包装类型赋值给基本数据类型
至此,基本数据类型拥有了对象的一切特性;
基本数据类型,只有一块存储空间, 在栈中,存放的是具体数据值。
引用数据类型,有两块存储空间一个在栈(Stack)中,一个在堆(heap)中。堆中存放对象实体(使用new关键字,即表示在堆中开辟一块新的存储空间),栈中存放对象在堆中所在位置的首地址。引用类型变量类似于C/C++中的指针。
引用:一个引用类型变量(栈中的一块内存空间)保存了一个该类型对象在堆中所在位置的首地址,也称作一个引用类型变量指向了一个该类型的对象,通过这个变量就可以操作对象中的数据。
String a = "abc";//a保存的是对象在堆中的首地址 String b = a;//a的首地址赋值给b String c = new String("abc");//出现new关键字,在堆中开辟一个新的空间 sout(a == b);//比较堆中的地址值,true sout(a == c);//比较地址值,flase sout(a.equals(c));//String中对equals进行了重写,比较内容,true
-
JAVA三大特性:封装、继承、多态
-
封装:方法封装了算法的细节,使使用者不需要关系算法是具体如何实现的;通过get\set方法访问成员变量,可以制定所需要的规则;如限定成员变量的长度范围、隐藏关键信息等,能够保证数据的安全;
-
继承:JAVA不支持多继承,但可以多重继承;
is-a原则(判断编译是否成功,判断父子类的关系):
从右往左读,如果能从逻辑上说:B是一种A,B就是A的子类(例如:Dog is a Animal, Dog就是Animal的子类)
Animal animal1 = new Dog();//Dog是一种animal 逻辑通顺 Dog是Animal的子类 通过编译 此时为父类引用指向子类对象 Dog dog = new Animal();//反之错误 Dog dog = animal1;//编译失败,此时从右往左读逻辑与上一行相同 Dog dog = (Dog)animal1;//强制类型转换 通过编译 Cat cat = (Dog)animal1;//能通过编译,但是由于animal1指向Dog对象,此处赋值为cat对象,
has-a原则(判断类与成员的关系):
public class Bird extends Animal{ private String wings; }
鸟有翅膀,逻辑通过;动物有翅膀,逻辑不通过;因此,wings这个成员变量适合定义在Birs类中,而不能出现在Animal类中
-
多态
多态的开闭原则:对修改关闭,对扩展开放;
Animal animal1 = new Dog();//此时为父类引用指向子类对象
多态优点:父类的引用指向子类的对象时,调用的方法是子类重写之后的方法,既体现了多种类型的传递,又体现了不同类型的特性;既复用了父类的属性和方法,又扩展了自己的逻辑
多态的条件:1.要有继承;2.父类引用指向子类对象;
参数定义的是Animal类,传进来的参数必须是Animal的子类;参数类型是父类,传进来的确是子类,此时对应is-a原则,父类的引用指向子类的对象
子类在调用构造函数创建对象时,会先调用父类的构造函数,以便初始化继承自父类的成员。然后再执行子类自己的构造函数,完成对子类特有成员的初始化。父类引用指向子类对象后,通过该引用只能访问到父类的成员和子类重写或覆盖的父类成员,而无法直接访问子类特有的成员(如果有)。因为在编译时,编译器只知道该引用的类型是父类,所以只能看到父类中定义的成员。
在学习面向对象时,应该着重学习面向对象的设计和理念。如果不经思考滥用,会让代码难以理解和难以维护,代码设计是一门学问。
参考文献: