JAVA 面向对象基础知识

目录

对象与引用

值传递与引用

this 关键字

this.属性名

static关键字

static修饰变量

static修饰方法

java静态块

代码块

包的作用

包(package)的命名规范

访问权限修饰符

面向对象特征 

封装

封装的好处:

继承

继承的形式:

继承的传递性

继承中的构造方法

super关键字用途

方法的重写(OverRide)

抽象类

抽象方法

抽象类的特点 :

多态 :

 final关键字

 final属性赋值

接口 

接口的定义:

接口的使用:

 接口的特性:


对象与引用

首先定义一个Person类,它有name和age两个属性。

public class Person {
 
     private String name;
     private int age;
      
      public Person(String name, int age){
         this.name =name;
         this.age = age;
      }
}

创建一个对象:

Person p1 = new Person("Wang", 12);

可将以上语句进行拆分

 Person p1;
 p1 = new Person("Wang", 12);
第一条语句 创建了一个Person类型引用变量。
”=”操作符使对象引用指向刚创建的Person那个对象
有两个实体:一是对象引用变量,一是对象本身有两个实体:

值传递与引用

Java 中进行方法调用中传递参数时,参数传递有两种:
1:值传递: ( 形参数类型是基本数据类型 ) :方法调用时,实际参数把它的值传递给
对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是
两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。
2:引用传递: ( 形参数类型是引用数据类型参数 ) :也称为传地址。方法调用时,实
际参数是对象,这时实际参数与形式参数指向同一个地址,在方法执行中,对形
式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下
来,所以方法执行中形式参数的改变将会影响实际参数

this 关键字

this.属性名

有一个教师类 Teacher 的定义如下:
public class Teacher {
    private String name;    // 教师名称
    private double salary;    // 工资
    private int age;    // 年龄
}

在上述代码中 name、salary 和 age 的作用域是 private,因此在类外部无法对它们的值进行设置。为了解决这个问题,可以为 Teacher 类添加一个构造方法,然后在构造方法中传递参数进行修改。代码如下:

// 创建构造方法,为上面的3个属性赋初始值
public Teacher(String name,double salary,int age) {
    this.name = name;    // 设置教师名称
    this.salary = salary;    // 设置教师工资
    this.age = age;    // 设置教师年龄
}

在 Teacher 类的构造方法中使用了 this 关键字对属性 name、salary 和 age 赋值,this 表示当前对象。this name=name语句表示一个赋值语句,等号左边的 this.name 是指当前对象具有的变量 name,等号右边的 name 表示参数传递过来的数值。
创建一个 main() 方法对 Teacher 类进行测试,代码如下:

public static void main(String[] args) {
    Teacher teacher = new Teacher("王峰",5000.0,45);
    System.out.println("教师信息如下:");
    System.out.println("教师名称:"+teacher.name+"\n教师工资:"+teacher.salary+"\n教师年龄:"+teacher.age);
}

运行结果如下:

static关键字

static修饰变量

静态变量可以用于引用所有对象的公共属性(对于每个对象不是唯一的)。如:员工公司名称,学生所在的大学名称。

static修饰方法

如果在任何方法上应用static关键字,此方法称为静态方法。

静态方法属于类,而不属于类的对象。

可以直接调用静态方法,而无需创建类的实例。

静态方法可以访问静态数据成员,并可以更改静态数据成员的值。

java静态块

Java中的静态块主要有两个作用:

用于初始化静态数据成员。

它在类加载时在main方法之前执行。

代码块

代码块在类中声明,类似一个没有名称的方法体 ( 代码块 ) ,代码分实例块和静态块
实例块:每次创建对象时自动调用
{
// 任何符合语法的 Java 代码
}
静态块:类加载时自动调用,仅一次,与是否创建对象无关。
static
{
// 任何符合语法的 Java 代码
}

包的作用

1.避免类重名

2.按照不同功能管理类

3.控制访问权限

包(package)的命名规范

在包名中,可以使用.号来区分包的级别;包名一般情况下是小写
第一级 指该项目的类型。
第二级 指项目所开发或者运行的公司名称。
第三级 指项目的名称。
第四级 指项目模块的名称。
  包可以更好得管理逻辑相关的类,可以控制不同包之间的访问权限
  导入外部包的类,关键字“import”

访问权限修饰符

1:public :公共权限 修饰类、属性、方法。可以被任意类访问
2:protected:受保护的权限 修饰属性、方法。 可以被同包类访问,如果不是同包类,必须是该类的子类才可以访问。
3:default:同包权限 修饰类、属性、方法。只能被同包的类访问
4:private:私有权限 修饰属性、方法。 只能在本类中访问
如图:

面向对象特征 

面向对象语言的三大特征 :封装  继承  多态

封装:

将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问 。

封装的好处:

1.隐藏类的实现细节只能通过规定方法访问
2.方便加入控制语句方便修改实现

public class Demo{ 
private String name; 
public String getName (){ 
return name; 
   }
public void setName(String name){
 this.name = name;
  } 
}

继承

继承是面向对象程序设计不可缺少的设计思想,是实现代码可重用的根基,是提高代码可扩展性的主要途径。
1.继承是从已有的类中派生出新的类,新的类能吸收已有类的属性和行为,
并能扩展新的能力。
2.在JAVA中使用extends关键字来表示继承关系。JAVA不支持多继承,单继承使JAVA的继承关系很简单,一个类只能有一个直接父类。
3. 继承之后子类可以调用父类的所有非私有属性和非私有方法继承是代码重用的一种方式 :

继承的形式:

// [访问权限修饰符][修饰符] 子类名 extends 父类名{子类体}
public class Animal{ 
public void eat(){} 
}
public class Dog extends Animal{ 
public void play(){} 
}

子类对象可以直接调用父类的方法,强调复用性
 Dog dog = new Dog (); 
 dog.eat();


继承的传递性

C 类从 B 类继承 ,B 类又从 A 类继承那么 C 类就具有 B 类和 A 类的所有非私有属性和非私有方法
当一个没有继承任何一个类时 ,jvm 会默认让类继承 Object 类
Object 是 java 为所有类提供的基类

继承中的构造方法

子类构造方法会先调用父类构造方法使用super关键字调用父类任意一个构造方法,必须写在构造方法的第一行
如果子类的构造方法中没有显式地调用基类构造方法,则系统默认调用基类无参数的构造方法。

super关键字用途

• 使用super关键字访问父类成员
• 用super.成员变量名来引用父类成员变量
• 用super.方法名(参数列表)访问父类的方法。
• 用super.构造方法(参数列表)访问父类构造方法
误区: 不要把super误认为是父类对象.在创建子类对象时, 不会创建父类对象. 只会将父类中的信息加载到子类对象中存储.


方法的重写(OverRide)

应用场景
当父类的方法实现不能满足子类需求时 , 可以对方法进行重写 ( override)
● 在子类中可以根据需要对从基类中继承来的方法进行重写。

方法重写规则
• 方法名相同、参数列表相同;
• 返回值类型相同;
• 访问权限不能小于父类权限 ;
注意:构造方法 , 静态方法不能重写 , 成员变量不存在重写

抽象类

抽象方法

1. 抽象方法是一种特殊的方法:它只有声明,而没有具体的实现 .
2.抽象方法必须用 abstract 关键字进行修饰 .
3. 如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
4.抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法。
5. 用 abstract 修饰的类就是抽象类。如果某个类中包含有抽象方法,那么该类就必须定义成抽象类。

抽象类的特点 :

1. 抽象类不能被实例化,但可以有构造方法 , 因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。
2. 抽象类只能用作基类,表示的是一种继承关系。继承抽象类的非抽象类必须实现其中的所有抽象方法,而已实现方法的参数、返回值要和抽象类中的方法一样。否则,该类也必须声明为抽象类。

多态 

同一种事物,在不同时刻表现不同的状态
 多态存在的三个必要条件
1. 要有继承(包括接口的实现) ( 前提条件 )
2. 要有重写 ( 前提条件 )
3. 父类引用指向子类对象
 当编译期类型是父类,运行期类型是子类时,被称为父类引用指向子类对象

class Animal{ 
…… 
}
class Cat extends Animal{ 
…… 
}
class Dog extends Animal {
 …… 
}
Animal x = new Cat() //Animal 的引用指向Cat的对象


多态环境下对成员方法的调用

public class Animal{ void show() {
 System.out.println("Animal");
}

 public class Cat extends Animal{
  void show()
  {
   System.out.println("cat");
  }
 }
//调用的是子类中的方法 简单的说:编译看左边,运行看右边
Animal x = new Cat();
        x.show();


多态环境下对静态成员方法的调用

class Animal{
static void show() {
System.out.println("Animal");
 }
}
class Cat extends Animal {
static void show() {
System.out.println("Cat");
 }
}
//调用的是动物类中的静态成员方法。 简单的说:编译和运行都看左边。
Animal x = new Cat() x.show() ;


多态环境下对成员变量的调用

class Animal{
 int num = 3;
}
class Cat extends Animal {
 int num = 4;
}
 Animal x = new Cat() x.num; //调用的是动物类中的成员变量。

简单的说:编译和运行都看等号左边。
注意:变量不存在被子类覆写这一说法,只有方法存在覆写。


方法参数具有多态性

class Animal{
    void eat() {}
}
class Cat extends Animal{
    void eat() {}
}
class Dog extends Animal{
    void eat(){}
}//方法的形式参数类型是父类类型,而传递的实际参数可以是任意 子类的对象
    method(Animal animal){
        animal .eat();
    }

方法参数多态性的好处:提高代码的扩展

 final关键字

 final 用于声明属性,方法和类。
1.属性:定义就必须直接赋值或者在构造方法中进行赋值,并且后期都不能修改。
2.方法:子类里不可以重写。
•3.类:不能被定义为抽象类或是接口,不可被继承。

 final属性赋值

 在声明时同时赋值,往往与static一起使用。//数据不能在方法体中被修改
声明时不赋值,必须在构造方法中逐一赋值。
 总的原则:保证创建每一个对象的时候,final属性的值是确定的。


接口 

public interface MyInterface {
    int num = 10;
    public void foo() ;
    public static void test(){
    }
    public default void test1(){
    }
}

接口的定义:

使用 interface 关键字用来声明一个接口。

[ 访问修饰符 ] interface 接口名称 [extends 其他的接口名 1,…. 其他的接口名 n]
{
// 声明常量 抽象方法 静态方法 默认方法
}

接口的使用:

 类使用 implements 关键字实现接口。在类声明中, Implements 关键字放在class 声明后面。
[ 访问修饰符 ] class 类名 implements 接口名 1 ,接口名 2……{ }
结合继承:
[ 访问修饰符 ] class 类名 extends 父类名 implements 接口名 1 ,接口名 2……{ }

 接口的特性:

1.接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字
2.接口中方法可以是抽象的,静态的,默认的
3.接口中声明的属性默认为 public static final 的
4. 接口不是被类继承了,而是要被类实现
5. 接口不能实例化对象
6. 与继承关系类似,接口与实现类之间存在多态性
7. 一个接口能继承其它多个接口

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值