Java学习笔记06-07

Java学习笔记06-07

内部类

  1. 定义在class内部的类
  2. 编译产生Outclass$InnerClass文件
  3. 内部类如果要访问外部类的变量,则该变量需要用final来修饰

第1种 创建对象引用

    package zhangBase;
    class A
    {
        final String name = "走你";
        class B
        {
            public void go() 
            {
                System.out.println("快跑");
            }
        }
    }

    public class Java_innerAndOutClass {

        public static void main(String[] args) {
            // TODO Auto-generated method stub
            new A().new B().go();
        }

    }

第2种 静态类引用

    package zhangBase;
    class A
    {
        final String name = "走你";
        static class B
        {
            public void go() 
            {
                System.out.println("快跑");
            }
        }
    }

    public class Java_innerAndOutClass {

        public static void main(String[] args) {
            // TODO Auto-generated method stub
            new A.B().go();
        }

    }

内部类直接调用外部类的变量方法

package zhangBase;
class dd{
    public String tires="5";//第一个最终访问的是这个
    public String name="王五";
    class B{
        public String tires="6";//第二个访问的是这个
        public String name;
        B(String name){
            this.name = name;
        }
        public void go() 
        {
            System.out.println("快跑"+dd.this.name+dd.this.tires);
            System.out.println("快跑"+name+tires);
        }
    }
}

public class Java_innerAndOutClass {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new dd().new B("赵四").go();
    }

}

最终的运行结果

快跑王五5
快跑赵四6

抽象类

  1. 抽象类不能实例化;
  2. 抽象类的前面有一个修饰词abstract;
  3. 抽象类和具体类相对;
  4. 抽象方法必须在抽象类,但是一般方法也可以在抽象类中
  5. 具体类中不能出现抽象方法
    • 没有方法体,不知道如何运行,具体类创建对象是允许访问对象方法的,但是抽象方法是没有方法体的,二者之间存在矛盾。
  6. 使用场合:具有相同的方法功能,但在不同的场合具体实现方法内容不同。
  7. 抽象方法必须在被继承的子类中全部实现,如果不能实现,则必须继续为抽象方法,即不能实现的抽象类也必须用abstract修饰,且此时该子类也为抽象类;

基本代码格式

package zhangBase;
abstract class A{
    public int i=0;
    public String name = "王五";
    public abstract void sanya();
}
abstract class B extends A{//如果不能重写抽象方法,则子类仍然抽象
    public abstract void sanya();
}
class C extends A{//如果能重写抽象方法,则子类为一般类
    public void sanya() {
        System.out.println("niahao");
    }
}
public class Ex {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}
  1. 抽象类中也存在构造函数;
  2. 极端情况下抽象类中可以没有抽象方法的,但抽象方法所在的类必须是抽象类;
  3. 以下组合是非法组合
    abstract + final //final 将阻止abstract在子类中被重写
    abstract + private //prvate本来就不能被继承,何来重写
    abstract + static //static是类方法肯定也有方法体,且不能被子方法重写,而abstract方法则要求子类必须重写
    final + private //prvate本来就不能被继承,根本就不用限制

抽象类的另一个特例-接口

关键字是interface,修饰符固定:

成员修饰符
成员常量public static final
成员变量public abstract

2. 接口中所有的方法都是抽象方法;
3. 通过接口单独实现了多重继承;(extend)
4. 使Java程序中的耦合现象达到最低标准;
5. 接口中的常量必须复制,上表中所给的修饰符一般Java都会默认添加,在code的时候可以不写;
6. 接口中的变量默认是静态的,所以可以直接调用:接口名.变量名或者实现类.变量名—>实现类继承了接口;

实例:描述鼠标插入电脑并实现在屏幕上滑动的过程

package Java_interface;

interface USB{
    void play();
}
class Mouse implements USB {//相当于给鼠标带上了一个USB接口
    public void play() {
        System.out.println("鼠标滑动");
    }
}
class PC{
    public void insertUSB(USB usb) {//这个方法描述的鼠标USB插入PC的动作
        System.out.println("插入USB");
        usb.play();
    }
}
public class Java_PC_interface01 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        PC pc = new PC();
        Mouse mouse = new Mouse();
        pc.insertUSB(mouse);
        //因为mouse继承了USB相当于mouse含有USB接头,
        //这个就是描述的插入USB动作
    }

}

结果:
插入USB
鼠标滑动

土豪迎娶白富美接口实现

package Java_interface;
/**
 * 
 * @author描述土豪迎娶白富美的接口实现
 *
 */
interface White{
    void youWhite();
}
interface Rich{
    void youRich();
}
interface Beauty{
    void youBeauty();
}
interface Zonghe extends White,Rich,Beauty{

}
//接口(特征)的具体实现(女生拥有这些特征)
class BaiFuMei implements Zonghe{
    public void youWhite() {
        System.out.println("我很白!");
    }
    public void youRich() {
        System.out.println("我很有钱!");
    }
    public void youBeauty() {
        System.out.println("我很美!");
    }
}
//接口的另一方---土豪
class TuHao{
    public void marry(Zonghe woman) {//土豪选美娶白富美
        woman.youWhite();
        woman.youRich();
        woman.youBeauty();
        System.out.println("非常好!娶回家!");
    }
}
public class Java_Tuhao_interface {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        TuHao tuhao = new TuHao();
        BaiFuMei baiFuMei = new BaiFuMei();
        tuhao.marry(baiFuMei);
    }

}
输出:
我很白!
我很有钱!
我很美!
非常好!娶回家!

总结

实现一个接口的实现大致流程如下:

多态

面向对象的基本特征(OOP)

  1. 封装;
  2. 继承;
  3. 多态—>多种状态,一个人:好儿子,好爸爸,好工人;

基本的事例程序
定义动物 —->狗继承动物—–>京巴继承狗

package zhangBase;
public class Java_multiple {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Jing8 jing8 = new Jing8();
        jing8.bark();
        jing8.kan();
        jing8.meng();
        Gou dog = new Jing8();
        dog.bark();
        dog.kan();
    }

}
abstract class Dongwu{  
    public void bark() {
        System.out.println("吼两嗓子--大河向东流啊,天上的星星参北斗啊~~");
    }
}
class Gou extends Dongwu{
    public void kan() {
        System.out.println("汪汪汪~~~~");
    }
}
class Jing8 extends Gou{
    public void meng() {
        System.out.println("卖萌");
    }
}
输出:
吼两嗓子--大河向东流啊,天上的星星参北斗啊~~
汪汪汪~~~~
卖萌
吼两嗓子--大河向东流啊,天上的星星参北斗啊~~
汪汪汪~~~~

多态中方法引用是只能向父类方法方向引用(包含自己的方法),但是子类方法是不可以的
多态—使用父类来引用子类的队形,或者说使用接口来引用实现类的对象

多态中的成员变量的引用规则

首先看下面代码:

/**
 * 
 * @author 主要任务就是探讨多态问题中的成员变量的问题
 *
 */
abstract class Animal1{
    abstract public void bark(); 
}
class Dog1 extends Animal1{
    String name = "大黄";
    public void bark() {
        System.out.println("汪汪汪~~~~~~~");
    }
}
class Jing1 extends Dog1{
    String name ="大绿";
    public void bark() {
        System.out.println("嘿嘿"+name);//调用本类方法
        System.out.println("哈哈哈"+this.name);
        System.out.println("hhehhhe"+super.name);
    }
}
public class Java_duotai {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Jing1 jing1 = new Jing1();
        System.out.println("==============Animal多态=============");
        System.out.println(jing1.name);
        jing1.bark();
        Dog1 dog = jing1;
        System.out.println("==============dog多态=============");
        System.out.println(dog.name);
        dog.bark();

    }

}
输出:
==============Animal多态=============
大绿
嘿嘿大绿
哈哈哈大绿
hhehhhe大黄
==============dog多态=============
大黄
嘿嘿大绿
哈哈哈大绿
hhehhhe大黄

字段都在多态中都是自己的,方法都是后面对象的。

继承中方法可以覆盖但是数据不可以覆盖
对象实例的不同状态

练习

练习1
final修饰的类不能被继承,final修饰的变量不可被继承,final修饰的方法不能被重写,final代表的意思是最顶层的属性方法或者类,都不可以在此基础上再进行进一步改进了。
练习2

package zhangBase;

//顶层类Animal
class Animal{
    public String name;
    public float height;
    public float weight;
    public String blood;
    public void run() {
        System.out.println("跑");
    }
    public void sleep() {
        System.out.println("睡觉");
    }
    public void bark() {
        System.out.println("叫");
    }
}
//定义猫类
class Cat extends Animal{
    final public void catchMouse() {
        System.out.println("抓老鼠");
    }
    public void bark() {
        System.out.println("猫叫喵喵喵");
    }
}
//定义狗类
class Dog extends Animal{
    public void run() {
        System.out.println("四条腿跑");
    }
    public void bark() {
        System.out.println("狗叫汪汪汪");
    }
}
class JaFeiCat extends Cat{
    public void play() {
        System.out.println("加菲喜欢坑奥迪");
    }
}
class zangAo{
    public final String blood="English";
}
public class Java_06homework02 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}

练习3

package zhangBase;
class ChinaMap{
    String ratio="比例尺1:1000000";
    class NanshQunDao{
        String ratio="比例尺1:1000";
        public void user() {
            System.out.println("我们需要全国级的比例尺:"+ChinaMap.this.ratio);
            System.out.println("我们需要海岛级的比例尺:"+this.ratio);
        }
    }
}
public class java_06homework03 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new ChinaMap().new NanshQunDao().user();
    }

}

练习4

package Java_interface;

interface PCI{
    void linkPci();
}
class VedioCard implements PCI{//描述linkPci这个功能
    public void linkPci() {
        System.out.println("VedioCard连接MotherBoard");
    }
}
class SoundCard implements PCI{
    public void linkPci() {//描述linkPci这个功能
        System.out.println("SoundCard连接MotherBoard");
    }
}
class NetCard implements PCI{//描述linkPci这个功能
    public void linkPci() {
        System.out.println("NetCard连接MotherBoard");
    }
}
class MotherBoard{
    public void linkMotherBoard(PCI pci) {//实现linkPci这个功能
        pci.linkPci();
    }
}
public class Yingjian_PCI {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MotherBoard motherBoard = new MotherBoard();
        VedioCard vedioCard = new VedioCard();
        SoundCard soundCard = new SoundCard();
        NetCard netCard = new NetCard();
        motherBoard.linkMotherBoard(vedioCard);
        motherBoard.linkMotherBoard(soundCard);
        motherBoard.linkMotherBoard(netCard);
    }

}

输出:
VedioCard连接MotherBoard
SoundCard连接MotherBoard
NetCard连接MotherBoard
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值