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("逮老鼠"); } }