面向对象
面向对象和面向过程的区别
面向过程主要是把问题分解成不同的步骤,然后把各个步骤转换成方法,最后根据步骤调用相应的方法,它更加强调过程
面向对象会把问题分解成各个对象,然后各个对象之间进行交互,每个对象内部进行了封装
通过不同对象之间方法的调用来完成一个项目或者是解决一个问题(但是这样直接在调用方里面创建对象会造成代码耦合度过高)
面向过程注重过程,面向对象注重对象之间的交互。面向对象将复杂的事情简单化,我们从行动者变成了指挥者。面向对象开发就是去创建对象,指挥对象做事情。
跨平台
Java的跨平台是基于JVM(Java虚拟机)的。不同的操作系统有不同版本的JVM负责加载运行Java程序。
封装
-
什么是封装?
封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
-
封装的优点?
隐藏代码的实现细节,提高安全性。
就像电视机提供了对外的一些按钮,但是里面的电路设计,逻辑设计是看不到的。Java的封装性主要体现在访问控制符上,分别是private、默认的、protected、public。
修饰词 | 本类 | 同一个包的类 | 子类 | 任何地方 |
---|---|---|---|---|
private | √ | × | × | × |
default(默认) | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
-
public:公共访问修饰符,该变量是公共的,可以被任何类的方法访问
-
private: 私有访问修饰符,该变量只允许本类的方法访问,其他任何类(包括子类)中的方法均不能访问
-
protected: 保护访问修饰符,该变量可以被本类、子类及同一个包中的类访问,在子类中可以覆盖该变量
-
默认:默认访问修饰符,该变量在同一个包中的类可以访问,其他包中的类不能访问
场景:
public class Person {
String name;//姓名
int age;//年龄
}
上面定义了一个Person类,下面写一个PersonTest类对其进行测试
public class PersonTest{
public static void main(String[] args){
//1.创建Person类型的对象
Person p = new Person();
System.out.println(p.age); //0
p.age = -10;//这个地方的数据不合理
}
}
上面的PersonTest类中人的年龄出现了-10,这显然是一个不合法的数据,所以应该将Person类中的age隐藏起来,不能让外界直接访问,需要使用private修饰符将age进行封装。
public class Person {
private String name;
private int age;
/*
添加private修饰之后,外界无法直接访问age了。
这时需要提供两个方法供外界访问即set方法和get方法。
*/
//对外提供两个公开的方法。
//set方法 用于给年龄赋值
public void setAge(int age){
//安全控制
if(age<0 || age>120){
System.out.println("年龄不合法");//这里可以自定义异常
return;
}
this.age = age;
}
//get方法 用于读取年龄
public int getAge(){
return age;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
}
创建测试类
public class PersonTest{
public static void main(String[] args){
//1.创建Person类型的对象
Person p = new Person();
p.setName("郝仁");
p.setAge(20);
System.out.println(p.getName());
System.out.println(p.getAge());
}
}
继承
-
什么是继承?
继承是面向对象三大特征之一。java中的继承描述的是两个类之间的关系,被继承的类成为父类或者基类,继承的类称为子类或派生类。使用extends关键字来表示。在java语言里面只支持单继承,即一个子类只能有一个父类,子类可以继承父类中的非private修饰的成员方法和成员变量,构造方法不能继承。如果一个类没有显示的继承其他类,那么这个类会默认继承Object类,Object是SUN公司提供的java中的根类。
-
继承的优缺点?
优点:提高了代码的复用性、提高了代码的维护性、让类与类之间产生了关系,是多态的前提
缺点:增强了类之间的耦合。软件开发的一个原则是高内聚,低耦合。内聚是一个模块内各个元素彼此结合的紧密程度。耦合是一个软件里面不同磨具爱之间相互连接的数量。
Java只允许单继承,但是可以实现多个类。单根继承结构保证所有对象都具备某些功能,如Java的所有类都有一个共同的父类—Object类,即所有的类都可以调用Object类中的方法,如wait()方法及其重载方法,notify和notifyAll()方法等用于线程间通信的方法,clone()方法,toString()方法,equals(Object o)方法和hashCode()方法等,这些方法在Java的开发过程中都有很大的作用。
此外,用final关键字修饰的类不能被继承,如String类
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
子类是可以继承父类中所有的属性和方法的,但是会受到访问权限的限制,子类是无法访问父类中用private修饰的变量和方法的。
多态
多态就是事物存在的多种形态,比如你在大街上看见一只藏獒,你可以说这只藏獒真凶猛,也可以说这只狗真凶猛,还可以说这个动物真凶猛,以上三种说法其实都是指的这只藏獒。
Java中的多态分为静多态和动多态,静多态就是方法的重载。动多态,也叫做运行时多态,是基于RTTI(运行时类型识别)的。大致的过程为基类的引用引用派生类的对象,然后使用这个基类的引用调用派生类重写后的方法。因为class对象是派生类的class对象,所以在查方法表的时候,是调用的派生类重写之后的方法而非从基类继承来的方法。
动多态的三要素:继承、向上造型、方法重写。
多态可以提高代码的复用性,同样的一个方法名,内部的实现是不同的,如People类和其派生类Student类与Teacher类,如果写一个打印People一天生活日志的方法,入参为People的引用,这时无论是Student类还是Teacher类,均可作为入参进入此方法,然后调用People的方法eat()方法,sleep()方法等,至于具体的实现要看Student类和Teacher类是否重写了。
基类的引用引用派生类的对象,可以调用基类的方法,通过强转引用的类型也可以调用派生类特有的方法