JAVA面向对象的三大特征:封装,继承,多态。
1.封装
(1)封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现的细节,仅通过公开的接口和对象交互。
封装使类成为一个具有内部属性的有隐藏功能的代码模块。
通俗的理解就是将类内部的一些属性和方法隐藏起来,屏蔽细节。
(2)JAVA中通过类和访问权限来实现封装:类可以将数据和封装数据的方法结合在一起,访问权限就是用来控制方法或者属性能否在类外使用。
所以权限访问就是封装的关键,JAVA中提供了四种权限访问限定符:private,public,default,protected。
private:只能在同一包中的同一类中使用,将属性和方法设为私有,阻止类外随意修改。
public:通常用来修饰公共属性和方法,让使用者能了解最基本的信息。
default:能在同一包的同一类和同一包不同类中使用。
protected:不仅能在同一个包中使用,还能在不同包子类中使用,protected 在继承中使用,所以在封装中不多赘述。
下面通过代码演示可以更直观:
public class Test1 { //这是一个类
private int a = 10;//被private修饰的变量
public int a2 = 20;//public修饰的变量
Ststem.out.printlf(a+a2);//同一类中两者都可以调用
}
class Test2 { //另一个类
public static void main(String[] args) {
Test1 s = new Test1();//实例化对象
System.out.println(s.a);//private修饰的变量不能在别的类中使用,否则编译报错
System.out.println(s.a2);//public修饰的变量访问权限最高
}
}
当然,想要在类外修改被private修饰的变量,也并非不可能,我们可以在封装类添加一个方法进行赋值,在类外调用此方法,就可以实现改变。
2.继承
面向对象思想中专门提出继承的概念,进行共性提取,实现代码的复用。
(1)继承:是面向对象程序设计使代码可以复用的重要手段,它能使类在保持原有的属性的情况下进行扩展,增添新功能,这样产生的新类,叫派生类(子类),被继承的类叫基类(父类)。
为什么使用继承?举个例子:创建一个猫类,再创建一个狗类,两个类中都有name,age,color的属性和sleep方法,这样我们在使用这两个类的时候,要分别对两个类进行给予属性和方法,会大大增加代码量和出现bug的机率。但当我们创建一个动物类,将两个类中共同的属性和方法放入动物类,再让两个类继承动物类,就可以解决上述问题。
(2)继承语法:
修饰词 子类 extends 父类{ ....};
(3)子类访问父类的成员属性和方法:
当子类中的属性和方法和父类没有重名时,调用时优先先去子类中寻找,如果子类没有则去父类中寻找。
当子类中方法和属性和父类有重名时,优先调用子类;如果方法构成重载,则根据参数的不同调用合适的方法。
(4)子类构造方法
调用子类构造时,会先自动调用父类的构造方法,再调用子类自己的,通俗的讲:先有父,再有子。在代码中演示:
public class Base { //父类
public Base(){ //父类的构造方法
System.out.println("Base()");
}
}
public class Derived extends Base{ //继承父类的子类
public Derived(){ //子类构造方法
System.out.println("Derived()");// 子类构造方法中默认会调用基类的无参构造方法:super(),没有写时,
编译器会自动添加,而且super()必须是子类构造方法中第一条语
句,并且只能出现一次
}
}
public class Test {
public static void main(String[] args) {
Derived d = new Derived();//实例化子类
}
}
结果打印:
Base() //证明调用子类构造方法时先调用父类后调用子类
Derived()
注意:父类没有自定义构造方法时,默认有一个无参数的构造方法,此时调用子类构造方法也会进入父类调用父类的构造方法。但是当自定义父类的构造方法时,父类的构造方法带有参数,这时调用子类,就会发生编译错误。
public class Test1 {
public Test1(int i){ //带参数的父类构造方法
}
}
class Test2 extends Test1 {
public Test2(){ //调用子类构造方法,发生编译错误
//当加上super(1)时,则正常编译,()内要和父类构造参数列表数据类型一致
}
}
class tase{
public static void main(String[] args) {
Test2 s = new Test2();
}
}
(5)super和this
相同点:super和this都是JAVA中的关键字,它们都可以在成员方法中来访问成员属性和成员方法;都可以作为构造方法的第一条语句,但必须是第一条语句,且两者不能同时存在。
不同点:this是当前对象的引用,即调用实例方法的对象,super相当于子类对象中从父类继承下来成员的引用。
在非静态成员方法中,this用来访问本类成员属性和成员方法,super用来访问父类方法和属性。
在构造方法中,this()用于调用本类构造方法,super()用于调用父类构造方法。
3.多态
多态通俗来说就是去完成某个行为,当不同的对象去完成时,会产生出不同的状态。
(1)多态的三个条件:
必须在继承体系下进行。
子类要重写父类的方法。
通过父类的引用调用重写的方法。
(2)实现多态
public class Animal { //父类
String name;
int age;
public Animal(String name, int age){ //父类带参的构造方法
this.name = name;
this.age = age;
}
public void eat(){
System.out.println(name + "吃饭");
}
}
public class Cat extends Animal{ //子类
public Cat(String name, int age){ //子类带参的构造方法
super(name, age);
}
@Override
public void eat(){ //重写父类方法
System.out.println(name+"吃鱼~~~");
}
}
public class Dog extends Animal { //子类
public Dog(String name, int age){ //子类带参的构造方法
super(name, age);
}
@Override
public void eat(){
System.out.println(name+"吃骨头~~~");
}
}
public class TestAnimal {
// 编译器在编译代码时,并不知道要调用Dog 还是 Cat 中eat的方法
// 等程序运行起来后,形参a引用的具体对象确定后,才知道调用那个方法
// 注意:此处的形参类型必须时父类类型才可以
public static void eat(Animal a){
a.eat();
}
public static void main(String[] args) {
Cat cat = new Cat("元宝",2);
Dog dog = new Dog("小七", 1);
eat(cat);
eat(dog);
}
}
运行结果:
元宝吃鱼~~~
元宝正在睡觉
小七吃骨头~~~
小七正在睡觉
标签:调用,封装,name,构造方法,子类,多态,JAVA,父类,public
From: https://blog.csdn.net/credif/article/details/144986888