1.面向对象三大特征:
封装、继承、多态
2.构造器为什么无返回值类型,但不可定义为void:
构造器相当于是有默认有返回值,返回值为当前对象
eg:Person person=new Person();
3.类不是具体的存在,实例才是具体的存在。类是抽象出来的。
4.栈内存里的引用变量并未真正存储对象的成员变量,对象的成员变量实际存放在堆内存中
5.static:
(1)没有使用static修饰的成员变量或方法都必须使用对象来调用
(2)使用static修饰的成员变量或方法可直接通过类调用
(3)静态成员不能访问非静态成员
6.this:在某个方法中把this作为返回值,this可代指当前对象,可使代码更简洁
7.方法:
(1)如果方法使用了static修饰,方法归属于类,否则归属于对象
(2)从表面上看,方法是可以被独立执行。实际上,如果被调方法是普通方法,则默认使用this,如果被调方法是用static修改,是使用类来调用
(3)方法参数的最后一个参数,可被定义为String...name这种类型,代表形参个数可变,可被当成一个数组形式处理。但一个方法中只允许有一个
(4)方法重载:同一个类中定义多个方法名相同,参数列表不同的方法
如果有一个重载方法是使用形参可变的形式(String...name),另一个是一个参数的方法,又想只传入一个参数并且调用第一个形参可变方法,那么传值时候使用test(new String[]{"hi"}),这种形式
8.以static修饰的是类变量,没有static修饰的是成员变量:
类变量的作用域与这个类的生存范围相同,当类创建就会存在,直到这个类被销毁
成员变量是实例被创建的时候开始存在,直到实例被销毁
总结:类变量随类的存在而存在;实例变量随实例的存在而存在
当需要调用类变量时,最好使用类.变量名的形式,而不使用实例来调用类变量,这样既可避免错误也提高了可读性
9.封装:
优点:
a.隐藏类的实现细节
b.限制不合理的访问
c.便于修改,提高代码可维护性
实现原则:
a.将对象的成员变量和实现细节隐藏起来,不允许外部直接访问
b.让方法暴露出来,让方法来控制对变量的访问和操作
即:把该隐藏的隐藏起来,把该暴露的暴露出来
10.假如一个类中一个方法,完全包含另一个方法中所有代码,调用方法可以为:
private void test1(int name,int age){
this.name=name;
this.age=age;
}
private void test2(){
this.test1("小明",7);
//下面是需要执行的其他代码
}
11.extends可被称为继承,扩展更容易理解
12.方法重写(两同两小一大的原则)
两同:方法名相同、参数列表相同
两小:子类方法返回值类型比父类小或相等、子类方法抛出异常比父类小或相等
一大:子类方法访问权限应比父类大或相等
a.当子类想调用和父类同名的方法或变量,可通过super.fly()或super.name来调用
b.子类定义的实例变量若和父类的同名,并不会完全覆盖父类的实例变量,他还是会在子类创建的时候,分配出对应的空间。如:(父类类名)子类声明的名字.变量名形式,向上转换成父类的变量名->(BasicParent)child.name
注意事项:
(1)子类或父类的方法要么都是类方法,要么都是实例方法,需保持一致
(2)当子类覆盖父类方法时,子类将无法访问父类方法。但可以调用父类方法,可以使用super(方法为实例方法,super.fly())或类名(类方法 Bird.fly())来调用父类被覆盖的方法,
(3)若父类方法是private修饰,子类写的方法符合两同两小一大原理,那也不是覆盖,只是在子类重新定义了一个方法
方法重载overload,方法重写override:
overload:同一类中多个方法之间发生
override:子类和父类之间的方法
13.多态:
public class BaseParentBean {
public String name = "父类";
public void like() {
Log.e("demo", "watch tv");
}
}
public class ChildBean extends BaseParentBean{
public String name = "子类";
public void like(){
Log.e("demo", "play game");
}
private void eat(){
Log.e("demo", "hamburger");
}
}
BaseParentBean bean=new ChildBean();
Log.e("实例变量",bean.name);
bean.like();
打印发现,bean.name输出“父类”,bean.like输出play game
引用类型有两个类型:编译时类型( BaseParentBean)、运行时类型(ChildBean),此时就有多态的产生。由上面demo可知,方法之间存在多态,子类会覆盖父类。对象的实例变量不具备多态性。
<强制类型转换>:在转换之间可使用instanceof判断是否可以转换成功
(1)基本类型之间的强制类型转换只能在数值类型之间进行,数值类型包括整数、浮点型、字符型
(2)引用类型之间的强制类型转换发生在具有继承关系的两个类型之间,如果是两个没有任何继承关系的类型,不能发生转换。如果试图把一个父类类型转换成子类类型,则这个对象必须实际上是子类实例才行(即编译时为父类类型,运行时为子类类型)
<instanceof>:用于判断前面的对象是否是后面的类、或者其子类、实现类的实例。如果是,返回true
(1)前面的操作数的编译时类型要么与后面一致,要么具有继承关系
(2)在强制类型转换时,首先判断前一个对象是否是后一个对象的实例,即:
a instanceof b ,a是b的实例,b是a的抽象类