黑马程序员-----Java基础----面向对象(二)

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------        

                 面向对象()

三.代码块

 

A:代码块概述
  在Java中,使用{}括起来的代码被称为代码块。
 B:代码块分类
  根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块.
 C:常见代码块的应用
  a:局部代码块 
  在方法中出现;限定变量生命周期,及早释放,提高内存利用率
  b:构造代码块 
  在类中方法外出现;多个构造方法方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行
  c:静态代码块 
  在类中方法外出现,加了static修饰
  在类中方法外出现,并加上static修饰;用于给类进行初始化,在加载的时候就执行,并且只执行一次。

 

四.继承

 

1.概述:    

A:继承概述
 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
B:继承格式
 通过extends关键字可以实现类与类的继承
 class 子类名 extends 父类名 {}  
 单独的这个类称为父类,基类或者超类;这多个类可以称为子类或者派生类。

 

2.继承的好处和弊端

A:继承的好处
  a:提高了代码的复用性
  b:提高了代码的维护性
  c:让类与类之间产生了关系,是多态的前提
 B:继承的弊端
  类的耦合性增强了。
        
  开发的原则:高内聚,低耦合。
  耦合:类与类的关系
  内聚:就是自己完成某件事情的能力

 

3.Java中继承的特点

 

A:Java中类的继承特点
  a:Java只支持单继承,不支持多继承。
   有些语言是支持多继承,格式:extends 类1,类2,...
  b:Java支持多层继承(继承体系)

 

4.继承的注意事项和什么时候使用继承

 

A:继承的注意事项


  a:子类只能继承父类所有非私有的成员(成员方法和成员变量)
  b:子类不能继承父类的构造方法,但是可以通过super(待会儿讲)关键字去访问父类构造方法。
  c:不要为了部分功能而去继承
 B:什么时候使用继承
  继承其实体现的是一种关系:"is a" .        
  采用假设法。
  如果有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。

 

4.继承中成员变量的关系

 

A:子类中的成员变量和父类中的成员变量名称不一样
 

B:子类中的成员变量和父类中的成员变量名称一样
  在子类中访问一个变量的查找顺序("就近原则")
  a: 在子类的方法的局部范围找,有就使用
  b: 在子类的成员范围找,有就使用
  c: 在父类的成员范围找,有就使用
  d:如果还找不到,就报错

 

5.this和super的区别和应用

      子类局部范围访问父类成员变量
     

     A this和super的区别
   

      this代表的是本类对象的引用
   super代表的是父类存储空间的标识(可以理解成父类的引用,可以操作父类的成员)
   

     B this和super的使用
   a:调用成员变量
    this.成员变量 调用本类的成员变量
    super.成员变量 调用父类的成员变量
    b:调用构造方法
   this(...)    调用本类的构造方法
   super(...)    调用父类的构造方法
   c:调用成员方法
    this.成员方法 调用本类的成员方法
    super.成员方法 调用父类的成员方法

 

6.继承中构造方法的注意事项

 

  父类没有无参构造方法,子类怎么办?
  

    a: 在父类中添加一个无参的构造方法
  b:子类通过super去显示调用父类其他的带参的构造方法
   c:子类通过this去调用本类的其他构造方法
  本类其他构造也必须首先访问了父类构造
  

    注意事项
  super(…)或者this(….)必须出现在第一条语句上
  如果是不放在第一句上,就可以出现对父类的数据进行多次初始化,所以必须放在第一句

 

7.继承中成员方法关系

 


  a:当子类的方法名和父类的方法名不一样的时候
  b:当子类的方法名和父类的方法名一样的时候
  通过子类调用方法:
  a: 先查找子类中有没有该方法,如果有就使用
  b:在看父类中有没有该方法,有就使用
  c: 如果没有就报错

8.方法重写概述及其应用

 

A:什么是方法重写
  子类中出现了和父类中一模一样的方法声明(方法名,参数列表,返回值类型),也被称为方法覆盖,方法复写。
 B:方法重写的应用:
  当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法。
  这样,即沿袭了父类的功能,又定义了子类特有的内容。

 

9.方法重写的注意事项

 

A:方法重写注意事项
  a:父类中私有方法不能被重写,因为父类私有方法子类根本就无法继承
  b:子类重写父类方法时,访问权限不能更低,最好就一致
  c:父类静态方法,子类也必须通过静态方法进行重写,子类重写父类方法的时候,最好声明一模一样。

 

10.final关键字概述

 

由于继承中有一个方法重写的现象,而有时候我们不想让子类去重写父类的方法

 

final修饰特点
修饰类:     被修饰类不能被继承
修饰方法:    被修饰的方法不能被重写
修饰变量:    被修饰的变量不能被重新赋值,因为这个量其实是一个常量

 

final修饰变量的初始化时机
a: 被final修饰的变量只能赋值一次
b:在构造方法完毕前即可(非静态的常量)

 

四.多态

 

1.概述

 

A:多态概述
  某一个事物,在不同时刻表现出来的不同状态。
  举例:
  猫可以是猫的类型。猫 m = new 猫();
  同时猫也是动物的一种,也可以把猫称为动物。动物 d = new 猫();
 B:多态前提
  a:要有继承关系。
  b:要有方法重写。 其实没有也是可以的,但是如果没有这个就没有意义。
  c:要有父类引用指向子类对象。
   父 f =  new 子();

2.

  A:多态中的成员访问特点
  a:成员变量
   

      编译看左边,运行看左边。
  b:构造方法
   

      创建子类对象的时候,会访问父类的构造方法,对父类的数据进行初始化。
  c:成员方法


   编译看左边,运行看右边。
  d:静态方法


   编译看左边,运行看左边。
   (静态和类相关,算不上重写,所以,访问还是左边的)

 

3.多态的好处与弊端

 

  a:提高了代码的维护性(继承保证)
  b:提高了代码的扩展性(由多态保证)

    

    弊端不能使用子类特有的方法

 

五.抽象类

 

1.概述

  a:抽象类和抽象方法必须用abstract关键字修饰
  抽象类格式:     abstract class 类名 {}
  抽象方法格式:    public abstract void eat();
   b:抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
  c:抽象类中可以有构造方法,抽象类不能进行实例化,用于子类访问父类数据时的初始化
  d:抽象类不能实例化,按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
  e:抽象类的子类
  要么是抽象类
  要么重写抽象类中的所有抽象方法

2.抽象类的成员特点

 

A:抽象类的成员特点
  a:成员变量:既可以是变量,也可以是常量。
  b:构造方法:有.用于子类访问父类数据的初始化。
  c:成员方法:既可以是抽象的,也可以是非抽象的。
 B:抽象类的成员方法特性:
  a:抽象方法      强制要求子类做的事情。
  b:非抽象方法     子类继承的事情,提高代码复用性。

 

六.接口

 

1.概述

 

    为了体现事物功能的扩展性,Java中就提供了接口来定义这些额外功能,并不给出具体实现,将来哪些猫狗需要被培训,只需要这部分猫狗把这些额外功能实现即可

 

2.接口特点
 a:接口用关键字interface表示格式: interface 接口名 {}
 b:类实现接口用implements表示 格式: class 类名 implements 接口名 {}
 c:接口不能实例化
  那么,接口如何实例化呢?
  按照多态的方式来实例化。
 d:接口的子类
  a:可以是抽象类。但是意义不大。
  b:可以是具体类。要重写接口中的所有抽象方法。(推荐方案)

3.接口成员特点
  成员变量;只能是常量,并且是静态的。
  默认修饰符:public static final
  构造方法:接口没有构造方法。
  成员方法:只能是抽象方法。默认修饰符:public abstract

 

4.类与类,类与接口,接口与接口的关系

 

 a:类与类:
  继承关系,只能单继承,可以多层继承。
 b:类与接口:
  实现关系,可以单实现,也可以多实现。
  并且还可以在继承一个类的同时实现多个接口。
 c:接口与接口:
  继承关系,可以单继承,也可以多继承。

 

5. A:成员区别
    抽象类:
    成员变量:可以变量,也可以常量
    构造方法:有
    成员方法:可以抽象,也可以非抽象
    接口:
    成员变量:只可以常量
    成员方法:只可以抽象    
  B:关系区别
   类与类
   继承,单继承
   类与接口
   实现,单实现,多实现
   接口与接口
   继承,单继承,多继承    

 

运动员和教练的代码实现

 

 

 

//接口

interface StudyEnglish{

 

public abstract void studyEnglish();

}

 

abstract class Person

{

 

private String name;

private int age;

 

public Person(){};

public Person(String name,int age){

 

this.name = name;

this.age = age;

}

public void setName(String name){

this.name = name;

}

 

public String getName(){

return name;

}

public void setAge(int age){

this.age = age;

}

 

public int getAge(){

 

return age;

}

 

public abstract void eat();

}

abstract class Player extends Person{

 

public Player(){}

 

public Player(String name,int age){

 

super(name,age);

}

public abstract void study();

}

abstract class Coach extends Person{

 

public Coach(){}

 

public Coach(String name,int age){

super(name,age);

}

public abstract void teach();

}

//四个非抽象类

class PingpangPlayer extends Player implements StudyEnglish

 

{

public PingpangPlayer(){}

 

public PingpangPlayer(String name,int age){

 

super(name,age);

}

public void eat(){

System.out.println("吃米饭");

}

public void study(){

System.out.println("学发球");

}

 

public void studyEnglish(){

System.out.println("学英语");

}

 

}

 class BasketballPlayer extends Player

 

{

public BasketballPlayer(){}

 

public BasketballPlayer(String name,int age){

 

super(name,age);

}

public void eat(){

System.out.println("吃饺子");

}

public void study(){

System.out.println("学罚球");

}

class PingpangCoach extends Coach implements StudyEnglish

 

{

public PingpangCoach(){}

 

public PingpangCoach(String name,int age){

 

super(name,age);

}

public void eat(){

System.out.println("吃米饭");

}

public void teach(){

System.out.println("教发球");

}

 

public void studyEnglish(){

System.out.println("学英语");

}

 

}

 

class BasketballCoach extends Coach

 

{

public BasketballCoach(){}

 

public BasketballCoach(String name,int age){

super(name,age);

}

public void eat(){

 

System.out.println("吃饺子");

}

public void teach(){

System.out.println("教罚球");

}

}

class TestDemo

{

public static void main(String[] args){

PingpangPlayer p = new PingpangPlayer();

p.setName("王励勤");

p.setAge(28);

 

System.out.println(p.getName()+"---"+p.getAge());

p.eat();

p.study();

p.studyEnglish();

}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值