JAVA基础——
面向对象的三大特性以及配置环境
文章目录
前言
是培训课预习的第一次尝试,本文将综合所学内容,所查阅的资料以及一些个人理解,给出对JAVA的三大性质的一些理解以及安装过程中笔者遇到的问题和解决过程。
一、面向对象编程核心思想——封装
含义
将数据和对数据的操作封装在一起, 通过抽象(从具体的实例中抽取共同的性质)形成一般的概念。
是一种将抽象性函式接口的实现细节部分包装,隐藏起来的方法。
(一个小例子:电源插座。插口对应接口,复杂的内部电路结构对应属性和方法。)
实现
使用访问权限修饰符(private,protect,public)实现
(以下按访问权限排序)
private:修饰的成员变量和方法称为私有变量/私有方法,创建对象后,对象不能访问私有变量,调用类中的私有方法。
(私有类变量和私有类方法同样不能。)
public:修饰的成员变量为和方法称为共有变量/共有方法,创建对象后可以访问自己的public变量和类中的public方法。
(public类变量/方法同样可以。)
友好变量/友好方法:不用private,public和protected修饰符修饰的成员变量和方法。当在另一个类中用该类创造了一个对象,如果这两个类在同一个包中,对象可以访问自己的友好变量/友好方法
protected:当另一个类中用该类创造了一个对象后,如果两个类在同一个包里,那么该对象可以访问自己的protected变量和protected方法。任何一个与该类在同一个包中的类也可以通过类名访问protected变量和protected方法
例子
package com.company;
class Student{
private int age;
public void setAge(int age){
if(age>=7&&age<=28)
{
this.age=age;
}
}
public int getAge(){
return age;
//这样的话年龄就属于私有变量
//对年龄的操作是public方法
}
}
public class Main {
public static void main(String []args){
Student zhang=new Student();
zhang.setAge(23);//合法操作,可以访问public方法
zhang.age=23;//非法操作,不可访问private变量
}
}
优点
1.隐藏信息,实现细节,安全性提高。
2.封装细节,便于修改内部代码,提高可维护性。
3.提高复用性,减少冗长的代码
4.减少耦合性,简化外部调用,便于调用者使用。
二.先进的编程模式——继承
含义
子类可以继承父类的属性和行为,即继承父类所具有的数据和数据上的操作,同时又可以增添子类独有的数据和数据上的操作。
实现
通过使用关键字extend来定义一个类的子类
class 子类名 extends 父类名{
...
}
注意:
- 子类和父类在同一个包:子类继承了父类中不是private的成员变量和方法,访问权限保持不变;
- 子类和父类不在同一个包的时候,private和友好访问权限的成员变量不会被子类继承,子类只继承protected和public访问权限的成员变量和方法。
- JAVA不支持多重继承,但是一个类可以作为多个接口。
例子
package com.company;
class Student{ //父类
String name="jiulinbei";
int age=20;
private int schoolnumber=202001;
void showStudent(){
System.out.println(name);
System.out.println(age);
}
}
class BulemSuner extends Student{
void study(){
System.out.println("I can learn JAVA");
}
}
public class Main {
public static void main(String []args){
BulemSuner mengxin=new BulemSuner();
mengxin.schoolnumber =2020010000;//非法操作,继承不到父类的private变量
mengxin.age=21;//调用继承的变量
mengxin.showStudent() ;//调用继承的方法
mengxin.study() ;
}
}
成员变量的隐藏与方法重写
成员变量的隐藏
编写子类时,所声明的成员变量名字与从父类继承的成员变量名字相同,子类就会隐藏所继承的的成员变量
特点:
- 子类调用这个重复名称的成员变量时,是调用到子类重新申请的成员变量;
- 子类对象仍然可以调用从父类继承的方法操作被子类隐藏的成员变量。
注意:子类继承的方法只能调用子类继承和隐藏的成员变量,新定义的方法可以操作子类继承和新声明的变量,操作子类隐藏的变量需要使用super关键字。
方法重写
子类通过重写可以隐藏已经继承的方法,把父类的状态和行为转换自身的状态或行为。
注意:
- 重写可以操作继承的成员变量,调用继承的方法,也可以操作子类新声明的成员变量,调用新定义的犯非法,但是使用被子类隐藏的变量和方法需要使用super关键字
- 重写时怒允许降低方法的访问权限,但是可以提高。
super关键字
操作被隐藏的成员变量和方法
package com.company;
class A{
public String name="X"; //添加成员变量
public void say() { //添加成员方法say
System.out.println("我是父类A成员方法say");
}
}
class B extends A{
public String name="Y"; //与父类中同名的字段,隐藏父类
public void say(){ //重写方法say
super.say(); //使用super关键字调用父类中的方法
System.out.println("我是子类B成员方法say");
System.out.println("父类的name名字:"+super.name); //使用super关键字访问父类中的变量
}
}
public class Main {
public static void main(String[] args) {
B b=new B(); //创建子类的一个实例对象
b.say(); //调用子类中重写的方法
System.out.println("子类的name名字:"+b.name); //调用子类中的name
}
}
结果:
我是父类A成员方法say
我是子类B成员方法say
父类的name名字:X
子类的name名字:Y
final关键词
final可以修饰类,变量和方法中的局部变量。
- final类:不能被继承,不允许拥有子类;
- final方法:不允许子类重写,不能被隐藏
- final常量:成员变量或局部变量被final修饰就是常量,运行期间不允许改变。
优点
- 提高了代码的复用性,减少工作量。
- 提高了代码的可拓展性。
- 让类与类之间产生了关系,是多态的前提。
三.面向对象的重要特征——多态
含义
有两种意义的多态:
一种多态是操作名称的多态,即多个操作拥有相同的名字,但这些操作所接收的消息类型必须不同。所谓操作名称的多态性,是指可以向操作传递不同的消息,以便让对象根据相应的消息来产生相应的行为。(但是并不作此篇重点 doge)
另一种多态是和继承相关的多态,是指同一操作被不同类型对象调用时可能产生的不同行为。
(非常重要,以下主要讲解这种形式的多态)
实现
- 实现条件:
继承、方法重写、父类引用指向子类对象。 - 实现方法:
父类引用指向子类对象后,用该父类引用调用子类重写的方法
例子
package com.company;
class animal{
public void cry(){
System.out.println("animal 叫了一声儿:");
}
}
class dog extends animal{
public void cry() {
System.out.println("dog:woofwooooooof!");
}
}
class cat extends animal{
public void cry(){
System.out.println("cat:meowmeooooooow!");
}
}
public class Main {
public static void main(String []args){
animal animal=new animal();
animalCry(animal);
dog d=new dog();
animalCry(d);
cat c=new cat();
animalCry(c);
}
//多态的关键:通过父类的引用调用子类重写的方法。
static void animalCry(animal animal){
animal.cry();
}
}
优点
说明:java多态的优点摘抄自:java多态的好处
- 可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
- 可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
- 接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
- 灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
- 简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
四.配置环境的一个小问题
具体配置JDK的方法可以参见群里所给出的“后端软件安装指导”,这里记录一个笔者在安装过程中遇到的小问题嗷呜。
比如…
当安装好jdk,并且输入javac的结果也是正确的。
然后你想做一个小测试,比如编译运行,输出一下这个无害的helloworld…
然后!!!惊恐地发现
什么????!他出现乱码了。
不要慌嗷呜,相信自己不是安装的问题,不可映射字符也不是中英文符号的问题QAQ。或许可能是因为编码选择的类型出了一点儿小问题。(虽然我也不知道为什么我的文本会自动设定成utf-8QAQ)
!解决的方法
- 另存文本把保存左边框框里编码改成ANSI,在重新编译
- javac -encoding utf-8 文件名.java 进行编译
好耶!!大功告成!