DevOps开发运维
成长之路

Java面向对象编程(中级)


ArrayTest.java

import java.util.Scanner;

public class ArrayTest {
    public static void main(String[] args) {
        Scanner myScanner = new Scanner(System.in);
        //快捷键自动分配变量名,在后面加.var
//        Scanner scanner = new Scanner(System.in);
//        Scanner scanner1 = new Scanner(System.in)
//        MyTools myTools = new MyTools();
        MyTools mt = new MyTools();
        int[] arr = {10, 2, -1, 8, 32};
        //定位到方法ctrl + B
        mt.bubble(arr);
        //输出排序后的arr,引用传递
        System.out.println("排序后的arr");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        //注意
        //在idea当我们run一个文件时,会先编译成.class文件
    }
}
//查看类的继承关系ctrl+H
class Person {
    String name;
    int age;
    //构造器-快捷键alt+insert
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
//创建一个类MyTools,编写一个方法,可以完成对int数组冒泡排序的功能
//从小到大
class MyTools {

    public void bubble(int[] arr) {
        //冒泡排序
        int temp = 0;
        for (int i = 0; i < arr.length; i++) {//外层循环次数arr.length-1
            for (int j = 0; j < arr.length - 1 - i; j++) { 
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }

            }
        }
    }
}


TestTemplate.java

public class TestTemplate {
    //模板快捷键
    //输出main
    public static void main(String[] args) {
        //输入sout
        System.out.println();
        //输入fori
//        for (int i = 0; i < ; i++) {
//
//        }
    }
}


Test.java

package com.use;

import com.xiaoqiang.Dog;

public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog();
        System.out.println(dog);//com.xiaoqiang.Dog@1540e19d

        com.xiaoming.Dog dog1 = new com.xiaoming.Dog();
        System.out.println(dog1);//com.xiaoming.Dog@677327b6

    }
}
com.xiaoming.Dog.java
package com.xiaoming;

public class Dog {
}

com.xiaoqiang.Dog.java
package com.xiaoqiang;

public class Dog {
}


Import01.java

package com.hspedu.pkg;

import java.util.Arrays;

//注意
//需要使用到哪个类,就导入哪个类即可,不建议使用*导入
//表示只会引入java.util包下的Scanner
//import java.util.Scanner;
//表示引入java.util包下的所有类
//import java.util.*;
public class Import01 {
    public static void main(String[] args) {
        //使用系统系统的Arrays完成数组排序
        int[] arr = {-1,20,2,13,3};
        //对上面数组进行排序
        //传统方法,自己编写排序(冒泡)
        //系统提供了相关的类,可以方便完成Arrays
        Arrays.sort(arr);
        //输出排序结果
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}


PkgDetail.java

//package的作用是声明当前类所在的包,需要放在类(或者文件)的最上面
//一个类中最多只有一句package
package com.hspedu.pkg;
//import指令位置放在package的下面,在类定义之前,可以有多句且没有顺序要求
import java.util.Arrays;
import java.util.Scanner;

//类定义
public class PkgDetail {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] arr = {0,-1,1};
        Arrays.sort(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i] + " ");
        }
    }
}


com.hspedu.modifier.A.java

package com.hspedu.modifier;
//只有默认和public才能修饰类
//修饰符可以用来修饰类中的属性和成员方法以及类
public class A {
    //四个属性,用不同访问修饰符修饰
    public int n1 = 100;
    protected int n2 = 200;
    int n3 = 300;
    private int n4 = 400;
    public void m1() {
        //在同一个类下,可以访问public,protected和默认,private修饰的属性和方法
        System.out.print("n1=" + n1 + " ");
        System.out.print("n2=" + n2 + " ");
        System.out.print("n3=" + n3 + " ");
        System.out.print("n4=" + n4 + " ");
    }
    protected void m2(){}
    void m3(){}
    private void m4(){}
    public void hi(){
        m1();
        m2();
        m3();
        m4();
    }
}
com.hspedu.modifier.B.java
package com.hspedu.modifier;

public class B {
    public void say() {
        A a = new A();
        //在同一个包下,可以访问public,protected和默认修饰的属性和方法
        System.out.print("\nn1=" + a.n1 + " ");
        System.out.print("n2=" + a.n2 + " ");
        System.out.print("n3=" + a.n3 + " ");
        //n4是private的访问控制,无法访问
        //System.out.println("n1=" + a.n4);//错误不能调用
        a.m1();
        a.m2();
        a.m3();
        //a.m4();//错误不能调用

    }
}
com.hspedu.modifier.Test.java
package com.hspedu.modifier;

public class Test {
    public static void main(String[] args) {
        A a = new A();
        a.m1();
        B b = new B();
        b.say();
    }
}
//只有默认和public可以修饰类
class Tiger {}
com.hspedu.pkg.Test.java
package com.hspedu.pkg;

import com.hspedu.modifier.A;

public class Test {
    public static void main(String[] args) {
        A a = new A();
        //在不同包下,可以访问public修饰的属性方法
        //不能访问protected,默认private修饰的属性或方法
        System.out.println("n1=" + a.n1);
//        System.out.println("n2=" + a.n2);//错误不能调用
//        System.out.println("n3=" + a.n3);//错误不能调用
//        System.out.println("n4=" + a.n4);//错误不能调用
        a.m1();
    }
}


com.hspedu.encap.Encapsulation01.java

package com.hspedu.encap;

public class Encapsulation01 {
    public static void main(String[] args) {
        //如果要使用快捷键alt+r,需要先配置主类
        Person person = new Person();
        person.setName("jack");
        person.setAge(30);
        person.setSalary(30000);
        System.out.println(person.info());
        System.out.println(person.getSalary());
    }
}

class Person {
    public String name;//名字公开
    private int age;//年龄私有
    private double salary;//...

    //自己写setxxx和getxxx太慢,使用快捷键
    //然后根据要求来完善我们的代码.

    public String getName() {
        return name;
    }

    public void setName(String name) {
        //加入对数据的校验,相当于增加了业务逻辑
        if(name.length() >= 2 && name.length() <= 6){ 
              this.name = name; 
        }else{ 
              System.out.println("名字的长度不对,需要(2-6)个字符,默认名字"); 
              this.name = "无名人"; 
        } 
   } 
    public int getAge(){ 
       return age;
    }
    public void setAge(int age) {
        if(age >= 1 && age <= 120){
            this.age = age;
        }else{
            System.out.println("你设置的年龄不对,年龄需要在1-120,默认年龄18");
            this.age = 18;//给一个默认年龄
        }
    }

    public double getSalary() {
        //可以这里增加对当前对象的权限判断
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
    //写一个方法,返回属性信息
    public String info(){
        return "信息为name=" + name + " age=" + age + " 薪水=" + salary;
    }
}


com.hspedu.encap.Encapsulation01.java

package com.hspedu.encap;

public class Encapsulation01 {
    public static void main(String[] args) {
        //如果要使用快捷键alt+r,需要先配置主类
        Person person = new Person();
        person.setName("jack");
        person.setAge(30);
        person.setSalary(30000);
        System.out.println(person.info());
        System.out.println(person.getSalary());
//        如果直接使用构造器指定属性
        Person smith = new Person("smith", 80, 50000);
        System.out.println("===smith的信息===");
        System.out.println(smith.info());
    }
}

class Person {
    public String name;//名字公开
    private int age;//年龄私有
    private double salary;//...
    //构造器alt+insert
    public Person(){
    }
    //有3个属性的构造器
    public Person(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
        //可以将set方法写在构造器中,这样仍然可以验证
        setName(name);
        setAge(age);
        setSalary(salary);
    }
    //自己写setxxx和getxxx太慢,使用快捷键
    //然后根据要求来完善我们的代码.

    public String getName() {
        return name;
    }

    public void setName(String name) {
        //加入对数据的校验,相当于增加了业务逻辑
        if(name.length() >= 2 && name.length() <= 6){ 
            this.name = name; 
        }else{ 
            System.out.println("名字的长度不对,需要(2-6)个字符,默认名字"); 
            this.name = "无名人"; 
        } 
     } 
    public int getAge(){ 
        return age; 
    } 
    public void setAge(int age) { 
      if(age >= 1 && age <= 120){
            this.age = age;
        }else{
            System.out.println("你设置的年龄不对,年龄需要在1-120,默认年龄18");
            this.age = 18;//给一个默认年龄
        }
    }

    public double getSalary() {
        //可以这里增加对当前对象的权限判断
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
    //写一个方法,返回属性信息
    public String info(){
        return "信息为name=" + name + " age=" + age + " 薪水=" + salary;
    }
}


com.hspedu.encap.Account.java

package com.hspedu.encap;

public class Account {
    //为了封装,将3个属性设置为private
    private String name;
    private double balance;
    private String pwd;
    //两个构造器
    public Account(){
    }

    public Account(String name, double balance, String pwd) {
        this.setName(name);
        this.setBalance(balance);
        this.setPwd(pwd);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if(name.length() >= 2 && name.length() <= 4){ 
            this.name = name; 
       }else{ 
           System.out.println("名字输入错误,姓名要求(长度为2,3,4),默认值无名"); 
           this.name = "无名"; 
       } 
   } 
    public double getBalance() { 
        return balance; 
    } 
    public void setBalance(double balance) { 
        if(balance > 20){
            this.balance = balance;
        }else{
            System.out.println("余额必须>20,默认为0");
        }
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        if(pwd.length() == 6){
            this.pwd = pwd;
        }else{
            System.out.println("密码必须是6位,默认密码为000000");
            this.pwd = "000000";
        }
    }
    //显示账号信息
    public void showInfo(){
        //可以增加一个权限校验
        System.out.println("账号信息 name=" + name + " 余额=" + balance + " 密码=" + pwd);
//        if() {
//            System.out.println("账号信息 name=" + name + " 余额=" + balance + " 密码=");
//        }else{
//            System.out.println("你无权查看...");
//        }
    }
}
com.hspedu.encap.AccountTest.java
package com.hspedu.encap;

public class AccountTest {
    public static void main(String[] args) {
        //创建Account
        Account account = new Account("jack",60,"123456");
//        account.setName("jack");
//        account.setBalance(60);
//        account.setPwd("123456");
        account.showInfo();
    }
}


com.hspedu.extend.Pupil.java

package com.hspedu.extend;

//小学生->模拟小学生考试的情况
public class Pupil {
    public String name;
    public int age;
    private double score;

    public void setScore(double score) {
        this.score = score;
    }
    public void testing(){
        System.out.println("小学生" + name + "正在考小学数学...");
    }
    public void showInfo() {
        System.out.println("小学生名" + name + "年龄" + age + "分数" +score);
    }
}

com.hspedu.extend.Graduate.java
package com.hspedu.extend;
//大学生考试情况-模拟大学生类
public class Graduate {
    public String name;
    public int age;
    private double score;

    public void setScore(double score) {
        this.score = score;
    }

    public void testing(){
        System.out.println("大学生" + name + "正在考大学数学...");
    }

    public void showInfo() {
        System.out.println("大学生" + name + "年龄" + age + "分数" +score);
    }
}
com.hspedu.extend.Extends01.java
package com.hspedu.extend;

public class Extends01 {
    public static void main(String[] args) {
        Pupil pupil = new Pupil();
        pupil.name = "银角大王";
        pupil.age = 10;
        pupil.testing();
        pupil.setScore(60);
        pupil.showInfo();

        System.out.println("=====");
        Graduate graduate = new Graduate();
        graduate.name = "金角大王";
        graduate.age = 22;
        graduate.testing();
        graduate.setScore(100);
        graduate.showInfo();
    }
}


com.hspedu.extend.improve_.Pupil.java

package com.hspedu.extend.improve_;

public class Pupil extends Student{
    public void testing(){
        System.out.println("小学生" + name + "正在考小学数学...");
    }
}
com.hspedu.extend.improve_.Graduate.java
package com.hspedu.extend.improve_;

public class Graduate extends Student{
    public void testing(){
        System.out.println("大学生" + name + "正在考大学数学...");
    }
}
com.hspedu.extend.improve_.Student.java
package com.hspedu.extend.improve_;

//父类
public class Student {
    //共有属性
    public String name;
    public int age;
    private double score;
    //共有方法
    public void setScore(double score) {
        this.score = score;
    }

    public void showInfo() {
        System.out.println("学生" + name + "年龄 " + age + " 分数 " +score);
    }
}
com.hspedu.extend.improve_.Extends01.java
package com.hspedu.extend.improve_;

import com.hspedu.extend.Graduate;
import com.hspedu.extend.Pupil;

public class Extends01 {
    public static void main(String[] args) {
        com.hspedu.extend.Pupil pupil = new Pupil();
        pupil.name = "银角大王~";
        pupil.age = 11;
        pupil.testing();
        pupil.setScore(50);
        pupil.showInfo();

        System.out.println("=====");
        com.hspedu.extend.Graduate graduate = new Graduate();
        graduate.name = "金角大王~";
        graduate.age = 23;
        graduate.testing();
        graduate.setScore(80);
        graduate.showInfo();
    }
}


com.hspedu.encap.TopBase.java

package com.hspedu.encap;

public class TopBase {//父类是Object
    public TopBase() {
        System.out.println("父类的父类构造器TopBase()被调用");
    }
}
com.hspedu.extend.Base.java
package com.hspedu.extend;

import com.hspedu.encap.TopBase;

public class Base extends TopBase {//父类
    //4个属性
    public int n1 = 100;
    protected int n2 = 200;
    int n3 = 300;
    private int n4 = 400;

    public Base() {//父类的无参构造器
        System.out.println("父类Base()构造器被调用...");
    }
    public Base(String name,int age){//父类的有参构造器1
        System.out.println("父类Base(String name,int age)被调用...");
    }
    public Base(String name){//父类的有参构造器2
        System.out.println("父类Base(String name)被调用...");
    }

    //父类提供public方法,返回n4
    public int getN4(){
        return n4;
    }
    public void test100() {
        System.out.println("test100");
    }
    protected void test200() {
        System.out.println("test200");
    }
    void test300() {
        System.out.println("test300");
    }
    private void test400() {
        System.out.println("test400");
    }
    public void callTest400(){
        test400();
    }
}
com.hspedu.extend.Sub.java
package com.hspedu.extend;

import java.util.Arrays;

//输入ctrl + H 可以看到类的继承关系
public class Sub extends Base {//子类

    public Sub(String name,int age){
        //1.调用父类的无参构造器,或者什么都不写
        //super();//父类的无参构造器
        //System.out.println("子类Sub(String name,int age)构造器被调用....");
        //2.调用父类的Base(String name)构造器
        //细节4:如果希望指定去调用父类的某个构造器,则显式的调用一下:super(参数列表)
        //super("hsp");
        //System.out.println("子类Sub(String name,int age)构造器被调用....");
        //3.调用父类的Base(String name,int age)构造器
        //细节5:super在使用时,必须放在构造器的第一行(super只能在构造器中使用)
        //细节6:super()和this()都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
        super("hsp",11);
        System.out.println("子类Sub(String name,int age)构造器被调用....");

    }

    public Sub() {//子类的无参构造器
        //super();//细节2:默认隐藏调用父类的无参构造器
        super("smith",10);
        System.out.println("子类Sub()构造器被调用....");
    }
    //细节3-1:当创建子类对象时,不管使用子类的哪个构造器,
    // 默认情况下总会去调用父类的无参构造器
    public Sub(String name) {
    //细节3-2:如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用
    //父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过
        super("tom",30);
        System.out.println("子类Sub(String name) 构造器被调用....");
    }
    public void sayOk() {//子类方法
        //细节1:非私有的属性和方法可以在子类直接访问
        //私有的属性和方法不可以在子类直接访问
        System.out.println(n1 + " " + n2 + " " + n3 + " ");
        //属性n4无法输出,要通过父类提供的公共方法去访问
        System.out.println("n4=" + getN4());
        test100();
        test200();
        test300();
        //test400();//错误
        //要通过父类提供的公共方法去访问
        callTest400();
    }
}
com.hspedu.extend.ExtendsDetail.java
package com.hspedu.extend;

public class ExtendsDetail {
    public static void main(String[] args) {
//        System.out.println("==第1个对象==");
//        Sub sub = new Sub();//创建子类对象sub
//        System.out.println("==第2个对象==");
//        Sub sub2 = new Sub("jack");//创建子类对象sub2
        System.out.println("==第3个对象==");
        Sub sub3 = new Sub("king",10);//创建子类对象sub3
        //sub.sayOk();
    }
}


com.hspedu.extend.ExtendsTheory.java

package com.hspedu.extend;
/**
讲解继承的本质
*/
public class ExtendsTheory {
    public static void main(String[] args) {
        Son son = new Son();//内存的布局
        //1.首先看子类是否有该属性
        //2.如果子类有这个属性,并且可以访问(比如private 私有)
        //3.如果子类没有这个属性,就看父类有没有这个属性(如果父类有该属性,并且可以访问,就返回信息...)
        //4.如果父类没有就按照3.的规则,就继续找上级父类,直到Object...
        System.out.println(son.name);//返回的是大头儿子
//        System.out.println(son.age);//返回的是39
        System.out.println(son.getAge());//返回的是39
        System.out.println(son.hobby);//返回的是旅游
    }
}

class Grandpa {//爷类Grandpa
    String name = "大头爷爷";
    String hobby = "旅游";
}
class Father extends Grandpa {//父类Father
    String name = "大头爸爸";
    private int age = 39;

    public int getAge() {
        return age;
    }
}
class Son extends  Father {//子类Son
    String name = "大头儿子";
}


com.hspedu.extend.exercise.ExtendsExercise01.java

package com.hspedu.extend.exercise;

public class ExtendsExercise01 {
    public static void main(String[] args) {
        B b = new B();
/**
 * 结果
 * a
 * b name
 * b
 */
    }
}

class A {
    A() {
        System.out.println("a");
    }

    A(String name) {
        System.out.println("a name");
    }
}

class B extends A {
    B() {
        this("abc");//有了this以后就没有super()了
        System.out.println("b");
    }

    B(String name) {
         //解题关键:分析出有默认的super();
         System.out.println("b name"); } 
    }


com.hspedu.extend.exercise.ExtendsExercise02.java

package com.hspedu.extend.exercise;

public class ExtendsExercise02 {
    public static void main(String[] args) {
        C c = new C();
/**
 * 结果:
 * 我是A类
 * hahah我是B类的有参构造器
 * 我是C类的有参构造
 * 我是C类的无参构造
 * */ 
    }
}

class A{//A类
    public A() {
        System.out.println("我是A类");
    }
}

class B extends A{//B类,继承A类
    public B(){
        System.out.println("我是B类的无参构造器");
    }
    public B(String name){
        //解题关键:分析出有默认的super();
        System.out.println(name + "我是B类的有参构造器");
    }
}

class C extends B{
    public C(){
        this("hello");
        System.out.println("我是C类的无参构造");
    }
    public C(String name){
        super("hahah");
        System.out.println("我是c类的有参构造");
    }
}


com.hspedu.extend.exercise.Computer.java

package com.hspedu.extend.exercise;

public class Computer {
    private String cpu;
    private int memory;
    private int disk;

    public Computer(String cpu, int memory, int disk) {
        this.cpu = cpu;
        this.memory = memory;
        this.disk = disk;
    }

    public String getDetails(){
        return " cpu=" + cpu + " memory=" + memory + " disk=" + disk;
    }

    public String getCpu() {
        return cpu;
    }

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public int getMemory() {
        return memory;
    }

    public void setMemory(int memory) {
        this.memory = memory;
    }

    public int getDisk() {
        return disk;
    }

    public void setDisk(int disk) {
        this.disk = disk;
    }
}
com.hspedu.extend.exercise.PC.java
package com.hspedu.extend.exercise;

public class PC extends Computer{
    private String brand;
    //这里IDEA 根据继承的规则,自动把构造器的调用写好
    //这里也体现出继承的一个基本设计的基本思想,父类的构造器完成父类属性初始化
    //子类的构造器就完成子类的属性初始化
    public PC(String cpu, int memory, int disk, String brand) {
        super(cpu, memory, disk);
        this.brand = brand;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }
    public void printInfo() {
        System.out.println("PC信息=");
        //调用父类的getDetails方法,得到相关属性...
        System.out.println(getDetails() + " brand=" + brand);
//      System.out.println(getCpu() + getDisk() + getMemory() + getBrand());
    }
}

com.hspedu.extend.exercise.NotePad.java
package com.hspedu.extend.exercise;

public class NotePad extends Computer{
    private String color;

    public NotePad(String cpu, int memory, int disk, String color) {
        super(cpu, memory, disk);
        this.color = color;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
    public void printInnfo() {
        System.out.println("PC信息=");
        System.out.println(getDetails() + " color=" + color);
    }
}
com.hspedu.extend.exercise.ExtendsExercise03.java
package com.hspedu.extend.exercise;

public class ExtendsExercise03 {
    public static void main(String[] args) {
        PC pc = new PC("intel",16,500,"IBM");
        pc.printInfo();
        NotePad notepad = new NotePad("mac",24,1000,"black");
        notepad.printInnfo();
    }
}


com.hspedu.super_B.java

package com.hspedu.super_;

public class B extends A {

    public int n1 = 888;
    //编写测试方法
    public void test() {
        //细节3:Super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用super
        //去访问爷爷类的成员;如果多个基类(上级类)中都有同名的成员,使用super访问遵循就近原则
        //A->B->C,当然也需要遵守访问权限的相关规则
        System.out.println("super.n1=" + super.n1);
        super.cal();
    }
    //语法1:访问父类的属性,但不能访问父类的private属性 [案例]super。属性名
    public void hi() {
        //super.n4为父类的private属性不能访问
        System.out.println(super.n1 + " " + super.n2 + " " +super.n3 /*+ super.n4*/);
    }
    //语法2:访问父类的方法,不能访问父类的private方法[案例] super。方法名(参数列表)
    public void ok(){
        super.test100();
        super.test200();
        super.test300();
        //super.test400();父类的private方法不能访问
    }
    //语法3:访问父类的构造器:super(参数列表);只能放在构造器的第一句,只能出现一句:
    public B(){
//        super();
//        super("jack");
        super("jack",10);
    }
    public void cal() {
        System.out.println("B类的cal()方法...");
    }
    public void sum() {
        //细节1:调用父类的构造器的好处(分工明确,父类属性由父类初始化,子类的属性由子类初始化)
        System.out.println("B类的sum()");
        //细节2-1:希望调用父类A的cal方法
        //这时,因为子类B没有cal方法,因此可以使用下面三种方式:
        //找cal方法时,顺序是:
        //1.先找本类,如果有,则调用
        //2.如果没有,则找父类(如果有并可以调用则调用)
        //3.如果父类没有,则继续找父类的父类,整个规则就是一样的。
        //提示:如果查找方法的过程中,找到了,但是不能访问,则报错
        //     如果查找方法的过程中,没有找到,则提示方法不存在
        cal();
        this.cal();//等价于cal()
        super.cal();//直接进入上面的第2步找父类,其他规则一样
        /**
         * 结果:
         * B类的sum()
         * B类的cal()方法...
         * B类的cal()方法...
         * A类的cal()方法...
         * */
        //细节2-2:演示访问属性的规则
        //n1和this查找的规则是
        //1.先找本类,如果有,则调用
        //2.如果没有,则找父类(如果有并可以调用则调用)
        //3.如果父类没有,则继续找父类的父类,整个规则就是一样的。
        //提示:如果查找属性的过程中,找到了,但是不能访问,则报错
        //     如果查找属性的过程中,没有找到,则提示属性不存在
        System.out.println(n1);
        System.out.println(this.n1);
        //super.n1的顺序是直接找父类,其他的规则一样
        System.out.println(super.n1);
        /**
         * 结果:
         * 888
         * 888
         * 100
         * */
    }
}
com.hspedu.super_A.java
package com.hspedu.super_;

public class A extends Base{
    //4个属性
    public int n1 = 100;
    protected int n2 = 200;
    int n3 = 300;
    private int n4 = 400;

    public A(){}
    public A(String name) {}
    public A(String name,int age){}

    public void cal() {
        System.out.println("A类的cal()方法...");
    }
    public void test100() {

    }

    protected void test200() {

    }

    void test300() {

    }

    private void test400() {

    }
}
com.hspedu.super_.Base.java
package com.hspedu.super_;

public class Base {
    public int n1 = 999;
    public int age = 111;
    public void cal() {
        System.out.println("Base类的cal()方法...");
    }
    public void eat() {
        System.out.println("Base类中eat()方法...");
    }
}
com.hspedu.super_.Super01.java
package com.hspedu.super_;

public class Super01 {
    public static void main(String[] args) {
        B b = new B();//子类对象
//        b.sum();
        b.test();
    }
}


com.hspedu.override_.Dog.java

package com.hspedu.override_;

public class Dog extends Animal{
    //细节1:子类的方法的形参列表,方法名称要和父类方法的形参列表,方法名称完全一样
    //1.因为Dog是Animal子类
    //2.Dog的cry方法和Animal的cay()方法定义形式一样(名称,返回类型,参数)
    //3.Dog的cry()方法重写了Animal的cry()方法
    public void cry() {
        System.out.println("小狗汪汪叫");
    }
    //细节2:子类方法的返回类型和父类返回类型一样
    //或者是父类返回类型的子类,比如父类返回类型是Object,子类方法返回类型是String
    public String m1(){
        return null;
    }
    //细节3:子类方法不能缩小父类方法的访问权限
    //public > protected > 默认 > private
    public void eat() {

    }
}
com.hspedu.override_.Animal.java
package com.hspedu.override_;

public class Animal {
    public void cry() {
        System.out.println("动物叫唤...");
    }

    public Object m1() {
        return null;
    }

    protected void eat() {

    }
}
com.hspedu.override_.Override01.java
package com.hspedu.override_;

public class Override01 {
    public static void main(String[] args) {
        //演示方法重写的情况
        Dog dog = new Dog();
        dog.cry();//小狗汪汪叫

    }
}


com.hspedu.override_.Student.java

package com.hspedu.override_;
//编写一个Student类,继承Person类,增加id、score属性/private
//以及构造器,定义say方法(返回自我介绍的信息)
public class Student extends Person {
    private int id;
    private double score;

    public Student(String name, int age, int id, double score) {
        super(name, age);//调用父类构造器
        this.id = id;
        this.score = score;
    }
    //say方法
    public String say(){//体现super好处,代码复用
        return super.say() + ",id是" + id + ",分数是" + score;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }
}

com.hspedu.override_.Person.java
package com.hspedu.override_;
//编写一个Person类,包括属性/private(name、age),构造
// 器,方法say(返回自我介绍的字符串)
public class Person {
    private String name;
    private int age;

    public Person(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;
    }

    public String say(){
        return "我的名字是:" + name + ",我的年龄是" + age;
    }

}
com.hspedu.override_.OverrideExercise.java
package com.hspedu.override_;

public class OverrideExercise {
    //在main中分别创建Person和Student对象,调用say方法输出自我介绍
    public static void main(String[] args) {
        Person jack = new Person("jack",10);
        System.out.println(jack.say());
        Student smith = new Student("smith",19,144564,92.8);
        System.out.println(smith.say());
    }

}


com.hspedu.poly_.Animal.java

package com.hspedu.poly_;

public class Animal {

    private String name;

    public Animal(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
com.hspedu.poly_.Cat.java
package com.hspedu.poly_;

public class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }
}
com.hspedu.poly_.Dog.java
package com.hspedu.poly_;

public class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }
}
com.hspedu.poly_.Fish.java
package com.hspedu.poly_;

public class Fish extends Food {

    public Fish(String name) {
        super(name);
    }

}
com.hspedu.poly_.Bone.java
package com.hspedu.poly_;

public class Bone extends Food {

    public Bone(String name) {
        super(name);
    }
}
com.hspedu.poly_.Food.java
package com.hspedu.poly_;

public class Food {
    private String name;

    public Food(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
com.hspedu.poly_.Master.java
package com.hspedu.poly_;

public class Master {
    private String name;

    public Master(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

    //完成主人给小狗喂食骨头
    public void feed(Dog dog,Bone bone){
        System.out.println("主人" + name + "给" + dog.getName() + "吃" + bone.getName());
    }
    //完成主人给小猫喂食黄花鱼
    public void feed(Cat cat,Fish fish){
        System.out.println("========");
        System.out.println("主人" + name + "给" + cat.getName() + "吃" + fish.getName());
    }
    //如果动物很多,食物很多
    //feed方法很多,不利于管理和维护
    //Pig --> Rice
    //Tiger --> meat
    //...
}
com.hspedu.poly_.poly01.java
package com.hspedu.poly_;

public class poly01 {
    public static void main(String[] args) {
        Master tom = new Master("tom");
        Dog dog1 = new Dog("大黄狗");
        Bone bone1 = new Bone("大棒骨");
        tom.feed(dog1,bone1);

        Cat cat1 = new Cat("小花猫");
        Fish fish1 = new Fish("黄花鱼");
        tom.feed(cat1,fish1);


    }
}


com.hspedu.poly_.PloyMethod.java

package com.hspedu.poly_;

public class PloyMethod {
    public static void main(String[] args) {
        //方法重载体现多态
        A a = new A();
        //传入不同的参数,就会调用不同的sum方法,就体现多态
        System.out.println(a.sum(10,20));
        System.out.println(a.sum(20,30,40));
        //方法重写体现多态
        B b = new B();
        a.say();
        b.say();

    }
}

class B {//父类
    public void say() {
        System.out.println("B say()方法被调用...");
    }
}

class A extends B {//子类
    public int sum(int n1,int n2) {//和下面sum构成重载
        return n1 + n2;
    }
    public int sum(int n1, int n2, int n3){
        return n1 + n2 + n3;
    }
    public void say() {
        System.out.println("A say()方法被调用...");
    }
}

 

赞(2)

评论 抢沙发

评论前必须登录!

 

LNMP社群 不仅仅是技术

关于我们网站地图