谈谈对面向对象编程的认识

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ttxs62825/article/details/52105209

面向对象编程有三大特性:封装性、继承性、多态性。


1,所谓的面向对象就是将我们的程序模块化、对象化,把具体事物的特性属性和通过这些属性来实现一些动作的具体方法放到一个类里面,这就是封装。


实例代码如下:

class Person{
	private String name;          //声明姓名属性
	private int age;              //声明年龄属性
	public void tell(){
		System.out.println("姓名"+getName()+",年龄:"+getAge());
	}
	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 class Test002 {

	public static void main(String[] args) {
		
		Person person = new Person();      //声明并实例化对象
		person.setName("王二");            //调用setter设置姓名
		person.setAge(20);                 //调用setter设置年龄
		person.tell();                     //输出信息
		
	}
	
}
程序运行结果:

姓名王二,年龄:20

2,继承有点类似于我们生物学上的遗传,就是子类的一些特征是来源于父类的,儿子遗传了父亲和母亲的一些性格,或者相貌等。

 面向对象里的继承也就是父类的相关的属性,可以被子类重复使用,子类不必再在自己的类里面重新定义一回,父类里有点我们只要拿过来用就好了。而对于自己类里面需要用到的新的属性和方法,子类就可以自己来扩展了。当然,会出现一些特殊情况,就是我们在有一些方法在父类已经定义好了,但是子类我们自己再用的时候,发现了问题。比如,我们的虽然都是计算工资的,但是普通员工的工资计算方法跟经理的计算方法是不一样的,所以这个时候,我们就不能直接调用父类的这个计算工资的方法了。

实例代码如下:
class Person{                     //定义Person类
	private String name;          //定义name属性
	private int age;              //定义age属性
	
	public String getName() {                //取得name属性
		return name;
	}
	public void setName(String name) {       //设置name属性 
		this.name = name;
	}
	public int getAge() {                    //取得age属性
		return age;
	}
	public void setAge(int age) {            //设置age属性
		this.age = age;
	}
	
}

class Student extends Person{               //Student是Person的子类
	//该处任何代码都不编写
}


public class Test003 {

	public static void main(String[] args) {
		
		Student student = new Student();
		student.setName("王二");            //调用setter设置姓名
		student.setAge(30);                 //调用setter设置年龄
		System.out.println("姓名:"+student.getName()+",年龄:"+student.getAge());

	}
	
}
程序运行结果:
姓名:王二,年龄:30

3,这个时候我们就需要用到面向对象的另一个特性:多态性。我们要在子类里面把父类里面定义计算工资的方法在子类里面重新实现一遍。多态包含了重载和重写。重写很简单就是把子类从父亲类里继承下来的方法重新写一遍,这样,父类里相同的方法就被覆盖了,当然啦,你还是可以通过super.CaculSalary方法来调用父类的工资计算方法。而重载就是类里面相同方法名,不同形参的情况,可以是形参类型不同或者形参个数不同,或者形参顺序不同,但是不能使返回值类型不同。

实例代码如下:
class Person{
	public void fun1(){
		System.out.println("---fun1()我是来自父类的Person");
	}
	public void fun2(){
		System.out.println("---fun2()我是来自父类的Person");
	}
	
}
//Student类扩展自Person类,也就继承了Person类中的fun1()、fun2()方法
class Student extends Person{
	//在这里覆盖了Person类中的fun1()方法
	public void fun1(){
		System.out.println("---fun1()我是来自子类的Student");
	}
	public void fun3(){
		System.out.println("---fun3()我是来自子类的Student");
	}
	
}
public class Poly {

	public static void main(String[] args) {
		//此处父类对象由子类实例化
		Person p = new Student();
		//调用fun1()方法,观察此处调用时哪个类里的fun1()方法
		p.fun1();
		p.fun2();	
	}
}

程序运行结果:
---fun1()我是来自子类的Student
---fun2()我是来自父类的Person







展开阅读全文

谈谈对ThreadLocal的认识

08-03

今天一上午都在网上搜索有关ThreadLocal的文章,刚开始看到的几篇文章都说ThreadLocal不是解决数据共享的,这点给我很大的困扰,导致后面都快有点走火入魔了。其实我觉得ThreadLocal就是解决数据共享的,多线程对数据并发访问的问题,只是它和synchronized对解决数据共享的方式不同,更重要的一点是他们作用的对象不同。rn ThreadLocal是以空间换时间来解决数据共享,synchronized是以时间换空间来解决数据共享的问题。rn ThreadLocal作用的对象是这个对象被多个线程使用,其他线程对这个对象的状态会产生改变,但是正在使用的线程不希望其他线程对这个对象做出的改变而影响自己对这个对象的使用,最典型的是Coonnection对象,一个线程正在使用Coonection对数据库进行操作,而另外的线程却将Coonection对象给关闭了,这就会产生问题,所以就可以用到ThreadLocal,为每一个线程分配一个Coonection对象。synchronized作用的对象是这个对象被多个线程使用,其他线程对这个对象的状态会产生改变,正在使用的线程需要其他线程对这个对象做出改变,但这种改变是在一定规则一下进行的,而不是随意来改动的,就会用到synchronized。rn 最后想说的是ThreadLocal是用来解决数据共享的,还有一个要是知道ThreadLocal主要作用的场景,在什么情况下使用,这样反过来对ThreadLocal的理解就不难了。rn 最后欢迎大家的板砖,真理不辩不明。[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/4.gif][/img] 论坛

没有更多推荐了,返回首页