第五章面向对象

本文深入探讨了面向对象编程的原理,对比了面向对象与面向过程的区别,阐述了对象和类的关系,以及它们在Java中的表现。文章还介绍了栈和堆的特点、变量的声明与初始化,以及构造方法的作用和调用规则。此外,讲解了类、对象、成员变量、静态变量和局部变量的生命周期和所属关系。文章进一步讨论了Java中this、static、package、import的使用,以及构造方法的重载、Javadoc注释的编写。最后,提到了封装、继承、多态的概念,并通过上机练习巩固了面向对象编程的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简述面向对象和面向过程的区别和联系?
在这里插入图片描述
对象和类的关系是?
对象:是具体的事物 xiaoming xiaohong
类:是对对象的抽象(抽象 抽出象的部分)Person
• 特殊到一般,具体到抽象。
• 类可以看成一类对象的模板,对象可以看成该类的一个具体实例。
• 类是用于描述同一类形的对象的一个抽象的概念,类中定义了这一类对象所应具有的静态和动
态属性。

栈的特点是?存放什么内容?
当方法和语句块一结束,空间马上释放;存放的是局部变量(在方法和语句块内部定义的变量)

堆得特点是?存放什么内容?
随着对象而产生,随对象销毁而销毁;存放的是成员变量(也叫属性,在方法外,在类里,定义的变量)

局部变量、成员变量、静态变量分别怎么声明?
局部变量:在方法或代码块中声明的变量称为局部变量
成员变量:在类中声明的变量称为成员变量
静态变量:使用static修饰的成员变量称为静态变量

局部变量使用之前,必须要手动初始化吗?
必须手动

如果不手动指定成员变量的值,系统将会自动初始化。那么初始化的规则是?
整型初始化为0
浮点型初始化为 0.0
引用数据类型初始化为null
boolean类型初始化为false
char类型的初始化为\u0000

成员变量从属于谁? 静态变量又叫什么以及从属于谁? 局部变量从属于谁?
成员变量从属于对象
静态变量又叫类变量从属于类
局部变量从属于方法或代码块

构造方法的作用是两个:一个构造类的对象,另一个作用是初始化对象的属性。这种说法对不?

构造方法的名称必须保持跟类名一致吗?
必须与类名一致

构造方法有没有返回值?详细用文字描述返回值问题。
构造方法没有返顺值,也不可以写void

构造方法如何被调用?
构造方法在创建对象时被调用,使用关键字new

构造方法中能不能有return语句?
构造方法中不能使用return语句

系统一定会给我们添加无参数的构造方法吗? 请详细解释。
如果手动编写了构造方法之后,系统就不会添加无参构造方法了

下面的代码有什么问题:
class Computer {
int price;
int type;
String brand;

public void start(){
System.out.println(“启动中…”);
}

computer(int _price, int type, String _brand){
//this.price = price;
price = _price;
type = type;
brand = _brand;
}
}

当局部变量名称与成员变量名称相同时,使用this代表成员变量,代码应改为
computer(int price, int type, String brand){
this.price=price;
this.type=type;
this.brand=brand;
}

【上机】设计一个类代表二维空间的一个点

public class Point{
private int x;
private int y;
public void setX(int x){
this.x=x;
}
public int getX(){
return x;
}
public void setY(int y){
this.y=y;
}
public int getY(){
return y;
}
public Point(){
}
public Point(int x,int y){
this.x=x;
this.y=y;
}
}

【上机】设计一个类代表二维空间的一个圆。要求两个成员变量。一个是圆心,一 个是半径提供计算面积的方法。

public class Cricle{
private int r;
private Point point;
public void setR(int r){
this.r=r;
}
public int getR(){
return r;
}
public void setPoint(Point point){
this.point=point;
}
pubic Point getPoint(){
return point;
}
public Cricle(){

}
public Cricle(int r,Point point){
this.r=r;
this.point=point;
}
public double area(){
return Math.PI*Math.pow(r,2);
}
}


【上机】为上述Cricle类添加一个方法,计算一个点(Point对象)是否在圆(Cricle对象)内,并写程序验证

//在Cricle类中加入方法
public class Cricle{..
public boolean isFlag(Point p){
if(Math.pow(x-p.getX())+Math.pow(y-getY())<=Math.pow(r,2)){
return true;
}
}
return false;
}
public class Test{
public static void main(String [] args){
Point p=new Point(3,3);//圆心
Cricle c=new Cricle(5,p);
System.out.println(c.isFlag(new Point(5,5))?”在圆内”:”不在圆内”);
}
}

构造方法能不能重载?
构造方法可以重载

this在普通方法中,指的是哪个对象?在构造方法中,指的是?
this在普通方法中总是指向调用该方法的对象
this在构造方法中总是指向正要初始化的对象

static变量在内存中放置在哪个区? static变量和方法为什么被称为类变量和类方法?可以被该类所有对象共享吗?
static变量存在数据区
static变量和方法归类所有,使用类名去调用
可以被该类的所有对象所共享

静态初始化块和main方法哪个先被执行?
静态初始化块先执行

一个构造方法调用另一个构造方法怎么调用? this(),这样的调用方式必须位于第一句吗?
this()调用本类的无参构造方法
this(实参列表)调用本类的带参构造方法
super()调用直接父类的无参构造方法
super(实参列表)调用直接父类的带参构造方法
this()调用必须位于构造方法的第一句

package的两个作用是什么?
解决类之间的重名问题
为了便于管理类:合适的类位于合适的包

增加package以后,我们在DOS下编译怎么做?
javac -d . Test.java

import是用于导入包还是导入类?
import是用于导入其它包中的类

import Java.util.*; 会不会降低程序运行速度?为什么?
不会降低程序的运行速度
因为是导入该包下的所有的类,会降低编译速度

import static 静态导入的作用是导入类还是导入类的静态属性和静态方法
导入类的静态属性和静态方法

如果同时导入:Java.util.Date; Java.sql.Date; 在程序中怎么区分它们?
只能用包名+类名来显示调用相关类
java.util.Date date=new java.util.Date();

【上机】 完成this、static、package、import的测试代码

package cn.sxt.pro
import java.util.Scanner;
public class Test{
public static int age;
private String name;
public void setName(String name){
this.name=name;
}
public static void show(){
}
public static void main(String [] args){
System.out.println(Test.age);
System.out.println(Test.show());
}
}

Javadoc注释怎么写?
/**开头
*/结束

Java项目的API文档如何生成?请将步骤写出。
javadoc 源文件名.java;

面向对象中的封装,追求的是“高内聚,低耦合”。解释一下,内聚什么?什么叫耦合?
内聚:程序内的各个模块之间的关系紧密程度
耦合:外部程序(子程序)之间的关系紧密程度

封装的几个关键字:private,default,protected,public的含义。
代表的是访问权限
private:私有的,只能本类访问
default:默认的,本类,子类,本包中的其它类都可以访问
protected:受保护的,本类,本包及其它包中的子类可以访问
public:公共的,本类,子类,本包及其它中的类都可以访问

一般属性是否要设置为private?
是, 属性就不能被赋值上任何非法的值了

如果属性设置为private,如何让外部访问该属性?
编写公有的取值的get方法

提供getter、setter方法的操作,eclipse中如何实现?
菜单栏SourceGenerate getters and setters

对于boolean类型的属性,提供的getter方法是:getXXX或是isXXX?
isXXX;

Javabean就是只包含属性和相关getter、setter方法,不包含业务逻辑处理的 类,这种说法对吗?
不对
Javabean既可以封装数据同时也可以封装业务逻辑

继承的好处是什么?
好处一:继承的本质在于抽象。类是对对象的抽象,继承是对某一批类的抽象
好处二:为了提高代码的复用性

Java中有多继承吗?C++中有多继承吗? 单继承相比多继承优势在什么地方?
java中只有单继承
C++中有多继承
使用单继承有利于系统的维护,使得类与类之间的关系简单

【上机】模仿课堂上动物世界的例子,我们自己写个例子

class Person{

}
class Teacher extends Person{

}

Java的继承使用哪个关键字实现?
extends

定义某个类时,如果没有使用extends,那么继承了哪个类?
如果没有使用extends,那么继承了Object类

Java中,有没有多继承? 请说明,Java为什么取消了多继承?
java中没有多继承
使用单继承有利于系统的维护,使得类与类之间的关系简单

重写(override)指的是什么?
指的是子类对父类中方法的重写

假如父类有main方法,子类能不能继承?
不能

Object是所有类的根类吗?是所有类的直接父类吗?
Object是所有类的根类
不是所有类的直接父类

在哪里查看Object类的源代码?
jdk安装目录中的src压缩包中可以查看源码

Object类中的toString方法能否被子类重写?请做测试。

super指的是什么?
super指的是直接父类

构造方法中,第一个话总是super吗?
也可以是this()

叙述一下,有继承结构时,构造方法的调用顺序?
继承条件下构造方法的调用规则如下:
如果子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,写不写“super();”语句,效果是一样的。

如果子类的构造方法中通过super显式调用父类的有参构造方法,那将执行父类相应构造方法,而不执行父类无参构造方法。

如果子类的构造方法中通过this显式调用自身的其他构造方法,在相应构造方法中应用以上两条规则。

特别注意的是,如果存在多级继承关系,在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直到执行顶级父类Object类的无参构造方法为止。

重写中,子类的返回值类型可不可以跟父类不完全一致?说出你的理由。
可以
子类的返回值可以与父类相同,也可以是父类方法返回值的子类

如何判断两个对象内容是否相同?重写equals()有什么要求?
判断两个对象的内容是否相同,需要重写Object类的equals方法

重写equals方法的要求:
1、自反性:对于任何非空引用x,x.equals(x)应该返回true。
2、对称性:对于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true。
3、传递性:对于任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true。
4、一致性:如果x和y引用的对象没有发生变化,那么反复调用x.equals(y)应该返回同样的结果。
5、非空性:对于任意非空引用x,x.equals(null)应该返回false。

多态的三个必要条件是什么?
继承
方法重写
父类引用指向子类对象

什么是向上转型?什么是向下转型?
向上转型:父类引用指向子类对象
向下转型:将父类引用转成真实的子类对象

多态的常用使用场合有哪些?
使用父类做方法的形参,实参可以是该父类的任意子类类型
使用父类做方法的返回值类型,返回值可以改父类的任意子类对象

Java的方法绑定采用动态绑定还是静态绑定?
静态方法,构造器,private方法,用关键字super调用的方法是静态绑定
通过对象调用的方法,采用动态绑定

final修饰变量、方法、类分别表示什么含义?
final修饰的变量不可改变,一旦赋了初值,就不能被重新赋值,称为常量
final 修饰的方法不能被子类重写
final修饰的类不能有子类

final修饰的方法能不能被重载?能不能被重写?
final修饰的方法可以重载
final修饰的方法不能重写

String类能不能被继承?为什么?
String类不能被继承
因为String类是使用final修饰的类

包含抽象方法的类是抽象类吗? 抽象类一定包含抽象方法吗?
包含抽象方法的类是抽象类
抽象类中不一定含有抽象方法

抽象类中能不能有普通方法?能不能定义构造方法?
抽象类中可以有普通方法
抽象类中可以定义构造方法

抽象类能不能被new出来?即抽象类的构造方法能不能被调用?
抽象类不能被new出来
抽象类的构造方法被子类调用

接口中只能定义常量和抽象方法吗?
JDK1.7之前,接口中只能定义静态常量和公共的抽象方法
JDK1.8中,接口中可以定义静态方法

接口描述了现实世界中什么逻辑?
接口描述了现实世界是“如果你是…则必须能…”的思想
如果你是天使,则必须能飞;如果你是汽车,则必须能跑

接口中的常量一定是public static final吗?抽象方法一定是public abstract 吗?
是的

接口中能不能定义普通变量,普通方法?从设计接口的角度说明为什么这么做?
接口中不能定义普通变量,也不能定义普通方法
因为接口就是一种规范,定义一种规则

接口能不能被new?
接口不能被new

接口中有没有多继承?
接口中有多继承

一个类能不能实现多个接口?

完成抽象类、接口的语法测试代码

public interface TakePhoto {

}
abstract class Phone{

}
class MoblePhone extends Phone implements TakePhoto{

}
class Test{
public static void main(String[] args) {
MobilePhone mp=new MobilePhone();
}
}

【上机】使用接口,定义电子产品系统(智能手机、MP3、智能手表)。

public interface Electronic {

}
class MobilePhone implements Electronic{

}
class Mp3 implements Electronic{

}
class Watch implements Electronic{

}

如何对一个数组的多个对象按照不同的依据进行排序;
对象实现Comparable接口
或者定义比较规则的类实现Comparator接口

模拟实现Comparable和Comparator接口;

实现Comparable接口
public class Student implements Comparable<Student>{
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Student o) {
return this.age-o.getAge();
}
}
实现Comparator接口
class AgeComparator implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
return o1.getAge()-o2.getAge();
}
}

GC指的是什么?写出英文全称。垃圾回收机制中,程序员能不能调用垃圾回收器?
GC:是指垃圾回收
英文:garbage collection
程序员无权调用垃圾回收器

System.gc()指的是什么意思?
运行垃圾回收器

finalize方法可以用来做什么?
在垃圾收集器将对象从内存中清除出去前,做必要的清理工作

通过两个事例描述C++,Java不同的内存回收机制
很久很久以前,每家每户“自扫门前雪”,自己收垃圾。
现在,环保局的垃圾车自动收垃圾。
通过,这些例子类比Java和C++不同的回收机制及特点。
C++需要程序员手动编写垃圾回收的代码,如果程序员忘了那么就容易造成内存 溢出等问题
java无需手动编写,jvm的垃圾回收机制会自动进行垃圾回收,减轻了程序员的 工作,也避免由于程序员忘记而造成的各种内存溢出等问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值