zoukankan      html  css  js  c++  java
  • java28

    快捷键:
    'ctrl' + '+',放大代码
    ‘ctrl' + '-',缩小代码

    1.使用多态的优点
    把要创建的多个子类缩减为一个父类接着传入参数,用参数调用子类的方法,
    输出时直接调用父类的方法,这时传参传创建的对象

    class Animal{
    	void eat() {
    		System.out.println("动物吃东西");
    	}
    }
    
    class cat extends Animal{
    	void eat() {
    		System.out.println("猫吃鱼");
    	}
    }
    class dog extends Animal{
    	void eat() {
    		System.out.println("狗吃骨头");
    	}
    }
    class Person{
    	void feedAnimal(cat c) {
    		c.eat();
    	}
            void feedAnimal(dog d) {
    		d.eat();
    	}
    ··········
    若要喂一百只动物,则需要写一百个方法。
    }
    public class 多态 {
    	
    public static void main(String[] args) {
    	cat c = new cat();
    	dog d = new dog();
    	Person per = new Person();
    	per.feedAnimal(c);
            per.feedAnimal(d);
    }
    }
    【
    猫吃鱼
    狗吃骨头
    】
    
    class Animal{
    	void eat() {
    		System.out.println("动物吃东西");
    	}
    }
    class cat extends Animal{
    	void eat() {
    		System.out.println("猫吃鱼");
    	}
    }
    class dog extends Animal{
    	void eat() {
    		System.out.println("狗吃骨头");
    	}
    }
    class Person{
    	void feedAnimal(Animal anim) {
    		anim.eat();
    	}
    使用多态后,只需要写一个方法
    }
    public class 多态 {
    	
    public static void main(String[] args) {
    	Animal c = new cat();
            dog d = new dog();
    	Person per = new Person();
    	per.feedAnimal(c);
            per.feedAnimal(d);
    }
    }
    【
    猫吃鱼
    狗吃骨头
    】
    

    2.多态方法的调用
    在父类的方法前加static后,会默认调用父类的方法(原因:static修饰的内容会随着
    字节码的加载而加载,不会去考虑后来创建的对象)

    3.类的强制类型转换
    把父类对象所属类型强制转换成子类类型

    4.instanceof:判断一个对象是否属于指定的类

    class Animal{
    	void eat() {
    		System.out.println("动物吃东西");
    	}
    }
    class cat extends Animal{
    	void eat() {
    		System.out.println("猫吃鱼");
    	}
    	void dowork() {
    		System.out.println("逮老鼠");
    	}
    }
    class dog extends Animal{
    	void eat() {
    		System.out.println("狗吃骨头");
    	}
    	void dowork() {
    		System.out.println("汪汪汪");
    	}
    }
    class Person{
    	void feedAnimal(Animal anim) {
    		anim.eat();
    	}
    	void dowork(Animal anim) {
    		if(anim instanceof dog) {       //判断这个参数是否属于狗类
    			dog d=(dog)anim;        //类的强制类型转换(父类中并没有dowork这个方法)
    			d.dowork();
    		}else if(anim instanceof cat) {
    			cat c=(cat)anim;
    			c.dowork();
    		}
    	}
    }
    public class 多态 {
    	
    public static void main(String[] args) {
    	Animal c = new cat();
        dog d = new dog();
    	Person per = new Person();
        per.feedAnimal(d);
        per.dowork(d);
        per.feedAnimal(c);
    	per.dowork(c);
        
    }
    

    5.多态中,字段类型是跟随创建对象时前面的对象类型

    eg:
    class sub{
        String name  = "ss";
        void a(){
        	System.out.println("sub-1");
        }
    }
    class sup extends sub{
    	String name = "qq";
    	void a(){
    		System.out.println("sup-2");
    	}
    }
    public class 多态2 {
    	public static void main(String[] args) {
    	sub u = new sup();         //u使用name这个字段的时候,会选择调用父类sub的
    	u.a();
    	System.out.println(u.name);
    	}
    }
    【sup-2
    ss】
    

    2.封装小练习(一个问题两种方法)

    • 创建学生类
      创建成员变量:name,age
      构造类:无参,两个参数
      使用getset方法
      show展示和toString展示成员变量
    法一:构造器中传参
    class Stu{
    	private int age;
    	private String name;
    	Stu(String name,int age){
    		this.name = name;
    		this.age = age;
    	}
    void show(){
    		System.out.print(name+" ");
    		System.out.print(age);
    		System.out.println();
    	}
    }
    public class 封装练习 {
    public static void main(String[] args) {
    	Stu student2 = new Stu("lx",18);
    	student2.show();
    }
    }
    【lx 18】
    
    法二:采用getset方法使字段能让外界使用
    class Stu{
    	private int age;
    	private String name;
    //默认存在Stu(){ }这个构造器
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	void show(){
    		System.out.print(name+" ");
    		System.out.print(age);
    		System.out.println();
    	}
    	
    }
    public class 封装练习 {
    public static void main(String[] args) {
    Stu student1 = new Stu();
    	student1.setName("hh");
    	student1.setAge(17);
    	student1.show();
    }
    }
    【hh 17】
    
    • 封装长方形的周长和面积
    法一:构造器传参
    class Rect{
    	private int lon;
    	private int height;
    	Rect(int lon,int height){
    		this.lon = lon;
    		this.height = height;
    	}
    	
    	void area() {
    		System.out.println(lon*height);
    	}
    	void c() {
    		System.out.println((lon+height)*2);
    	}
    	
    }
    public class 封装练习2 {
    public static void main(String[] args) {
    	Rect r = new Rect(4,5);
    	r.area();
    	r.c();
    }
    }
    
    法二:采用getset方法使字段能让外界使用
    class Rect{
    	private int lon;
    	private int height;
    	public int getLon() {
    		return lon;
    	}
    	public void setLon(int lon) {
    		this.lon = lon;
    	}
    	public int getHeight() {
    		return height;
    	}
    	public void setHeight(int height) {
    		this.height = height;
    	}
    	void area() {
    		System.out.println(lon*height);
    	}
    	void c() {
    		System.out.println((lon+height)*2);
    	}
    	
    }
    public class 封装练习2 {
    public static void main(String[] args) {
    	Rect r = new Rect();
    	r.setLon(4);
    	r.setHeight(5);
    	r.area();
    	r.c();
    }
    }
    
    改进后:保证了数据的合理性。(将getset方法结合构造器传参使用)
    使用private将数据保护起来,内部提供getset方法,检验输入得数据是否合理
    class Rect{
    	private int lon;
    	private int height;
    	Rect(int lon,int height){
    		this.setLon(lon);
    		this.setHeight(height);
    	}
    	public int getLon() {
    		return lon;
    	}
    	public void setLon(int lon) {
    		if(lon <= 0) {
    			System.out.println("输入有误");
    			return;
    		}
    		this.lon = lon;
    	}
    	public int getHeight() {
    		return height;
    	}
    	public void setHeight(int height) {
    		if(height <= 0) {
    			System.out.println("输入有误");
    			return;
    		}
    		this.height = height;
    	}
    	void area() {
    		System.out.println(lon*height);
    	}
    	void c() {
    		System.out.println((lon+height)*2);
    	}
    	
    }
    public class 封装练习2 {
    public static void main(String[] args) {
    	Rect r = new Rect(4,5);
    	r.area();
    	r.c();
    }
    }
    
  • 相关阅读:
    对用户控件(ascx)属性(property)赋值
    The Controls collection cannot be modified because the control contains code blocks (i.e. <% ... %>).
    图片淡入淡出切换效果
    在用户控件(ASCX)创建用户控件(ASCX)
    Login failed for user 'xxx'
    一些较好的书
    儿子购买的书
    怀念以前做网管的日子
    Linux下selinux简单梳理
    Rsync同步时删除多余文件 [附:删除大量文件方法的效率对比]
  • 原文地址:https://www.cnblogs.com/-zero/p/10362589.html
Copyright © 2011-2022 走看看