面向对象
面向对象和面向过程的区别
1.面向对象可是说是一种功能的概述。而面向过程可以说是功能的具体表现。不管是面向对象还是面向过程,都是一种程序设计思想。
面向对象的三大特征封装,继承,多肽。
局部变量和成员变量的区别
1. 区别一,定义的位置不同
成员变量定义在类中,局部变量定义在方法和{}中
2. 区别二,在内存中的位置不同
成员变量在对内存中,局部变量在栈内存中。
3. 区别三,生命周期不同
成员变量随着对象的出现而出现在对内存中,随着对象的消失而消失
局部变量随着方法的运行出现在栈内存中,随着方法的弹栈而消失
4. 区别四,初始化不同
成员变量在堆内存中,所有默认的初始化值。
局部变量没有默认的初始化值,必须手动赋值才能使用。
封装
- 类中 不需要对外提供的内容都需要私有化,包括属性和方法。
以后再描述事物,属性都有私有化,并且对外提供get,set方法。 - 私有化仅仅是封装的体现形态。
内存对象创建使用过程
继承
好处:提高了代码的复用性,继承让类与类或对象与对象之间产生了关系。提高了代码的维护性。
接口
接口是功能的合集,同样可看作是一种数据类型,是比抽象类更抽象的“类”。
接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成。这样将功能的定义与实现分离,优化了程序设计。
多肽
多肽体现了事物的多种形式,+
多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态。
在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。
instanceof 判断当前的类型。
- 什么时候使用向上转型
当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作,这时就可以使用向上转型。 - 什么时候使用向下转型
当要使用子类特有功能时,就需要使用向下转型。 - 向下转型的好处:可以使用子类特有功能。
弊端是:需要面对具体的子类对象;在向下转型时容易发生ClassCastException类型转换异常。在转换之前必须做类型判断。
构造方法
- this的使用方法
this代表的是对象,哪个对象调用了this所在的方法,this就代表哪个对象。
成员变量和局部变量同名时,可以使用this来区别。
class Person {
private int age;
private String name;
// 给姓名和年龄初始化的构造方法
Person(String name, int age) {
// 当需要访问成员变量是,只需要在成员变量前面加上this.即可
this.name = name;
this.age = age;
}
public void speak() {
System.out.println("name=" + this.name + ",age=" + this.age);
}
}
class PersonDemo {
public static void main(String[] args) {
Person p = new Person("张三", 23);
p.speak();
}
}
- super关键字
在创建子类对象是,父类的构造方法先执行,因为在子类中所有构造方法的第一行有默认的隐式super()语句。
格式:
调用本类中的构造方法
this(实参列表);
调用父类中的空参数构造方法
super();
调用父类中的有参数构造方法
super(实参列表);
--如果子类的构造方法第一行写了this调用了本类其他构造方法,那么super调用父类的语句不会存在。this()super(),只能定义在构造方法的第一行,因为初始化动作要先执行。
--父类构造方法中是有隐式的super()语句,因为在java体系中,定义了个一个所有对象的父类object。
3. final关键字
-final修饰类不可以被继承,但是可以继承其他类。
-final修饰的方法,不可以被覆盖,但父类中没有被final修饰方法,子类覆盖后可以加final。
-final修饰的变量成为变量,这些变量只能赋值一次。
-引用类型的变量值为对象地址值,地址值不能改变,但是地址内存的对象属性值可以修改。
-修饰成员变量,需要在创建对象前赋值,否则报错。
“` stylus
class Demo {
//直接赋值
final int m = 100;
//final修饰的成员变量,需要在创建对象前赋值,否则报错。
final int n;
public Demo(){
//可以在创建对象时所调用的构造方法中,为变量n赋值
n = 2016;
}
}
```
4.static 关键字静态修饰符
(1). 被static修饰的成员变量属于类,不属于这个类的某个对象。(也就是说,多个对象在访问或修改static修饰的成员变量时,其中一个对象将static成员变量值进行了修改,其他对象中的static成员变量值跟着改变,即多个对象共享同一个static成员变量)。
class Demo {
public static int num = 100;
}
class Test {
public static void main(String[] args) {
Demo d1 = new Demo();
Demo d2 = new Demo();
d1.num = 200;
System.out.println(d1.num); //结果为200
System.out.println(d2.num); //结果为200
}
}
(2). 被static修饰的成员变量可以并且建议通过类名直接访问。
class Demo {
//静态成员变量
public static int num = 100;
//静态方法
public static void method(){
System.out.println("静态方法");
}
}
class Test {
public static void main(String[] args) {
System.out.println(Demo.num);
Demo.method();
}
}
注意事项
静态内用是优于对象存在,只能访问静态,不能使用this、supser。静态内容存在于静态区、