Java 学习 第三篇;面向对象
1:Java的常用包;
核心类在java 包中;扩展类在javax包中
java.lang 系统默认自动导入 包含String Math System Thread等类
java.util 包含了工具类接口和集合框架类 如Arrays List Set
java.net java.io java .text java.sql
java.awt 抽象窗口工具集 Abstract Window Toolkits
java.swing 包含Swing图形用户界面编程的相关类和接口用于构建和平台无关的GUI程序;
2:构造器
构造器是一个特殊的方法用于创建类的实例;构造器的最大用处就是创建对象的时候进行初始化基本类型的初始化属性为0 boolean为false 引用类型属性设置为null;
另外,构造器也可以重载;
public class Fruit
{
public String name;
public String color;
public double weight;
//constructor A
public Apple()
{
}
//constructor B
public Apple(String name , String color)
{
this.name = name;
this.color = color;
}
//constructor C
public Apple(String name , String color , double weight)
{
//通过this调用另一个重载的构造器的初始化代码
this(name , color);
//下面this引用该构造器正在初始化的Java对象
this.weight = weight;
}
}
3:类的继承
一个关于sb的例子
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class sb { 2 3 /** 4 * @param args 5 */ 6 7 public String name; 8 public int age; 9 public void say(String content) 10 { 11 System.out.println(content); 12 13 } 14 15 } 16 17 public class Sb_of_man extends sb { 18 public String quxiang; 19 public Sb_of_man(String quxiang) 20 { 21 this.quxiang=quxiang; 22 } 23 public static void main(String[] args) 24 { 25 Sb_of_man one =new Sb_of_man("W"); 26 one.say("I like "+one.quxiang); 27 } 28 29 }
output:
I like W
子类会继承父类的所有属性和方法;Java中每个类最多只有一个直接父类,注意是直接父类;
4:子类重写父类的方法;因为父类的某些方法可能不适用一些具体而特殊的子类这时候就要对其重写;比如鸵鸟不会飞但是它继承的鸟这个父类中默认鸟都是会飞的;
重写父类要遵循的原则:
方法名相同,参数表相同
返回值类型比父类返回值类型更小或者相等
子类方法的访问权限比父类方法更大或者相等
重写的方法如果是类方法那就一定是类方法不要乱用实例方法覆盖类方法这样是错误的。
如下示例不符合原则
class BaseClass
{
public static void test(){....}
___________
}
class SubClass
{
public void test(){.....}
___________
}
另外 如果父类中方法被覆盖之后子类则无法访问,如果访问需要使用super关键字
如果父类中方法被关键字private修饰则该方法对子类隐藏,子类无法使用,无法重写,无法访问,这样的话就无所谓重写喽;
5:super super和this一样,都不能出现在static的方法中,Cannot use super in a static context
super是直接父类对象的默认引用,注意哦 是父类对象不是父类,很有区别;
Java程序创建一个类的对象的时,系统会隐式的创建一个该父类的对象,只要有一个子类对象存在则一定存在一个与之对应的父类对象
6:调用父类构造器
构造器不能继承;如果父类中自定义了构造器,那么子类中如果使用必须显式调用父类构造器,否则编译出错,如果没有自定义构造器那么默认即可;(这点要注意!)
可参考 http://www.knowsky.com/369673.html 所言:假如自定义了构造器,那么默认构造器将不存在! 似乎这样解释来算是对的吧
http://www.blogjava.net/weidagang2046/articles/3430.html
当调用子类构造器来初始化子类对象时,父类构造器总是会在子类构造器之前执行;以此创建人和java对象总是最先执行java.lang.Object类的构造器;
示例如下:
class Creature
{
public Creature()
{
System.out.println("Creature无参数的构造器");
}
}
class Animal extends Creature
{
public Animal(String name)
{
System.out.println("Animal带一个参数的构造器,该动物的name为" + name);
}
public Animal(String name , int age)
{
//使用this调用同一个重载的构造器
this(name);
System.out.println("Animal带2个参数的构造器,其age为" + age);
}
}
public class Wolf extends Animal
{
public Wolf()
{
//显式调用父类有2个参数的构造器
super("土狼", 3);
System.out.println("Wolf无参数的构造器");
}
public static void main(String[] args)
{
new Wolf();
}
}
output:
Creature无参数的构造器
Animal带一个参数的构造器,该动物的name为土狼
Animal带2个参数的构造器,其age为3
Wolf无参数的构造器
7:多态 Polymorphism
java引用变量有两个类型一个是编译时类型一个是运行是类型;编译时类型由声明时候的类型决定,运行时候类型有实际赋值给该变量的对象决定;如果编译时类型和运行时不同则出现多态;
另外系统总是试图访问它编译时类所定义的属性而不是运行时类所定义的属性。
8:引用类型的强制类型转换;
最好用instanceof来进行判断是否能进行强制类型转换,
把子类对象赋给父类引用变量被称为向上转化;总可以成功;
反过来需要强制类型转换,最好用instanceof运算符进行判断;Instance (例子、实例)
示例:
Object hello="hello";
if(hello instanceof String)
String str=(String) hello;