###继承:
package com.shiyan; public class Animal { public int legNum; //动物四肢的数量 //类方法 public void bark() { System.out.println("动物叫!"); } } package com.shiyan; public class Dog extends Animal { public void bark(){ System.out.println(“汪汪汪!”); } } class Test{ public static void main(String[] args) { Animal a = new Animal(); // Animal 对象 Dog d = new Dog(); // Dog 对象 Animal b = new Dog(); // Dog 对象,向上转型为Animal类型 a.bark();// 执行 Animal 类的方法 d.bark();//执行 Dog 类的方法 b.bark();//执行 Dog 类的方法 } }
###多态(它的前提是继承,一般至少两个类)
一、对象的多种形态
1.引用多态
父类的引用可以指向本类的对象
父类的引用可以指向子类的对象
2.方法多态
创建本类对象时,调用的方法为本类的方法。
创建子类对象时,调用的方法为子类的重写方法或继承的方法。
package OOP; public class Animal { public void eat(){ System.out.println("动物吃东西"); } } package OOP; public class Dog extends Animal{ public void eat(){ System.out.println("狗吃肉!"); } public void watchDoor(){ System.out.println("狗看门!"); } } package OOP; public class Cat extends Animal{ } package OOP; public class Inital { public static void main(String[] args) { Animal obj1=new Animal(); //同一个类的引用既可以指向本类,也可以指向子类 Animal obj2=new Dog(); //......,可以指向子类 //Dog obj3=new Animal();不可以子类引用指向父类对象 Animal obj4=new Cat(); obj1.eat(); obj2.eat(); //obj2.watchDoor(); 多态,测试类中不可以调用子类独有的方法 obj4.eat(); } }
二、引用类型转换
1.向上类型转换(隐式、自动类型转换),是小类型到大类型的转换(安全的)
2.向下类型转换(强制类型转换),是大类型到小类型的转换(不安全的,可能会溢出)
3.instanceof运算符,来解决引用对象的类型,避免数据类型转换的安全性问题。
package OOP; public class Inital { public static void main(String[] args) { Dog dog=new Dog();//创建dog对象空间 Animal animal=dog;//自动类型提升 向上类型转换 //可以编译通过,可以类型转换 if(animal instanceof Dog){ Dog dog2=(Dog)animal;//向下类型转换,强制类型转换 }else{ System.out.println(“无法进行类型转换!转换成Dog类型”); } //编译无法通过,不可以类型转换 if(animal instanceof Cat){ Cat cat=(Dog)animal;//1.编译时,Cat类型 2.运行时 Dog类型 因为之前开辟的是dog空间 }else{ System.out.println(“无法进行类型转换!转换成Cat类型”); } } }
————————————————————————————————————
###Java中的方法内部类
特点:方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见。
package OOP; /*方法内部类要创建对象才可以调用*/ public class MOuter { //外部类中的方法 public void show(){ final int a=25; int b=13; //方法内部类 class MInner{ int c=2; public void print(){ System.out.println("访问外部类的方法中的常量:"+a); System.out.println("访问内部类中的变量:"+c); } } /**由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问 控制符和 static 修饰符。*/ //必须创建对象才可以调用内部类中方法 MInner mi=new MInner(); mi.print(); } public static void main(String[] args) { MOuter mo=new MOuter(); mo.show(); } }
练习:package OOP;
//外部类 public class HelloWorld { private String name="爱慕课"; //外部类show方法 public void show(){ //定义方法内部类 class MInner{ int score=83; public int getScore(){ return score+10; } } //创建方法内部类的对象 MInner mi=new MInner(); //调用内部类的方法 mi.getScore(); }
//测试方法内部类 public static void main(String[] args) { //创建外部类的对象 HelloWorld mo=new HelloWorld(); //调用外部类的方法 mo.show(); } }
HashMap用法练习:
package CollectionExercise; import java.util.HashMap; import java.util.Scanner; /* 目的:练习HashMap的用法 要求:依据用户名找到对应的电话号码。 */ public class PhoneBookByMap { public static void main(String[] args) { //创建一个HashMap对象,名称为phonebook,键值对的类型均为String HashMap<String,String> phonebook=new HashMap<String,String>(); //创建扫描器scan用于获取用户输入 Scanner scan=new Scanner(System.in); //创建一个名为keyword的字符串用于存放用户输入的关键词 String keyword=new String(); //利用自己的initPhoneBook方法为电话簿装入数据,完成其初始化 phonebook=initPhoneBook(phonebook); //提示用户输入待查询的姓名 打印输出 System.out.println("Input a name that you want to search :"); //将用户的输入信息装入字符串keyword中 keyword=scan.nextLine(); while(keyword!=null){ System.out.println("input a name:"); keyword=scan.nextLine(); } //若用户输入某个关键词,则按照关键词在phonebook中查找其对应的号码 System.out.println("The result is:"); System.out.println(queryPhone(phonebook,keyword)); scan.close(); } /**该方法用于HashMap的初始化,为了装入一些号码数据,也可以定义这些数据*/ private static HashMap<String,String> initPhoneBook(HashMap<String,String> phonebook){ phonebook.put("shi","1343432545"); phonebook.put("cmx","1645764756"); phonebook.put("ywy","1432543534"); return phonebook; } private static String queryPhone(HashMap<String, String> phonebook, String keyword) { //创建存放结果的字符串result String result=new String(); /**用get方法查询keyword所对应的电话号码,并赋值给result * put()方法中,参数为关键词key,返回值为其对应的value,未找到对应值时候,返回为空。*/ result = phonebook.get(keyword); //如果未找到用户的电话号码,则将查询的结果修改为未找到该用户 if(result==null){ return "not find this user. "; } //返回查询结果 return result; } }
#方法的调用和参数的传递
/*练习:方法的调用 目的:计算两科的平均分 */ public class PrintScore{ public static void main(String[] args) { PrintScore a=new PrintScore(); double avgScore=0.0; int s1=20,s2=30; int c=s1+s2; System.out.println("s1+s2="+c); avgScore=a.compterScore(89,91); System.out.println(avgScore); } /*实参往形参传递*/ public int compterScore(int s1,int s2){ int avgScore=(s1+s2)/2; return avgScore; } }
说明:项目很重要, 复习项目比复习知识点效果好些,进步大些。