java基础6(面向对象---下)
1.包
为了更好地组织类,java提供了包机制,用于区别类名的命名空间。
-
作用:
避免类重名;
按照不同功能管理类;
控制访问权限。
-
常见的包:
2.访问权限修饰符
●Java语言有四个权限访问修饰符,权限从大到小依次为:
1)public :公共权限 修饰类、属性、方法。可以被任意类访问
2)protected:受保护的权限 修饰属性、方法。
可以被同包类访问,如果不是同包类,必须是该类的子类才可以访问。
3)default:同包权限 修饰类、属性、方法。只能被同包的类访问
4)private:私有权限 修饰属性、方法。 只能在本类中访问
3.面向对象语言的三大特征
-
封装
-
封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问, 而是通过该类提供的方法来实现对隐藏信息的操作和访问 。
-
作用:
(1)隐藏类的实现细节;
(2)方便加入控制语句;
(3)只能通过规定方法访问;
(4)方便修改实现。
-
-
继承
-
继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
-
extends
的意思是”扩展“,子类是父类的拓展。 -
Java
中只有单继承,没有多继承。 -
继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚集等。
-
继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字
extends
来表示 -
子类和父类之间,从意义上具有”
is a
“关系 -
子类继承父类,就会拥有父类全部方法(
public
) -
在
Java
中,所有类都默认继承Object
类 -
private
属性和方法无法被继承public class Animal_test { String name; public void eat(){ System.out.println("会吃"); } } //继承Animal_test类 class Dog_test extends Animal_test{ String color; public void Sleep(){ System.out.println("会睡觉"); } } //继承Dog_test类 class HaShiQi extends Dog_test{ String weight; public void play(){ System.out.println("会拆家"); } } class Test1{ public static void main(String[] args) { Animal_test a1= new Animal_test(); a1.name="动物"; System.out.print("名字:"+ a1.name+"\n技能:"); a1.eat(); System.out.println("-------------------"); Dog_test d1= new Dog_test(); d1.name="狗"; d1.color="白色"; System.out.print("名字:"+ d1.name+" 颜色:"+d1.color+"\n技能:"); d1.eat();//继承了Animal_test类的eat方法 System.out.print("技能:"); d1.Sleep(); System.out.println("-------------------"); HaShiQi h1= new HaShiQi(); h1.name="二哈"; h1.color="黑白"; h1.weight="40kg"; System.out.print("名字:"+ h1.name+" 颜色:"+h1.color+" 体重:"+h1.weight+"\n技能:"); h1.eat();//继承了Animal_test类的eat方法 System.out.print("技能:"); h1.Sleep();//继承了Dog_tset类的Sleep方法 System.out.print("技能:"); h1.play(); } }
super关键字
使用super关键字访问父类成员
-
用super.成员变量名来引用父类成员变量
-
用super.方法名(参数列表)访问父类的方法
-
用super.构造方法(参数列表)访问父类构造方法
super()调用父类构造方法
-
子类默认构造器中默认调用父类无参构造器,且必须在第一行
-
super必须只能出现在子类的方法或构造方法中
-
super和this不能同时调用构造方法
误区
-
不要把super误认为是父类对象。在创建子类对象时, 不会创建父类对象,只会将父类中的信息加载到子类对象中存储。
super & this
-
代表的对象不同
-
this:本身调用者这个对象
-
super:代表父类对象的应用
-
-
前提:
-
this:没有继承也可以使用
-
super:只能在继承条件时才可以使用
-
-
构造方法:
-
this():本类的构造
-
super():父类的构造
-
重写
-
当父类方法满足于不了子类需求的时候,子类可以重写父类的方法,这种表现形式我们称之为方法的重写
public class Father { String address="狗熊岭"; String name="熊大"; public void introduce(){ System.out.println("我是熊大,我来自狗熊岭。"); } } class Son extends Father{ String name="熊二"; String address="狗熊岭"; public void introduce(){ System.out.println("我是熊二,我来自狗熊岭。"); } } class Test{ public static void main(String[] args) { Father f1= new Father(); Father f2 = new Son(); f1.introduce(); f2.introduce(); } }
运行结果
-
重写只和非静态方法有关,且是public类型方法
-
静态方法只和“
B b = new A();
”中等号左边的类型有关 -
重写:需要有继承关系,子类重写父类方法
-
方法名必须相同
-
参数列表必须相同
-
修饰符:范围可以扩大但不能缩小:public > protected > Default > private
-
抛出的异常:范围可以缩小,但不能扩大
-
-
重写,子类的方法和父类必须要一致,仅方法体不同
-
-
多态
-
多态是指同一事物,在不同时刻表现出的不同种状态
-
多态存在的三个必要条件
(1)要有继承(包括接口的实现)(前提条件)
(2)要有重写(前提条件)
(3) 父类引用指向子类对象
-
当编译期类型是父类,运行期类型是子类时,被称为父类引用指向子类对象
//当编译类型是父类,运行类型是子类时,被称为父类引用指向子类对象 class Animal{} class Cat extends Animal{} class dog extends Animal{} Animal x = new Cat();//Animal的引用指向了Cat对象
-
多态环境下对成员方法的调用:
class Animal{ void show() { System.out.println("Anmial"); } } class Cat extends Animal{ void show() { System.out.println("cat"); } } Animal x = new Cat(); x.show() //调用的是子类中的方法 //编译看左边,运行看右边
-
多态环境下对静态成员方法的调用:
class Animal{ static void show() { System.out.println(“Animal"); } } class Cat extends Animal { static void show() { System.out.println(“Cat"); } } Animal x = new Cat() x.show() //调用的是动物类中的静态成员方法。 //编译和运行都看左边
-
多态环境下对成员变量的调用
class Animal{ int num = 3; } class Cat extends Animal { int num = 4; } Animal x = new Cat() x.num; //调用的是动物类中的成员变量。 //编译和运行都看左边 变量不存在被子类覆盖这一说法
-
方法参数具有多态性
class Animal{ void eat() {} } class Cat extends Animal{ void eat() {} } class Dog extends Animal{ void eat(){} } //方法的形式参数类型是父类类型,而传递的实际参数可以是任意 子类的对象 method(Animal animal){ animal .eat();
方法参数多态性的好处:提高代码的扩展性
-
向上转型
class Animal{ void eat(){ } } class Cat extends Animal{ void look() { System.out.println("看家"); } } Animal x=new Cat(); //向上造型,Cat对象提升到Animal对象 x.eat() ;//只能使用父类中的方法 x.look() ;//报错!不能使用子类中的方法 //向上转型的优点是 : 可以提升代码的扩展性
向上转型的作用是:提高程序的扩展性
-
向下转型
class Animal{ void eat(){ } } class Cat extends Animal{ void look() { System.out.println("看家"); } } Animal x = new Cat(); Cat a = (Cat)x; //向下转型 m.eat(); m.look();//子父类中的方法都可以使用 //向下转型的作用是:为了使用子类的特有方法
向下转型的作用是:为了使用子类中的特有方法
-
-
final关键字
-
当final修饰变量时,被修饰的变量必须被初始化(赋值),且后续不能修改其值,实质上是常量;
-
当final修饰方法时,被修饰的方法无法被所在类的子类重写(覆写);
-
当final修饰类时,被修饰的类不能被继承,并且final类中的所有成员方法都会被隐式地指定为final方法,但成员变量则不会变。
-
-
接口
-
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
-
特点
-
接口的结构与类完全相同。
-
接口的访问控制修饰符与类一样, 但只有public和默认两种。
-
接口的声明要使用关键字interface,声明类的关键字是class。
-
接口中所有的方法都是抽象方法,默认的修饰符为“public abstrecr".在定义中可以省略。例如,“void eat ();” 表示定义了一个抽象方法eat ()。
-
接口中所有的变量都是全局常量,默认的修饰符为“publice static final", 在定义中可以省略。例如,“int a=10;"表示定义了一个全局常量a。
-
接口可以继承多个其他接口,即通过接口实现了多重继承。
-
接口不能被实例化,接口中没有构造方法,需要通过一个类来实现接口中所有抽象方法,才能被实例化,这个类可以称为接口的实现类。实现接口使用关键字implements。
-
implements可以实现多个接口。
-
实现接口必须重写接口中的方法。
-
接口的本质是契约。
-
-
案例:猫和狗(来自黑马程序员)
需求:对猫和狗进行训练,他们就可以跳高了,这里加入了跳高功能。请采用抽象类和接口来实现猫和狗案例。并在测试类中进行测试。
思路:
-
定义接口(Jumpping)
成员方法:跳高();
-
定义抽象动物类(Animal)
成员变量:姓名 ,年龄;构造方法:无参,带参;成员方法:get/set方法,吃饭();
-
定义具体猫类(Cat),继承动物类,实现跳高接口;
构造方法:无参,带参;成员方法:重写吃饭(),重写跳高();
-
定义狗类(Dog),继承动物类,实现跳高接口;(略)
-
定义测试类,写代码测试。
代码实现:
Jumpping接口
public interface Jumpping { void jump(); }
Animal类:
public abstract 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 abstract void eat(); }
Cat类:
public class Cat extends Animal implements Jumpping{ public Cat() { } public Cat(String name, int age) { super(name, age); } @Override public void eat() { System.out.println("猫吃鱼"); } @Override public void jump() { System.out.println("猫可以跳高"); } }
Dog类:
public class Dog extends Animal implements Jumpping{ public Dog() { } public Dog(String name, int age) { super(name, age); } @Override public void eat() { System.out.println("狗吃骨头"); } @Override public void jump() { System.out.println("狗可以跳高"); } }
AnimalDemo类(测试类):
//测试类 public class AnimalDemo { public static void main(String[] args) { Jumpping jumpping_C = new Cat(); jumpping_C.jump(); System.out.println("---------"); Animal animal=new Cat(); animal.setAge(17); animal.setName("加菲"); System.out.println(animal.getName()+","+animal.getAge()); animal.eat(); ((Cat)animal).jump(); System.out.println("---------"); Cat cat = new Cat("加菲",17); System.out.println(cat.getName()+","+cat.getAge()); cat.eat(); cat.jump(); } }
运行结果(拿猫类举例子):
-
-