黑马程序员-java方法

<1.方法的重载和方法的覆写操作的比较
   No 比较点 重载 覆写
   1 英文单词 OverLoad Override
   2 概念 方法的名称类型或个数不同 方法名称,参数的类型或个数完全形同
   3 注意点 访问的权限不能变小
   4 范围 在一个类中发生 在继承类中发生
<2.对象的多态性
   接口和抽象类的概念
   多态性的存在让程序更加灵活
   多态性是面型对象的最后一个特征
   .方法的重载和覆写实际上就属于多态的一中表现
   .真正的多态性中还包含了一种称为对象多态性的概念
            对象多态性指的是子类与父类的转换关系
      向上转型:父类 父类对象=子类实例 -->自动完成
      乡下转型:子类 子类对象=(子类)父类实例 -->强制完成
说明:
package dom;
class A{
 public void fun1(){
  System.out.println("1.A类-->public void fun1()");
 }
 public void fun2(){
  this.fun1();
 }
};
class B extends A{
 public void fun1(){
  System.out.println("2,B类-->public void fun1()");
 }
 public void fun3(){
  System.out.println("3,B类-->public void fun3");
 }
 
};
public class Text {
 public static void main(String[]args){
  B b=new B();
  b.fun2();
  A a=b; //和A a=new B();一样
  a.fun2();
 }
}
2,B类-->public void fun1()
2,B类-->public void fun1()
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ublic class Text {
 public static void main(String[]args){
  B b=new B();
  b.fun2();
  A a=b; //和A a=new B();一样
  a.fun2();
  a.fun3();//这样会出现错误,因为父类没有这样的方法
 }
}
2.向下转型
package dom;
class A{
 public void fun1(){
  System.out.println("1.A类-->public void fun1()");
 }
 public void fun2(){
  this.fun1();
 }
};
class B extends A{
 public void fun1(){
  System.out.println("2,A类-->public void fun1()");
 }
 public void fun3(){
  System.out.println("3,B类-->public void fun3()");
 }
 
};
public class Text {
 public static void main(String[]args){
  A a=new B();//发生向上转型关系,子类实例-->父类实例
  B b=(B)a;//发生向下转型关系,强制
  b.fun3();
  b.fun2();
 }
}
3,B类-->public void fun3()
2,B类-->public void fun1()
******************************
例子:
//父子关系出现混乱的例子 此异常是继NolPoinyException之后,第二个最容易出现的异常,表示转换的异常
//造成的根本原因是两个没有关系的类进行相互的对象转换
package dom;
class A{
 public void fun1(){
  System.out.println("1.A类-->public void fun1()");
 }
 public void fun2(){
  this.fun1();
 }
};
class B extends A{
 public void fun1(){
  System.out.println("2,A类-->public void fun1()");
 }
 public void fun3(){
  System.out.println("3,B类-->public void fun3()");
 }
 
};
public class Text {
 public static void main(String[]args){
  A a=new A();//这里就像我在大街上被要钱了
  B b=(B)a;
  b.fun3();
  b.fun2();
 }
}
//Exception in thread "main" java.lang.ClassCastException: dom.A cannot be cast to dom.B
//at dom.Text.main(Text.java:23)
<3.
package dom;
class A{
 private void fun1(){
  System.out.println("1.A类-->public void fun1()");
 }
 public void fun2(){
  this.fun1();
 }
};
class B extends A{
 public void fun1(){
  System.out.println("2,B类-->public void fun1()");
 }
 public void fun3(){
  System.out.println("3,B类-->public void fun3()");
 }
 
};
class C extends A{
 public void fun1(){
  System.out.println("2,C" +
    "类-->public void fun1()");
 }
 public void fun4(){
  System.out.println("4,C类-->public void fun4()");
 }
 
};
public class Text {
 public static void main(String[]args){
  fun(new B());
  fun(new C());
 }
 public static void fun(B b){
  b.fun2();
  b.fun3();
 }
 public static void fun(C c){
  c.fun2();
  c.fun4();
 }
}
1.A类-->public void fun1()//private void fun1(){ public void fun1(){方法的覆写关键
3,B类-->public void fun3()
1.A类-->public void fun1()
4,C类-->public void fun4()
.以上的方法是通过重载完成,那么使用以上的方法完成会存在以下的缺点:如果现在A类的子类有100000个
  那么此方法就要重载10000000次而且每次都要修改代码
public class Text {
 public static void main(String[]args){
  fun(new B());
 }
 public static void fun(A a){
  a.fun2();
  B b=(B)a;
  b.fun3();
 }
}
 以上的代码仍然会出现转换异常,那么现在希望如果传入的对象时父类的人以实例调用fun方法取得对应程序
*在java 中提供了instanceof关键字完成这样的功能
格式
对象 instanceof 类-->返回boolean类型的数据 值是true false
public class Text {
 public static void main(String[]args){
 A a=new A();
 System.out.println( a instanceof A);
 System.out.println( a instanceof B);
 }
}
true
false
*******************************
public class Text {
 public static void main(String[]args){
 A a=new B();
 System.out.println( a instanceof A);
 System.out.println( a instanceof B);
 System.out.println( a instanceof C);
 }
}//发生了想下转型
true
true
false
<4.那么
public class Text {
 public static void main(String[]args){
  fun(new B());
  fun(new C());
 }
 public static void fun(A a){
  a.fun2();
  if(a instanceof B ){
   B b=(B) a;
   b.fun3();
  }
  if(a instanceof C){
   C c=(C) a;
   c.fun4();
  }
 }
}
2,B类-->public void fun1()
3,B类-->public void fun3()
2,C类-->public void fun1()
4,C类-->public void fun4()
图片








.为了保证对象的正确转型的正确性,在操作之前最好加上instanceof()关键字进行判断
在java开发中父类的设计很重要
<5抽象类
包含一个抽象方法的类
抽象类不能直接实例化对象,但是可以声明如果
abstract class A{
  public abstract void fun();
 }
class B extends A{
  public void fun(){
    System.out.println("Hello word!!!");
   }
 }
public class Text {
   public static void main(String[]args){
     B b=new B();
     b.fun();
    }
 }
Hello word!!!
3.后象类能否使用final呢?
final abstract class A{//出现错误
  public abstract void fun();
 }
Text.java:1: 错误:非法修饰符abstruct和final
final abstract clas
               ^
Text.java:4: 错误:无法从A中继承
class B extends A{
4.抽象类能否有构造方法
 抽象类中允许有抽象方法,但是该方法不能直接调用,
 要通过子类调用。
abstract class A{
 public A(){
   System.out.println("父类的构造方法");
  }
  public abstract void fun();
 }
class B extends A{
 public B(){
   System.out.println("子类的构造方法");
  }
  public void fun(){
    System.out.println("Hello word!!!");
   }
 }
public class Text {
   public static void main(String[]args){
     B b=new B();
     b.fun();
    }
 }
父类的构造方法
子类的构造方法
Hello word!!!
**********
package dem;
abstract class A{
 private String name;
 public A(String name){
  this.name=name;
 }
 public String getName(){
  return this.name;
 }
 public abstract void fun();
}
class B extends A{
 public B(String name){
  super(name);
 }
 public void fun(){
  System.out.println("你好"+this.getName());
 }
}
public class Text {
 public static void main(String[]args){
  B b=new B("子类");
  b.fun();
 }
}
你好子类
<2.
关于抽象类的应用
从对象的多态性的概念上来看,子类为父类的实例化是一个比较容易的操作
因为可以在自动的向上转型关系,那么调用的方法永远是被子类覆写过的方法
 那么,此时就可以利用此概念通过对象的多态性为抽象类实例化
例如:
人分为两种 分为工人和学生
 假设工人和学生都有姓名和年龄属性但是工人有工龄,学生有成绩
 工人和学生都可以说话但是内容不一样
package dem;
abstract class A{
 private int age ;
 private String name;
 public A(String name,int age){
  this.age=age;
  this.name=name;
 }
 public abstract String getContent();
 public void say(){
  System.out.println(this.getContent());
 }
 public String getName(){
  return this.name;
 }
 public int getAge(){
  return this.age;
 }
}
class B extends A{
 String school;
 public String getSchool(){
  return this.school;
 }
 public B(String name,int age,String school){
  super(name,age);
  this.school=school;
 }
 public String getContent(){
  return "Im student";
 }
}
class C extends A{
 String gongling;
 public String getSchool(){
  return this.gongling;
 }
 public C(String name,int age,String gongling){
  super(name,age);
  this.gongling=gongling;
 }
 public String getContent(){
  return "Im worker";
 }
}
public class Text {
 public static void main(String[]args){
  A a=new B("王琪",20,"辽工大");
  A aa=new C("丫丫",20,"工龄50");
  a.say();
  aa.say();
 }
}
Im student
Im worker
<5.违纪卡
            违纪卡
姓名 班级
日期 事由
抽象类的最大用途在于模板设计
进而进入接口
package dom;
interface A{
 public void fun();
}
class B implements A{
 public void fun(){
  System.out.println("hello");
 }
}
public class text {
 public static void main(String[]args){
  A a=new B();//为接口实例化
  a.fun();
 }
}
hello
  接口是作为一个标准存在
  ***********USB****************
package dom;
interface USB{
 public void start();//开始操作
 public void stop();
}
class computer{
 public static void plugin(USB usb){
  usb.start();
  usb.stop();
 }
}
class Flash implements USB{
 public void start(){
  System.out.println("u盘开始工作");
 }
 public void stop(){
  System.out.println("u盘停止工作");
 }
}
class printer implements USB{
 public void start(){
  System.out.println("打印机开始工作");
 }
 public void stop(){
  System.out.println("打印机停止工作");
 }
}
public class text {
 public static void main(String[]args){
  computer.plugin(new Flash());
  computer.plugin(new printer());
 }
}
u盘开始工作
u盘停止工作
打印机开始工作
打印机停止工作
      
<6.接口(重点)
接口是一个特殊的类,在java中接口是由抽象方法和全局常量组成
在java中interface定义一个接口
  在接口中定义了两个抽象方法,一个全局常量
  那么接口与抽象类一样,需要有子类,那么此时子类
  不再称位继承类,而是实现接口通过implements实现
package dom;
interface first{
 public static final String INFO="CHINA";//public static final可省
 public abstract void print();//public abstract可省
 public abstract void fun();//public abstract可省
}
class second implements first{//子类实现接口
 public void print(){//实现抽象方法
  System.out.println("hello java");
 }
 public void fun() {
  System.out.println(INFO);
 }
}
public class Text2 {
 public static void main(String[]args){
  second b=new second();
  b.print();
  b.fun();
 }
}
hello java
CHINA
  一个类虽然只能继承一个父类,但是一个类可以同时实现多个接口,使用接口完成多继承
package dom;
interface first{
 public static final String INFO="CHINA";//public static final可省
 public abstract void print();//public abstract可省
 public abstract void fun();//public abstract可省
}
interface second {
 String mimi="琪琪";
 void talk();
}
class last implements first,second{//子类实现接口
 public void print(){//实现抽象方法
  System.out.println("hello java");
 }
 public void fun() {
  System.out.println(INFO);
 }
 public void talk(){
  System.out.println(INFO+mimi);
 }
}
public class Text2 {
 public static void main(String[]args){
  last b=new last();
  b.print();
  b.fun();
  b.talk();
 }
}
hello java
CHINA
CHINA琪琪
***************************
那么如果这样
package dom;
interface A{
 public void printA();
}
interface B{
 public void printB();
}
interface C extends A,B{
 public void printC();
}
abstract class D implements C{
 public abstract void printD();
public void printC(){
  System.out.println("Im C");
 }
}
class X extends D{
 public void printB() {
  System.out.println("Im B");
 }
 public void printA() {
  System.out.println("Im A");
 }
 public void printD() {
  System.out.println("Im D");
 }
 
}
public class Text2 {
 public static void main(String[]args){
  X x=new X();
  x.printA();
  x.printB();
  x.printC();
  x.printD();
 }
}
Im A
Im B
Im C
Im D
//一个抽象类可以实现多个接口,但是一个接口不可继承一个抽象类,但是一个接口可以继承多个接口
  <6.适配器设计
  开窗设计
  正常情况下接口的子类要实现全部的抽象方法
  现在想选根据自己的喜好择性的覆写
package dom;
interface Window{
 public void open();//打开窗口
 public void close();//关闭窗口
 public void inco();//最大化
 public void uninco();//最小化
}
abstract class windowAdpater implements Window{
 public void open(){}
 public void close(){}
 public void inco(){}
 public void uninco(){}
}
class myWindow extends windowAdpater{
 public void open(){
  System.out.println("打开窗口");
 }
}
public class Text3 {
 public static void main(String[]args){
  Window win=new myWindow();
  win.open();
 }
}
打开窗口
<6.//适配器设计(工厂设计模式)
   package dom;
interface Fruit{
 public void eat();
}
class Apple implements Fruit{
 public void eat(){
  System.out.println("吃苹果..");
 }
}
class Orange implements Fruit{//工厂类
 public void eat(){
  System.out.println("吃橘子..");
 }
}
class myFruit {
 public static Fruit getFruit(String classname){
  Fruit f=null;
  if("Apple".equals(classname)){
   f=new Apple();
  }
  if("Orange".equals(classname)){
   f=new Orange();
  }
  return f;
 }
}
public class Text {
 public static void main(String[]args){
  Fruit f=myFruit.getFruit(args[0]);
  if(f!=null){
   f.eat();
  }
 }
}
D:\java>
D:\java>
吃苹果..
D:\java>
吃橘子..
D:\java>
Exceptio
D:\java>
所有的实例化对象通过工厂类取得
那么客户调用不同的名称完成不同的操作
               





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值