Animal.java
package Demo11; public class Animal { private String name; private int age; public Animal() { } public Animal(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; } }
Cat.java
package Demo11; public class Cat extends Animal { public Cat() { } public Cat(String name, int age) { super(name, age); } public void catchMouse(){ System.out.println("猫抓老鼠"); } }
Dog.java
package Demo11; public class Dog extends Animal{ public Dog() { } public Dog(String name, int age) { super(name, age); } public void lookDoor(){ System.out.println("狗看门"); } }
Demo.java
package Demo11; /* 测试类 */ public class Demo { public static void main(String[] args) { //创建猫类对象,并测试 Cat c1 = new Cat(); c1.setName("加菲猫"); c1.setAge(5); System.out.println(c1.getName() + "," + c1.getAge()); c1.catchMouse(); Cat c2 = new Cat("橘猫", 6); System.out.println(c2.getName() + "," + c2.getAge()); c2.catchMouse(); } }
19 包
19.1 包的定义
包的概述
其实就是文件夹
作用:对类进行分类管理
包的定义格式
格式:package 包名;
,(多级包用.分开)
范例:package aaa.bbb
带包的Java类编译和执行
记事本演示如下:
编译演示如下
这里需要手动建立Demo01包,然后把生成的class文件放入包中
注意:运行也要带包,要不然会报错
编译演示二:自动建包
这里不需要手动建包,-d运行可以自动建立
19.2 import导包
使用不同包下的类时,使用的时候要写类的全路径,写起来太麻烦了
为了简化带包的操作,Java就提供了导包的功能
导包的格式
格式:import 包名;
范例:import bao1.bao2.lei1
例如:我要在同一个模块下的Demo2包的Demo.Java中使用Demo1包下的
Teacher.Java,就需要导包
代码如下:
20 修饰符
修饰符的分类
- 权限修饰符
- 状态修饰符
20.1 权限修饰符
我们在Demo1中创建三个类:
Fu.Java
package Demo1; public class Fu { private void show1(){ System.out.println("private"); //只能在本类中被访问 } void show2(){ System.out.println("默认"); } protected void show3(){ System.out.println("protected"); } public void show4(){ System.out.println("public"); } public static void main(String[] args){ //创建Fu的对象,测试看有哪些方法可以使用 Fu f = new Fu(); f.show1(); f.show2(); f.show3(); f.show4(); } }
Zi.Java
package Demo1; public class Zi extends Fu{ public static void main(String[] args) { //创建Zi的对象,测试看有哪些方法可以使用 Zi z = new Zi(); z.show2(); z.show3(); z.show4(); } }
Demo.Java
package Demo1; public class Demo { public static void main(String[] args) { //创建Fu的对象,测试看有哪些方法可以使用 Fu f = new Fu(); f.show2(); f.show3(); f.show4(); } }
之后我们在Demo2中创建两个类:
20.2 状态修饰符
- final(最终态)
- static(静态)
1. final
final关键字是最终的意思,可以修饰成员方法、成员变量、类
final修饰的特点:
- 修饰方法:表明该方法是最终方法,不能被重写
- 修饰变量:表明该变量是常量,不能再次被赋值
- 修饰类:表明该类是最终类,不能被继承
代码实现:
1.修饰方法:被final修饰的方法叫最终方法,不可被重写
2.修饰变量:被final修饰的变量不能再次修改
3.修饰类:被final修饰的类不可被继承
final修饰局部变量
- 变量是基本类型:final修饰基本类型的数据值不能发生改变
- 变量是引用类型:final修饰引用类型的地址值不能发生改变,但是地址里面的内容是可以改变的
package Demo2; /* 测试类 */ public class FinalDemo { public static void main(String[] args) { //final修饰基本类型变量 final int age = 20; //age = 100; System.out.println(age); //final修饰引用类型变量 final Student s = new Student(); s.age = 100; System.out.println(s.age); //s = new Student(); //报错 } }
2. static
static关键字是静态的意思,可以修饰成员方法、成员变量
特点:
- 被类的所有对象共享
- 可以通过类名调用
static.Java
package Demo3; public class Student { public String name; public int age; //public String university; public static String university; //所有成员共享 public void show(){ System.out.println(name + "," + age + "," + university); } }
staticDemo.Java
package Demo3; public class StaticDemo { public static void main(String[] args) { Student.university = "南昌"; Student s1 = new Student(); s1.name = "林青霞"; s1.age = 30; //s1.university = "南昌"; //不建议这样 s1.show(); Student s2 = new Student(); s2.name = "风清扬"; s2.age = 33; //s2.university = "南昌"; s2.show(); } }
静态访问特点
package Demo4; /* static访问特点 */ public class Student { //非静态成员变量 private String name = "林青霞"; //静态成员变量 private static String university = "南昌"; //非静态成员方法 public void show1(){} //静态成员方法 public static void show3(){} //非静态成员方法 public void show2(){ System.out.println(name); System.out.println(university); show1(); show3(); } //静态成员方法 public static void show4(){ //静态成员方法只能访问静态成员变量和静态成员方法 //System.out.println(name); //报错 System.out.println(university); //show1(); //报错 show3(); } }
21 多态
21.1 多态概述
同一个对象,在不同时刻表现出来的不同形态
举例:猫
我们可以说猫是猫:猫 cat = new 猫();
我们也可以说猫是动物:动物 animal = new 猫();
这里猫在不同的时刻表现出来了不同的形态,这就是多态
多态的前提和体现
- 有继承/实现关系
- 有方法重写
- 有父类引用指向子类对象
Animal.java
package Demo1; public class Animal { public void eat(){ System.out.println("动物吃东西"); } }
Cat.java
package Demo1; public class Cat extends Animal{ @Override public void eat() { System.out.println("猫吃鱼"); } }
AnimalDemo.java
package Demo1; /* 多态: 同一个对象,在不同时刻表现出来的不同形态 举例:猫 我们可以说猫是猫: 猫 cat = new 猫(); 我们也可以说猫是动物: 动物 animal = new 猫(); 多态的前提和体现 有继承/实现关系 有方法重写 有父类引用指向子类对象 */ public class AnimalDemo { public static void main(String[] args) { //有父类引用指向子类对象 Animal a = new Cat(); a.eat(); } }
21.2 多态访问特点
- 成员变量:编译看左边,执行看左边
- 成员方法:编译看左边,执行看右边
为什么成员变量和成员方法的访问不一样呢?
- 因为成员方法有重写,而成员变量没有
Animal.java
package Demo2; public class Animal { public int age = 40; public void eat(){ System.out.println("动物吃东西"); } }
Cat.java
package Demo2; public class Cat extends Animal { public int age = 20; public int weight = 10; @Override public void eat() { System.out.println("猫吃鱼"); } public void playGame(){ System.out.println("猫捉迷藏"); } }
AnimalDemo.java
package Demo2; public class AnimalDemo { public static void main(String[] args) { //有父类引用指向子类对象 Animal a = new Cat(); System.out.println(a.age); //40,父类中的 //System.out.println(a.weight); //报错 a.eat(); //子类中的 //a.playGame(); //报错 } }
21.3 多态的高处和弊端
多态的好处:提高了程序的扩展性
具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作
多态的弊端:不能使用子类的特有功能
Animal.java
package Demo3; public class Animal { public void eat(){ System.out.println("动物吃东西"); } }
Cat.java
package Demo3; public class Cat extends Animal{ @Override public void eat() { System.out.println("猫吃鱼"); } }
Dog.java
package Demo3; public class Dog extends Animal{ @Override public void eat() { System.out.println("狗吃骨头"); } public void lookDoor(){ System.out.println("狗看门"); } }
Pig.java
package Demo3; public class Pig extends Animal{ @Override public void eat() { System.out.println("猪吃白菜"); } }
AnimalOperator.java
package Demo3; /* 动物操作类 */ public class AnimalOperator { // public void useAnimal(Cat c){ //Cat c = new Cat(); // c.eat(); // } // public void useAnimal(Dog d){ // d.eat(); // } public void useAnimal(Animal a){ //相当于 //Animal a = new Cat(); //Animal a = new Dog(); a.eat(); //a.loolDoor(); //不能访问具体子类所特有的功能 } }
AnimalDemo.java
package Demo3; /* 测试类 */ public class AnimalDemo { public static void main(String[] args) { //创建动物操作类的对象,调用方法 AnimalOperator ao = new AnimalOperator(); Cat c = new Cat(); ao.useAnimal(c); System.out.println("--------------"); Dog d = new Dog(); ao.useAnimal(d); Pig p = new Pig(); ao.useAnimal(p); } }
21.4 多态中的转型
- 向上转型:从子到父,父类引用指向子类对象
- 向下转型:从父到子,父类引用转为子类对象
Animal.java
package Demo4; public class Animal { public void eat(){ System.out.println("动物吃东西"); } }
Cat.java
package Demo4; public class Cat extends Animal{ @Override public void eat(){ System.out.println("猫吃鱼"); } public void playGame(){ System.out.println("猫捉迷藏"); } }
AnimalDemo.java
package Demo4; /* 向上转型 从子到父 父类引用指向子类对象 向下转型 从父到子 父类引用转为子类对象 */ public class AnimalDemo { public static void main(String[] args) { //多态 Animal a = new Cat(); //向上转型 a.eat(); //a.playGame(); //报错 System.out.println("-------------------"); //创建Cat类的对象 // Cat c = new Cat(); // c.eat(); // c.playGame(); // System.out.println("------------"); //向下转型 Cat c = (Cat)a; c.eat(); c.playGame(); } }
案例:猫和狗
Animal.java
package Demo5; public class Animal { private String name; private int age; public Animal() { } public Animal(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 void eat(){ System.out.println("动物吃东西"); } }
Cat.java
package Demo5; public class Cat extends Animal{ public Cat() { } public Cat(String name, int age) { super(name, age); } @Override public void eat() { System.out.println("猫吃鱼"); } }
Dog.java
package Demo5; public class Dog extends Animal{ public Dog() { } public Dog(String name, int age) { super(name, age); } @Override public void eat() { System.out.println("狗吃骨头"); } }
AnimalDemo.java
package Demo5; /* 测试类 */ public class AnimalDemo { public static void main(String[] args) { //创建猫类进行测试 Animal a = new Cat(); a.setName("加菲猫"); a.setAge(5); System.out.println(a.getName() + "," + a.getAge()); a.eat(); a = new Cat("橘猫", 5); System.out.println(a.getName() + "," + a.getAge()); a.eat(); } }
本博客到视频d174截止!