面向对象——继承

基本概念 

package com.itheima.di_staticdemo.d6;

public class A {
        //公开成员
      public  int i;
      public  void  print1()
      {
          System.out.println("====print1====");
      }
      //私有成员
      private int j;
      private void  print2()
      {
          System.out.println("===printf2===");
      }
}

  //B称为子类,A为父类
public class B extends A {
        //子类能继承父类的非私有的成员
       public  void  print3()
       {
           System.out.println(i);
           print1();


//        私有   System.out.println(j);
//           print2();
       }
}

public class Test1 {
    public static void main(String[] args) {
          B b = new B();//b对象是多张设计图做出来的,可以访问多张设计方法


    }
}

public class People {
        private  String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
public class Teacher  extends  People {
      private  String skill;

    public String getSkill() {
        return skill;
    }

    public void setSkill(String skill) {
        this.skill = skill;
    }
    public  void  printInfo()
    {
        System.out.println(getName() + "具备的技能" + skill);
    }
}
public class Test {
    public static void main(String[] args) {
        Teacher t =new Teacher();
        t.setName("刘翀羽");
        t.setSkill("java Spring");
        System.out.println(t.getName());
        System.out.println(t.getSkill());
        t.printInfo();
    }
}

 权限修饰符

public class Fu {
                //1,私有,只能在本类中访问
    private  void  privateMethod()
    {
        System.out.println("==private===");
    }
    //2,缺省,本类,同一个包下的类
    void  method()
    {
        System.out.println("==缺省==");
    }
     //3,protected 本类,同一个包下的类,任意包下的子类
       protected  void  protectedMothod()
       {
           System.out.println("==protected====");
       }
       //4,public   本类,同一个包下的类,任意下包下的子类,任意包下的任意类
       public void publicMothod()
       {
           System.out.println("==public===");
       }
            public void  test()
            {
                
            }
}

super

 

this:代表本类对象的引用(this关键字指向调用该方法的对象一般我们是在当前类中使用this关键字所以我们常说this代表本类对象的引用)
super:代表父类存储空间的标识(可以理解为父类对象引用)

关键字访问成员变量   访问构造方法 访问成员方法
this  this.成员变量
访问本类成员变量
this(...)
访问本类构造方法
this.成员方法(...)
访问本类成员方法
super  super.成员变量
访问父类成员变量
super(...)
访问父类构造方法
super,成员方法(...)
访问父类成员方法

 

 

单继承与Object

注上面这张照片中a的方法就是object

 

方法重写 

public class A {
        public  void  print1()
        {
            System.out.println("111");
        }
        public void print2(int a,int b)
        {
            System.out.println("111111");
        }

}
public class B  extends A{
    //方法重写
    public  void  print1()
    {
        System.out.println("666");
    }
    //方法重写
    public  void  print2(int a,int b)
    {
        System.out.println("666666");
    }
}

public class Test {
    public static void main(String[] args) {
        //方法重写就近原则b对象就先执行打印6
            B b =new B();
            b.print1();
            b.print2(2,3);
    }
}

       核心:声明不变,重新实现 

public class Student {
          private  String name;
          private  int age;

    public Student() {

    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    //toString快捷方式

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class Test {
    public static void main(String[] args) {
        //方法重写就近原则b对象就先执行打印6
            B b =new B();
            b.print1();
            b.print2(2,3);
        System.out.println("---------------------");
            Student s =new Student("波妞",19);
        System.out.println(s.toString());
        System.out.println(s);
    }
}

 

子类中访问其他成员的特点

在子类中访问其他成员(成员变量,成员方法),是依照就近原则的

public class F {
       String name ="父类名字";
       public  void  print1()
       {
           System.out.println("==父类的print1方法执行==");

       }
}

问题:关于下面的 this使用原理

public class Z extends F{
        String name="子类名称";

       public  void  showName()
       {
           String name="局部名称";
           System.out.println(name);//局部名称
           System.out.println(this.name);//子类成员变量(访问子类成员变量
           System.out.println(super.name);//父类成员变量
       }
       @Override

       public void print1()
       {
           System.out.println("====子类的print1方法执行了=====");
       }
       public void showMethod()
       {
           print1();//就近就打印子类的print1方法执行了
           super.print1();//父类中的print
       }
}
public class Test {
    public static void main(String[] args) {
        Z z =new  Z();
        z.showName();
        z.showMethod();
    }

}

 子类构造器的特点

子类的全部构造器,都会先调用父类的构造器,再执行自己。

class  F{
//            public F()
//            {
//                System.out.println("===父类的无参数构造器执行了==");
//            }
//  }
      public  F(String name ,int age)
      {

      }
  }
  class  Z extends F{
                public  Z()
                {
                    super("liucyu",18);//因为没有了无参构造器所以要使用有参去使用
                    //super();//默认存在,调用父类
                    System.out.println("===子类的无参数构造器执行了==");
                }
      public  Z(String name)
      {
          super("12",11);
          System.out.println("===子类的有参数构造器执行了==");
      }

  }

public class Test {
    public static void main(String[] args) {
                Z z =new Z();
                Z z2 = new Z("刘翀羽");

    }
}

先调用父类再是自己 用super可调用父类构造器

public class Test2 {
    public static void main(String[] args) {
             Teacher t =new Teacher("刘翀羽",19,"java");
        System.out.println(t.getName());
        System.out.println(t.getAge());
        System.out.println(t.getSkill());
    }
}
class  Teacher extends People{
                private String skill;

    public Teacher(String name, int age, String skill) {
        super(name, age);
        this.skill = skill;
    }

    public String getSkill() {
        return skill;
    }

    public void setSkill(String skill) {
        this.skill = skill;
    }
}
class People{
    private  String name;
    private int age;

    public People(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public People() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

需求,若用户输入时没有输入学校,则学小默认为黑马程序员

public class Test2 {
    public static void main(String[] args) {
         Studnet s1= new Studnet("李四",26,"家里蹲大学");
         //需求,若用户输入时没有输入学校,则学小默认为黑马程序员
        Studnet s2 =new Studnet("李华",15);
    }
}
  class  Studnet{
    private  String name;
    private int age;
    private  String schoolName;
            public  Studnet(String name,int age)
            {//关键;若用户输入时没有输入学校,则学小默认为黑马程序员
                this.name=name;
                this.age=age;
                this.schoolName="黑马程序员";
            }
      public Studnet() {

      }

      public Studnet(String name, int age, String schoolName) {
          this.name = name;
          this.age = age;
          this.schoolName = schoolName;
      }

     

 改进版

 private  String schoolName;
            public  Studnet(String name,int age)
            {
                this(name,age,"黑马程序员");
            }

 注:this()与super()不能同时出现在构造器中

 public Studnet(String name, int age, String schoolName) {
        this(name,age,schoolName);
      }
//直接单独使用会报错,只有当是兄弟构造器才可以使用this()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值