面向对象的简单理解一

面向对象的特征:封装(private)继承(extends) 多态

继承:子类扩展父类的功能并将父类的操作都继承下来。允许多层继承,

  • 子类只允许继承父类的公有方法和公有成员
  • 父类的私有方法和成员需要间接才能访问

如用直接用name则不行 需用getName

ContractedBlock.gif ExpandedBlockStart.gif Code
class A
{
    
private String name ;
    
public void setName(String name)
    {
        
this.name = name ;
    }
    
public String getName()
    {
        
return this.name ;
    }
};
class B extends A
{
    
public void say()
    {
        System.out.println(getName()) ;
    }
};
  • 子类对象实例化时,先默认调用父类的无参构造函数(默认隐含了一个super()方法);子类对象实例化-----父类的无参构造函数-----子类的无参构造函数
ContractedBlock.gif ExpandedBlockStart.gif Code
package com.miao.demo6;
class A
{
    
public A()
    {
        System.out.println(
"1、public A(){}") ;
    }
};
class B extends A
{
    
public B()
    {
        
// 此处隐含了一段代码
        super() ;
        System.out.println(
"2、public B(){}") ;
    }
};
public class OODemo06
{
    
public static void main(String args[])
    {
        B b 
= new B() ;
    }
};
  • 方法的覆写:子类覆写父类方法时不能拥有比父类更严格的方法,方法名都一样,参数也一样,子类调用的永远是覆写后的方法
ContractedBlock.gif ExpandedBlockStart.gif Code
class A
{
    
void fun1()
    {
        System.out.println(
"* 1、A --> public void fun1()") ;
    }
};
class B extends A
{
    
public void fun1()
    {
        System.out.println(
"* 2、B --> public void fun1()") ;
    }
};
public class OODemo07
{
    
public static void main(String args[])
    {
        B b 
= new B() ;
        b.fun1() ;
    }
};

权限:

  1. public
  2. default
  3. private只能在一个类中
  • 重载与覆写的区别:

重载:方法名称相同,参数的类型或个数不同,是发生在同一个类中 覆写:方法名称相同,访问权限最好相同参数的类型或个数一样,在子类中实现

  • 可以通过super(),根据参数来来调用父类的构造方法。默认是无参的。
  • 通过super().方法可以调用被子类覆写的方法。
ContractedBlock.gif ExpandedBlockStart.gif Code
class A
{
    
public String say()
    {
        
return "hello" ;
    }
};
class B extends A
{
    
public String say()
    {
        
return super.say()+" world!!" ;
    }
};

public class OODemo09
{
    
public static void main(String args[])
    {
        System.out.println(
new B().say()) ;
    }
};

this与super的概念:

 

ContractedBlock.gif ExpandedBlockStart.gif Code class A {     String name = "MIAO" ;     public String say()     {         return "hello" ;     } }; class B extends A {     String name = "zhxiaomiao" ;     public B()     {         super() ;         System.out.println("HELLO") ;             }     public String say()     {         return super.say()+" world!! --> "+super.name ;     } }; public class OODemo10 {     public static void main(String args[])     {         System.out.println(new B().say()) ;     } };

 

可以看到在super()的构造方法必须在首行,因为子类构造函数初试化之前先调用父类的构造函数。

看下完整的继承:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
class Person
{
    
// 先设计好一个完整的Person类
    private String name ;
    
private int age ;

    
public Person(String name,int age)
    {
        
this.setName(name) ;
        
this.setAge(age) ;
    }

    
public void setName(String name)
    {
        
this.name = name ;
    }
    
public void setAge(int age)
    {
        
this.age = age ;
    }
    
public String getName()
    {
        
return this.name ;
    }
    
public int getAge()
    {
        
return this.age ;
    }
    
public String say()
    {
        
return "姓名:"+this.name+",年龄:"+this.age ;
    }
};

class Student extends Person
{
    
private String school ;
    
public Student(String name,int age,String school)
    {
        
super(name,age) ;
        
this.setSchool(school) ;
    }
    
public void setSchool(String school)
    {
        
this.school = school ;
    }
    
public String getSchool()
    {
        
return this.school ;
    }
    
public String say()
    {
        
return super.say()+",学校:"+this.school ;
    }
};
public class OODemo11
{
    
public static void main(String args[])
    {
        Student s 
= new Student("张三",30," 人才培养基地") ;
        System.out.println(s.say()) ;
    }
};

例子:

 

 

ContractedBlock.gif ExpandedBlockStart.gif Code
// 为了代码的简单,程序暂时不封装
class Employee
{
    String name ;
    
int age ;
    
float salary ;
    
// 表示一个雇员有一个领导
    Manager mgr = null ;
    
public Employee(String name,int age,float salary)
    {
        
this.name = name ;
        
this.age = age ;
        
this.salary = salary ;
    }
    
public String say()
    {
        
return "姓名:"+this.name+",年龄:"+this.age+",薪水:"+this.salary ;
    }
};

class Manager extends Employee
{
    
// 管理的人员数
    int number ;
    
public Manager(String name,int age,float salary,int number)
    {
        
super(name,age,salary) ;
        
this.number = number ;
    }
    
public String say()
    {
        
return super.say()+",管理人员数:"+this.number ;
    }
};

public class OODemo12
{
    
public static void main(String args[])
    {
        Employee e 
= new Employee("李四",20,15000) ;
        Manager m 
= new Manager("张三",30,3000,5) ;
        
// m是e的领导
        e.mgr = m ;
        System.out.println(
"雇员信息:"+e.say()) ;
        
// 为了防止mgr的内容为空,如果为空则肯定出现NullPointerException
        if(e.mgr!=null)
        {
            System.out.println(
"经理信息:"+e.mgr.say()) ;
        }
    }
};

 

 

转载于:https://www.cnblogs.com/zhxiaomiao/archive/2009/03/12/1409987.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值