10、 java基础——this、面向对象三大特征、修饰符

本文详细介绍了面向对象编程的四大特征:抽象、封装、继承和多态,并通过实例展示了如何在Java中实现这些概念。包括构造方法的使用、属性的封装、子类继承父类、方法的重写以及多态的应用。此外,还讨论了数据类型的转换、instanceof关键字的使用以及对象创建的流程。
摘要由CSDN通过智能技术生成

this

  • 表示当前对象

        public Phone(String brand, double price) {
            this.brand = brand;
            this.price = price;
        }
  • 调用构造方法

        public Phone(String brand, double price, int memory) {
            
            this(brand, price);
            this.memory = memory;
        }
package com.qfedu;
​
public class Demo01 {
    
    public static void main(String[] args) {
        Phone phone = new Phone();
        phone.brand = "huawei";
        phone.price = 8800;
        phone.memory = 256;
        
        
        /*
         * 有参构造方法,就一个目的在创建对象时,为属性赋值
         */
        Phone phone2 = new Phone("oppo",3400, 128);
        Phone phone3 = new Phone("ovvo",3800, 258);
        
        System.out.println(phone2.brand+","+phone2.price);
        
    }
    
}
​
/*
 * this 朕  当前对象
 *  通过this.属性名  操作当前对象的属性
 * this(参数列表)  调用当前类的构造方法
 */
class Phone {
    
    String brand;
    double price;
    int memory;
    
    public Phone() {
        System.out.println("无参构造方法---");
    }
    
    public Phone(String brand, double price, int memory) {
        
        this(brand, price);
        this.memory = memory;
        
    }
    
    public Phone(String brand, double price) {
        this.brand = brand;
        this.price = price;
    }
    
    
    public void call() {
        System.out.println("打电话");
    }
    
}

面向对象特征

抽象,封装,继承,多态

  • 抽象

    • 抽象是过程,抽取出一个类事物的特性

  • 封装

    • 属性私有

  • 继承

    • 子类可以继承父类的属性及方法

  • 多态

    • 重写,父类的引用指定子类的对象,执行重写后的方法,各自执行各自的方法

封装

属性私有

添加get set方法

public class Demo{
    public static void main(String[] args) {
        Pig pig = new Pig();
        pig.color = "各色";
    }
}

public class Pig{
    
    private String color;
    private double weight;
    private int month;
    
    
    public void setColor(String color) {
        this.color = color;
    }
    
    public String getColor() {
        return color;
    }
    
}
​
Pig pig = new Pig();
pig.setColor("黑色");
​
String color = pig.getColor();

继承

语法:

public class 父类 {
    
}
public class 子类  extends 父类 {
    
}
  • 子类继承父类所有的非私有的属性和方法

package com.qfedu.p2;
​
//宠物类
public class Pet {
​
    //定义宠物都共有的特性
    String variety;
    String color;
    int month;
}
package com.qfedu.p2;
​
/*
 * Pet 宠物类
 * Cat 猫类
 * 
 * 如果表示猫是宠物这件事情  就是extends 来表示
 * 
 * Cat extends Pet
 * 
 * 
 * 继承的类  Cat   叫做子类
 * 被继承的类 Pet  叫做父类
 * 
 * 子类继承了父类所有的属性
 */
public class Cat extends Pet{
​
    
    //猫这类宠物,特有的属性
    String character; 
}
package com.qfedu.p2;
​
//狗是宠物
public class Dog extends Pet{
​
    //狗所特有的属性
    double legLength;  
}
package com.qfedu.p2;
​
public class Test02 {
​
    public static void main(String[] args) {
        
        /*
         * 子类继承父类非私有的属性
         */
        Cat cat = new Cat();
        cat.variety = "加菲猫";
        cat.color = "花色";
        cat.month = 30;
        
        cat.character = "傲娇";
        
        Dog dog = new Dog();
        dog.variety = "金毛";
        dog.color = "金色";
        dog.month = 4;
        dog.legLength = 30;
        
        /*
         * 鸡类       品种   颜色  重量      是否打鸣
         * 鸭类                品种   颜色  重量      鸭掌大小
         * 家禽类
         */
        
    }
}

修饰符

 

package com.qfedu.p3;
​
public class Computer {
​
    private String brand;
    
    //不添加任何修饰符,表示默认default
    double price;
    
    protected String color;
    
    public String cpu;
    
    
    public void print() {
        System.out.println(brand + price+color+cpu);
    }
    
}
​
package com.qfedu.p3_2;
​
import com.qfedu.p3.Computer;
​
public class Pc extends Computer{
​
    
    public void printSelf() {
        System.out.println(color+cpu);
    }
}
​
package com.qfedu.p3;
​
public class Test03 {
​
    public static void main(String[] args) {
        Computer c = new Computer();
        // c.brand = "acer";
        
        c.price = 3222.0;
        c.color = "黑色";
        c.cpu = "i11";
    }
}
​
package com.qfedu.p3_2;
​
import com.qfedu.p3.Computer;
​
public class Test04 {
​
    public static void main(String[] args) {
        Computer c = new Computer();
        c.cpu = "";
    }
}

重写

父类的方法不能满足子类的需要,所有子类可以重新写父类的方法

  • 如果不重写,就会调用父类的方法

  • 重写后,就会调用子类重写后的方法

package com.qfedu.p4;
​
//作为父类,定义了call方法,表示所有的动物都会叫
public class Animal {
    
    String variety; 
​
    public void call() {
        System.out.println("动物叫---");
    }
}
​

package com.qfedu.p4;
​
public class Chicken extends Animal{
​
    
    public void call() {
        System.out.println("鸡叫-咕咕咕咕");
    }
    
}

package com.qfedu.p4;
​
public class Duck extends Animal {
​
    
    /*
     * 父类的方法,不能满足子类的需求
     * 所有把父类的方法重写(重新写),修改了方法体
     */
    public void call() {
        System.out.println("鸭叫 - 嘎嘎嘎嘎");
    }
    
}

package com.qfedu.p4;
​
public class Test05 {
​
    public static void main(String[] args) {
        /*
         * 子类会继承父类非私有的方法和属性
         */
        
        Chicken c = new Chicken();
        c.variety = "老母鸡";
        
        
        Duck d = new Duck();
        d.variety = "烤鸭";
        
        c.call();
        d.call();
    }
}
    /*
         * 人            吃饭
         * 中国人      用筷子吃
         * 印度人      有手吃
         */
package com.qfedu.p2;
​
public class Text02 {
​
    public static void main(String[] args) {
        Chinese chinese=new Chinese();
        
        chinese.human="中国人";
        
        Indian indian=new Indian();
        
        indian.human="印度人";
        
        chinese.eat();
        indian.eat();
    }
}
         
package com.qfedu.p2;
​
import com.qfedu.p2.Human;
​
public class Chinese  extends Human{
​
    public void eat() {
        System.out.println("中国人吃饭用筷子");
    }
}
​
package com.qfedu.p2;
​
public class Human {
    String human;
    public void eat() {
        System.out.println();
    }
​
}
​
package com.qfedu.p2;
​
import com.qfedu.p2.Human;
​
public class Indian  extends Human{
    
    public void eat() {
        System.out.println("印度人吃饭用手");
    }
​
    
}
​

super

  • 在子类中,可以通过super.方法名(); 调用父类的方法

  • 在子类中,可以通过super.属性名 设置或获取父类非私有的属性

  • 在子类中,可以通过super() 调用父类的构造方法

每一个子类的构造方法的第一行默认都是super();

默认调用的是父类的无参构造方法

也可以不默认调用父类的无参构造方法,自定义调用的构造方法,但是必须定义在第一行

记住:任何时候都给一个类定义一个无参构造方法

package com.qfedu.p5;
​
//作为父类
public class A {
    
    //属性
    private String a;
    
    String b;
    
    //构造方法
    public A() {
        
    }
    
    public A(String a) {
        this.a = a;
    }
    
    //实例方法
    public void a() {
        System.out.println("A a()  start");
    }
    
    //打印属性方法
    public void print() {
        System.out.println("a="+a+",b="+b);
    }
​
}
​
package com.qfedu.p5;
​
//B作为子类
public class B extends A{
​
    /*
     * super.方法名();  调用父类的方法
     */
    public void a() {
        /* System.out.println("A a() start "); */
        super.a();                                  //调用父类的方法
        
        System.out.println("B a()  end"); 
    }
    
    /*
     * super.属性名   可以获取父类的非私有的属性
     * 
     * super(实参);  调用父类的构造方法
     */
    public B(String a, String b) {
        super(a);        //调用父类的构造方法
        
        super.b = b;     //调用父类的非私有的属性
    }
    
    
}
package com.qfedu.p5;
​
public class Test05 {
​
    public static void main(String[] args) {
        B b = new B("jackma", "pony");//a=jacket b=pony
        b.print();
    }
}

子类对象创建流程:

  • 创建一个父类对象

    • 为属性分配空间

    • 赋默认值

    • 调用构造方法

  • 创建子类对象

    • 为属性分配空间

    • 赋默认值

    • 调用构造方法

  • 把子类对象地址赋值给变量

 

多态

  • 子类重写父类的方法

  • 父类的引用指向子类的对象

  • 执行相同的方法

package com.qfedu.p8;
​
//宠物类
public class Pet {
​
    public void call() {
        System.out.println("宠物叫-----");
    }
    
}
package com.qfedu.p8;
​
public class Cat extends Pet{
​
    public void call() {
        System.out.println("喵喵喵-----");
    }
    
}
package com.qfedu.p8;
​
//狗是宠物
public class Dog extends Pet{
​
    public void call() {
        System.out.println("汪汪汪-----");
    }
    
}
package com.qfedu.p8;
​
public class Test02 {
​
    public static void main(String[] args) {
        
        /*
         * 父类的引用指向子类的对象
         * 然后相同的方法,出现不同结果
         * 
         * 多态
         */
        
        //有一只宠物是一只猫
        Pet p1 = new Cat();
        
        
        //有一只宠物是一只狗
        Pet p2 = new Dog();
        
        p1.call();
        p2.call();
        
    }
}

数据类型转化

  • 数据类型往上转,装箱(自动转化)

Cat c = new Cat();   
Pet p = c;
​
int i = 5;
double d = i;
  • 数据类型往下转,拆箱(强制转化)

    /*
    * 数据类型范围变小了,数据类型往下转, 拆箱     (强制转化)
    * 想要执行子类的方法(子类一定比父类强大)
    * 
    * 子类数据类型 c2 = (子类数据类型)父类的引用;
    */
    Pet p = new Cat();
​
    Cat c2 = (Cat)p;
    c2.catchMice();

instanceof关键字

可以通过instanceof关键字,判断该变量的数据类型,返回一个boolean类型数据

  • 是 返回true

  • 不是 返回false

boolean b = 变量 instanceof 数据类型;
package com.qfedu.p9;
​
​
public class Demo01 {
​
    public static void main(String[] args) {
        /*
         * 数据类型转化
         * 
         * 数据类型范围变大了,数据类型往上, 装箱     (自动转化)
         * 
         * 只能执行父类自己的方法
         */
        Cat c = new Cat();   
        Pet p = c;
        
    
        
        int i = 5;
        double d = i;
        
        
        /*
         * 数据类型范围变小了,数据类型往下转, 拆箱     (强制转化)
         * 想要执行子类的方法(子类一定比父类强大)
         * 
         * 子类数据类型 c2 = (子类数据类型)父类的引用;
         */
        Cat c2 = (Cat)p;
        c2.catchMice();
        
        
        
        //有只宠物是只狗
        Pet p2 = new Dog();
        
        
        /*
         * 在进行强制类型转化之前,可以对变量的的数据类型进行判断
         * 
         * 变量名  instanceof  目标数据类型;
         * - true
         * - false
         */
        boolean isCat = p instanceof Cat;
        
        System.out.println(isCat);
        
        if(isCat) {
            Cat c3 = (Cat)p;
            c3.catchMice();
        }
        
    }
}
​
class Pet {
​
    public void call() {
        System.out.println("宠物叫-----");
    }
    
}
​
class Dog extends Pet{
​
    public void call() {
        System.out.println("汪汪汪-----");
    }
    
}
​
class Cat extends Pet{
​
    public void call() {
        System.out.println("喵喵喵-----");
    }
    
    public void catchMice() {
        System.out.println("逮老鼠");
    }
    
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值