本系列是本人在学习java基础部分,刷牛客网1000+题以及参加各种笔试面试后所总结之精华,希望对大家有所帮助,有兴趣的可以加我好友,大家共同学习进步!
四、面向对象:
面向对象:面向对象是一种编程思想,它是计算机编程发展到一定阶段的产物,它把现实世界中的事物抽象成对象,把事物之间复杂的关系抽象成类,接口,继承,接口的实现等概念。
封装的概念:隐藏对象的属性和实现细节,仅对外公开接口,这就要求我们控制在程序中属性的读取和修改的访问级别。
我们定义类时通过属性和方法来描述对象的属性和行为。而每个对象就是对其属性和行为的封装。我们面向对象编程时,就像平时用手机看电视一样,我们只需要知道按触碰屏幕什么位置打开视频,按哪个键调节音量就行了,而不必关心手机内部是如何实现这些功能的。这样我们就实现了程序设计中的所谓"高内聚,低耦合",就像搭积木的一样快速开发出一个全新的系统。更重要的是这十分利于系统的维护和拓展,不至于一个小小的变动就波及整个系统。且方便重复利用。
1.接口与抽象类的区别:JDK1.7之前,接口中只能包含静态常量、抽象方法,不能有普通属性、构造方法(抽象类不能new,但是它的构造方法可以用来给子类调用)、普通方法。
(而这三个抽象类中都可以有,这就是接口与抽象类的区别)。
JDK1.8后,接口中包含普通的静态方法(一定要有方法体),而抽象类一直能包含普通静态方法
抽象方法一定没有方法体!!!!
(虽然很多同学学习时以JDK1.7为准,但是了解1.8的新功能、新特性,体现了你是一个有会不断接受新事物、有学习热情的人)。
- 堆区:只存放类对象,线程共享。
方法区(全局区、静态存储区):存放class文件(全局变量即加载的类信息)、静态变量和常量,线程共享。常量池:存放常量字符串,从属于方法区.方法区其实也是堆,只不过作用比较特殊
栈区:存放方法局部变量,基本类型变量,操作指令。线程不共享。
应该是AC,即是堆和字符串常量池中,当你new String(“abc”)时,其实会先在字符串常量区生成一个abc的对象,然后new String()时会在堆中分配空间,然后此时会把字符串常量区中abc复制一个给堆中的String,故abc应该在堆中和字符串常量区
3.子类可以继承父类所有的属性和方法(除了构造方法),但不见得可以直接访问(比如,父类私有的属性和方法)。
4.我对static关键字的理解:用static关键字修饰的方法和属性从属于类,而普通的方法和属性从属于对象。因此它们又称为类属性和类方法。我现在创建一个中国人类,那么姓名这个属性很明显就不能用static关键字修饰,因为他是从属对象的:他叫张三,你叫李四,每个人都不一样。而我用static修饰中国人类的国籍属性,把它在静态初始化块中初始化为中国,这样我就不用每创建一个中国人对象都为他初始化一个国籍属性。你可以通过对象调用该属性,也可以通过类名直接调用,如果你创建了一个中国人对象张三,把对象的国籍属性改为美国,然后你再创建一个中国人对象李四并调用它的国籍属性,你会发现他的国籍也变成了美国。这就是所谓的用static修饰的属性从属于类,而不单单属于某个对象。
另外,用static修饰的方法是不能重写的。比如我们再定义用static一个festival()方法,表示中国人类的过节方法,在方法体中打印一下“在八月十五过中秋”,然后我们创建一个子类福建人继承父类中国人,然后按照重写的格式重写festival方法(),在方法体中打印一下”在一月一号过中秋”,编译会正常通过,然后你创建一个福建人类,调用festival()方法,你会发现打印的是”在八月十五过中秋”而不是“重写”的方法。而你在重写方法前加上@override你会发现编译器会报错,它会告诉你子类不能重写父类用static修饰的方法。也就是子类就算写了一个与父类名称相同的方法那也属于子类自己,而非重写,类似于重载。也即static方法能继承,但不能实现多态。子类静态方法只能通过Dog.fun()访问,或者Dog dog=new Dog(); dog.fun()访问,而Animal dog= new Dog(); dog.fun()访问的是父类静态方法
5.关于类和对象的自动转型问题,记住一句话:编译看左边,运行看右边。
Animal a=new Dog();
a. shout();
a. dogSleep();
编译时把a当做animal类,动物类中没有狗睡觉的方法,所以编译不通过。那么我们注释掉a.dogSleep()。运行后发现调用的shout()是Dog类重写的shout()方法(如果定义Dog类时有重写的话),也就是说程序跑起来之后看右边,把a当成dog类。
每次new对象时,会执行一次构造块和构造方法,构造块总是在构造方法前执行:
public class Test {
static {
System.out.println(“静态代码块”);
}
static Test test = new Test();
Test() {
System.out.println("构造方法");
}
public static void main(String[] args) {
Test test = new Test();
}
}
其实静态变量和静态代码块是同一个级别的,谁在前面谁先执行。但静态代码块一般执行类的初始化,所以我们一般先定义属性,再写初始化代码块。
- 接口只能是public或default。
接口中的方法总是:public abstract
接口中的属性总是public static final
9.下列说法错误的是?第二个
10.父类没有无参的构造函数时,子类需要在自己的构造函数中显式调用父类的构造函数,否则编译会报错。
11.重载(overload)和重写(override)的区别: 重载的方法,实际是完全不同的方法,只是名称相同而已!
构成方法重载的条件:
1.不同的含义:形参类型、形参个数、形参顺序不同
2.只有返回值不同不构成方法的重载
重写特指子类对父类方法的重写,三大特点:1.子类重写的方法允许的访问范围不能小于父类的方法。 2.参数列表必须完全与被重写方法的相同3.重写的方法的返回值必须和父类方法相同(如果是void 或是基本数据类型 则必须一致 如果是引用类型 ,也子类方法的返回值必须与父类方法返回值相同或是父类方法返回值的子类)。
- 构造方法中的age=10 等效与this.age=10.